[
  {
    "path": ".gitigonre",
    "content": "\n\n\n# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore\n\n## Build generated\nbuild/\nDerivedData/\n\n## Various settings\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata/\n\n## Other\n*.moved-aside\n*.xccheckout\n*.xcscmblueprint\n\n## Obj-C/Swift specific\n*.hmap\n*.ipa\n*.dSYM.zip\n*.dSYM\n\n## Playgrounds\ntimeline.xctimeline\nplayground.xcworkspace\n\n# Swift Package Manager\n#\n# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.\n# Packages/\n# Package.pins\n# Package.resolved\n.build/\n\n# CocoaPods\n#\n# We recommend against adding the Pods directory to your .gitignore. However\n# you should judge for yourself, the pros and cons are mentioned at:\n# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control\n#\n# Pods/\n\n# Carthage\n#\n# Add this line if you want to avoid checking in source code from Carthage dependencies.\n# Carthage/Checkouts\n\nCarthage/Build\n\n# fastlane\n#\n# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the\n# screenshots whenever they are needed.\n# For more information about the recommended setup visit:\n# https://docs.fastlane.tools/best-practices/source-control/#source-control\n\nfastlane/report.xml\nfastlane/Preview.html\nfastlane/screenshots\nfastlane/test_output\n\n"
  },
  {
    "path": "Podfile",
    "content": "# Uncomment the next line to define a global platform for your project\n# platform :ios, '9.1'\n\ntarget 'RxXMLY' do\n    use_frameworks!\n    \n    # Architecture\n    pod 'ReactorKit'\n    \n    # Networking\n    pod 'Alamofire'\n    pod 'Moya'\n    pod 'Kingfisher'\n    pod 'ObjectMapper'\n    pod 'SwiftyJSON'\n\n    # Rx\n    pod 'RxSwift',          '~> 4.0'\n    pod 'RxCocoa'\n    pod 'RxAlamofire'\n    pod 'RxDataSources',    '~> 3.0'\n    pod 'NSObject+Rx'\n    pod 'RxGesture'\n\n    # UI\n    pod 'SnapKit'\n    pod 'TYCyclePagerView'\n    pod 'TYPagerController'\n    pod 'MJRefresh'\n\n    # Logging\n    \n    # Misc.\n    pod 'IQKeyboardManagerSwift'\n    pod 'Then'\n    pod 'ReusableKit'\n    pod 'SwiftyColor'\n#    pod 'MLeaksFinder'              # 检测内存泄漏\n    pod 'URLNavigator'\n    pod 'TTRangeSlider'\n\n    # SDK\n    \nend\n\n"
  },
  {
    "path": "Pods/Alamofire/LICENSE",
    "content": "Copyright (c) 2014-2017 Alamofire Software Foundation (http://alamofire.org/)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "Pods/Alamofire/README.md",
    "content": "![Alamofire: Elegant Networking in Swift](https://raw.githubusercontent.com/Alamofire/Alamofire/master/alamofire.png)\n\n[![Build Status](https://travis-ci.org/Alamofire/Alamofire.svg?branch=master)](https://travis-ci.org/Alamofire/Alamofire)\n[![CocoaPods Compatible](https://img.shields.io/cocoapods/v/Alamofire.svg)](https://img.shields.io/cocoapods/v/Alamofire.svg)\n[![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)\n[![Platform](https://img.shields.io/cocoapods/p/Alamofire.svg?style=flat)](https://alamofire.github.io/Alamofire)\n[![Twitter](https://img.shields.io/badge/twitter-@AlamofireSF-blue.svg?style=flat)](http://twitter.com/AlamofireSF)\n[![Gitter](https://badges.gitter.im/Alamofire/Alamofire.svg)](https://gitter.im/Alamofire/Alamofire?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)\n\nAlamofire is an HTTP networking library written in Swift.\n\n- [Features](#features)\n- [Component Libraries](#component-libraries)\n- [Requirements](#requirements)\n- [Migration Guides](#migration-guides)\n- [Communication](#communication)\n- [Installation](#installation)\n- [Usage](#usage)\n    - **Intro -** [Making a Request](#making-a-request), [Response Handling](#response-handling), [Response Validation](#response-validation), [Response Caching](#response-caching)\n\t- **HTTP -** [HTTP Methods](#http-methods), [Parameter Encoding](#parameter-encoding), [HTTP Headers](#http-headers), [Authentication](#authentication)\n\t- **Large Data -** [Downloading Data to a File](#downloading-data-to-a-file), [Uploading Data to a Server](#uploading-data-to-a-server)\n\t- **Tools -** [Statistical Metrics](#statistical-metrics), [cURL Command Output](#curl-command-output)\n- [Advanced Usage](#advanced-usage)\n\t- **URL Session -** [Session Manager](#session-manager), [Session Delegate](#session-delegate), [Request](#request)\n\t- **Routing -** [Routing Requests](#routing-requests), [Adapting and Retrying Requests](#adapting-and-retrying-requests)\n\t- **Model Objects -** [Custom Response Serialization](#custom-response-serialization)\n\t- **Connection -** [Security](#security), [Network Reachability](#network-reachability)\n- [Open Radars](#open-radars)\n- [FAQ](#faq)\n- [Credits](#credits)\n- [Donations](#donations)\n- [License](#license)\n\n## Features\n\n- [x] Chainable Request / Response Methods\n- [x] URL / JSON / plist Parameter Encoding\n- [x] Upload File / Data / Stream / MultipartFormData\n- [x] Download File using Request or Resume Data\n- [x] Authentication with URLCredential\n- [x] HTTP Response Validation\n- [x] Upload and Download Progress Closures with Progress\n- [x] cURL Command Output\n- [x] Dynamically Adapt and Retry Requests\n- [x] TLS Certificate and Public Key Pinning\n- [x] Network Reachability\n- [x] Comprehensive Unit and Integration Test Coverage\n- [x] [Complete Documentation](https://alamofire.github.io/Alamofire)\n\n## Component Libraries\n\nIn order to keep Alamofire focused specifically on core networking implementations, additional component libraries have been created by the [Alamofire Software Foundation](https://github.com/Alamofire/Foundation) to bring additional functionality to the Alamofire ecosystem.\n\n- [AlamofireImage](https://github.com/Alamofire/AlamofireImage) - An image library including image response serializers, `UIImage` and `UIImageView` extensions, custom image filters, an auto-purging in-memory cache and a priority-based image downloading system.\n- [AlamofireNetworkActivityIndicator](https://github.com/Alamofire/AlamofireNetworkActivityIndicator) - Controls the visibility of the network activity indicator on iOS using Alamofire. It contains configurable delay timers to help mitigate flicker and can support `URLSession` instances not managed by Alamofire.\n\n## Requirements\n\n- iOS 8.0+ / macOS 10.10+ / tvOS 9.0+ / watchOS 2.0+\n- Xcode 8.3+\n- Swift 3.1+\n\n## Migration Guides\n\n- [Alamofire 4.0 Migration Guide](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%204.0%20Migration%20Guide.md)\n- [Alamofire 3.0 Migration Guide](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%203.0%20Migration%20Guide.md)\n- [Alamofire 2.0 Migration Guide](https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%202.0%20Migration%20Guide.md)\n\n## Communication\n\n- If you **need help**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/alamofire). (Tag 'alamofire')\n- If you'd like to **ask a general question**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/alamofire).\n- If you **found a bug**, open an issue.\n- If you **have a feature request**, open an issue.\n- If you **want to contribute**, submit a pull request.\n\n## Installation\n\n### CocoaPods\n\n[CocoaPods](http://cocoapods.org) is a dependency manager for Cocoa projects. You can install it with the following command:\n\n```bash\n$ gem install cocoapods\n```\n\n> CocoaPods 1.1+ is required to build Alamofire 4.0+.\n\nTo integrate Alamofire into your Xcode project using CocoaPods, specify it in your `Podfile`:\n\n```ruby\nsource 'https://github.com/CocoaPods/Specs.git'\nplatform :ios, '10.0'\nuse_frameworks!\n\ntarget '<Your Target Name>' do\n    pod 'Alamofire', '~> 4.5'\nend\n```\n\nThen, run the following command:\n\n```bash\n$ pod install\n```\n\n### Carthage\n\n[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks.\n\nYou can install Carthage with [Homebrew](http://brew.sh/) using the following command:\n\n```bash\n$ brew update\n$ brew install carthage\n```\n\nTo integrate Alamofire into your Xcode project using Carthage, specify it in your `Cartfile`:\n\n```ogdl\ngithub \"Alamofire/Alamofire\" ~> 4.5\n```\n\nRun `carthage update` to build the framework and drag the built `Alamofire.framework` into your Xcode project.\n\n### Swift Package Manager\n\nThe [Swift Package Manager](https://swift.org/package-manager/) is a tool for automating the distribution of Swift code and is integrated into the `swift` compiler. It is in early development, but Alamofire does support its use on supported platforms. \n\nOnce you have your Swift package set up, adding Alamofire as a dependency is as easy as adding it to the `dependencies` value of your `Package.swift`.\n\n```swift\ndependencies: [\n    .Package(url: \"https://github.com/Alamofire/Alamofire.git\", majorVersion: 4)\n]\n```\n\n### Manually\n\nIf you prefer not to use any of the aforementioned dependency managers, you can integrate Alamofire into your project manually.\n\n#### Embedded Framework\n\n- Open up Terminal, `cd` into your top-level project directory, and run the following command \"if\" your project is not initialized as a git repository:\n\n  ```bash\n  $ git init\n  ```\n\n- Add Alamofire as a git [submodule](http://git-scm.com/docs/git-submodule) by running the following command:\n\n  ```bash\n  $ git submodule add https://github.com/Alamofire/Alamofire.git\n  ```\n\n- Open the new `Alamofire` folder, and drag the `Alamofire.xcodeproj` into the Project Navigator of your application's Xcode project.\n\n    > It should appear nested underneath your application's blue project icon. Whether it is above or below all the other Xcode groups does not matter.\n\n- Select the `Alamofire.xcodeproj` in the Project Navigator and verify the deployment target matches that of your application target.\n- Next, select your application project in the Project Navigator (blue project icon) to navigate to the target configuration window and select the application target under the \"Targets\" heading in the sidebar.\n- In the tab bar at the top of that window, open the \"General\" panel.\n- Click on the `+` button under the \"Embedded Binaries\" section.\n- You will see two different `Alamofire.xcodeproj` folders each with two different versions of the `Alamofire.framework` nested inside a `Products` folder.\n\n    > It does not matter which `Products` folder you choose from, but it does matter whether you choose the top or bottom `Alamofire.framework`.\n\n- Select the top `Alamofire.framework` for iOS and the bottom one for OS X.\n\n    > You can verify which one you selected by inspecting the build log for your project. The build target for `Alamofire` will be listed as either `Alamofire iOS`, `Alamofire macOS`, `Alamofire tvOS` or `Alamofire watchOS`.\n\n- And that's it!\n\n  > The `Alamofire.framework` is automagically added as a target dependency, linked framework and embedded framework in a copy files build phase which is all you need to build on the simulator and a device.\n\n---\n\n## Usage\n\n### Making a Request\n\n```swift\nimport Alamofire\n\nAlamofire.request(\"https://httpbin.org/get\")\n```\n\n### Response Handling\n\nHandling the `Response` of a `Request` made in Alamofire involves chaining a response handler onto the `Request`.\n\n```swift\nAlamofire.request(\"https://httpbin.org/get\").responseJSON { response in\n    print(\"Request: \\(String(describing: response.request))\")   // original url request\n    print(\"Response: \\(String(describing: response.response))\") // http url response\n    print(\"Result: \\(response.result)\")                         // response serialization result\n\n    if let json = response.result.value {\n        print(\"JSON: \\(json)\") // serialized json response\n    }\n\n    if let data = response.data, let utf8Text = String(data: data, encoding: .utf8) {\n        print(\"Data: \\(utf8Text)\") // original server data as UTF8 string\n    }\n}\n```\n\nIn the above example, the `responseJSON` handler is appended to the `Request` to be executed once the `Request` is complete. Rather than blocking execution to wait for a response from the server, a [callback](http://en.wikipedia.org/wiki/Callback_%28computer_programming%29) in the form of a closure is specified to handle the response once it's received. The result of a request is only available inside the scope of a response closure. Any execution contingent on the response or data received from the server must be done within a response closure.\n\n> Networking in Alamofire is done _asynchronously_. Asynchronous programming may be a source of frustration to programmers unfamiliar with the concept, but there are [very good reasons](https://developer.apple.com/library/ios/qa/qa1693/_index.html) for doing it this way.\n\nAlamofire contains five different response handlers by default including:\n\n```swift\n// Response Handler - Unserialized Response\nfunc response(\n    queue: DispatchQueue?,\n    completionHandler: @escaping (DefaultDataResponse) -> Void)\n    -> Self\n\n// Response Data Handler - Serialized into Data\nfunc responseData(\n    queue: DispatchQueue?,\n    completionHandler: @escaping (DataResponse<Data>) -> Void)\n    -> Self\n\n// Response String Handler - Serialized into String\nfunc responseString(\n    queue: DispatchQueue?,\n    encoding: String.Encoding?,\n    completionHandler: @escaping (DataResponse<String>) -> Void)\n    -> Self\n\n// Response JSON Handler - Serialized into Any\nfunc responseJSON(\n    queue: DispatchQueue?,\n    completionHandler: @escaping (DataResponse<Any>) -> Void)\n    -> Self\n\n// Response PropertyList (plist) Handler - Serialized into Any\nfunc responsePropertyList(\n    queue: DispatchQueue?,\n    completionHandler: @escaping (DataResponse<Any>) -> Void))\n    -> Self\n```\n\nNone of the response handlers perform any validation of the `HTTPURLResponse` it gets back from the server.\n\n> For example, response status codes in the `400..<500` and `500..<600` ranges do NOT automatically trigger an `Error`. Alamofire uses [Response Validation](#response-validation) method chaining to achieve this.\n\n#### Response Handler\n\nThe `response` handler does NOT evaluate any of the response data. It merely forwards on all information directly from the URL session delegate. It is the Alamofire equivalent of using `cURL` to execute a `Request`.\n\n```swift\nAlamofire.request(\"https://httpbin.org/get\").response { response in\n    print(\"Request: \\(response.request)\")\n    print(\"Response: \\(response.response)\")\n    print(\"Error: \\(response.error)\")\n\n    if let data = response.data, let utf8Text = String(data: data, encoding: .utf8) {\n    \tprint(\"Data: \\(utf8Text)\")\n    }\n}\n```\n\n> We strongly encourage you to leverage the other response serializers taking advantage of `Response` and `Result` types.\n\n#### Response Data Handler\n\nThe `responseData` handler uses the `responseDataSerializer` (the object that serializes the server data into some other type) to extract the `Data` returned by the server. If no errors occur and `Data` is returned, the response `Result` will be a `.success` and the `value` will be of type `Data`.\n\n```swift\nAlamofire.request(\"https://httpbin.org/get\").responseData { response in\n    debugPrint(\"All Response Info: \\(response)\")\n\n    if let data = response.result.value, let utf8Text = String(data: data, encoding: .utf8) {\n    \tprint(\"Data: \\(utf8Text)\")\n    }\n}\n```\n\n#### Response String Handler\n\nThe `responseString` handler uses the `responseStringSerializer` to convert the `Data` returned by the server into a `String` with the specified encoding. If no errors occur and the server data is successfully serialized into a `String`, the response `Result` will be a `.success` and the `value` will be of type `String`.\n\n```swift\nAlamofire.request(\"https://httpbin.org/get\").responseString { response in\n    print(\"Success: \\(response.result.isSuccess)\")\n    print(\"Response String: \\(response.result.value)\")\n}\n```\n\n> If no encoding is specified, Alamofire will use the text encoding specified in the `HTTPURLResponse` from the server. If the text encoding cannot be determined by the server response, it defaults to `.isoLatin1`.\n\n#### Response JSON Handler\n\nThe `responseJSON` handler uses the `responseJSONSerializer` to convert the `Data` returned by the server into an `Any` type using the specified `JSONSerialization.ReadingOptions`. If no errors occur and the server data is successfully serialized into a JSON object, the response `Result` will be a `.success` and the `value` will be of type `Any`.\n\n```swift\nAlamofire.request(\"https://httpbin.org/get\").responseJSON { response in\n    debugPrint(response)\n\n    if let json = response.result.value {\n        print(\"JSON: \\(json)\")\n    }\n}\n```\n\n> All JSON serialization is handled by the `JSONSerialization` API in the `Foundation` framework.\n\n#### Chained Response Handlers\n\nResponse handlers can even be chained:\n\n```swift\nAlamofire.request(\"https://httpbin.org/get\")\n    .responseString { response in\n        print(\"Response String: \\(response.result.value)\")\n    }\n    .responseJSON { response in\n        print(\"Response JSON: \\(response.result.value)\")\n    }\n```\n\n> It is important to note that using multiple response handlers on the same `Request` requires the server data to be serialized multiple times. Once for each response handler.\n\n#### Response Handler Queue\n\nResponse handlers by default are executed on the main dispatch queue. However, a custom dispatch queue can be provided instead.\n\n```swift\nlet utilityQueue = DispatchQueue.global(qos: .utility)\n\nAlamofire.request(\"https://httpbin.org/get\").responseJSON(queue: utilityQueue) { response in\n    print(\"Executing response handler on utility queue\")\n}\n```\n\n### Response Validation\n\nBy default, Alamofire treats any completed request to be successful, regardless of the content of the response. Calling `validate` before a response handler causes an error to be generated if the response had an unacceptable status code or MIME type.\n\n#### Manual Validation\n\n```swift\nAlamofire.request(\"https://httpbin.org/get\")\n    .validate(statusCode: 200..<300)\n    .validate(contentType: [\"application/json\"])\n    .responseData { response in\n        switch response.result {\n        case .success:\n            print(\"Validation Successful\")\n        case .failure(let error):\n            print(error)\n        }\n    }\n```\n\n#### Automatic Validation\n\nAutomatically validates status code within `200..<300` range, and that the `Content-Type` header of the response matches the `Accept` header of the request, if one is provided.\n\n```swift\nAlamofire.request(\"https://httpbin.org/get\").validate().responseJSON { response in\n    switch response.result {\n    case .success:\n        print(\"Validation Successful\")\n    case .failure(let error):\n        print(error)\n    }\n}\n```\n\n### Response Caching\n\nResponse Caching is handled on the system framework level by [`URLCache`](https://developer.apple.com/reference/foundation/urlcache). It provides a composite in-memory and on-disk cache and lets you manipulate the sizes of both the in-memory and on-disk portions.\n\n> By default, Alamofire leverages the shared `URLCache`. In order to customize it, see the [Session Manager Configurations](#session-manager) section.\n\n### HTTP Methods\n\nThe `HTTPMethod` enumeration lists the HTTP methods defined in [RFC 7231 §4.3](http://tools.ietf.org/html/rfc7231#section-4.3):\n\n```swift\npublic enum HTTPMethod: String {\n    case options = \"OPTIONS\"\n    case get     = \"GET\"\n    case head    = \"HEAD\"\n    case post    = \"POST\"\n    case put     = \"PUT\"\n    case patch   = \"PATCH\"\n    case delete  = \"DELETE\"\n    case trace   = \"TRACE\"\n    case connect = \"CONNECT\"\n}\n```\n\nThese values can be passed as the `method` argument to the `Alamofire.request` API:\n\n```swift\nAlamofire.request(\"https://httpbin.org/get\") // method defaults to `.get`\n\nAlamofire.request(\"https://httpbin.org/post\", method: .post)\nAlamofire.request(\"https://httpbin.org/put\", method: .put)\nAlamofire.request(\"https://httpbin.org/delete\", method: .delete)\n```\n\n> The `Alamofire.request` method parameter defaults to `.get`.\n\n### Parameter Encoding\n\nAlamofire supports three types of parameter encoding including: `URL`, `JSON` and `PropertyList`. It can also support any custom encoding that conforms to the `ParameterEncoding` protocol.\n\n#### URL Encoding\n\nThe `URLEncoding` type creates a url-encoded query string to be set as or appended to any existing URL query string or set as the HTTP body of the URL request. Whether the query string is set or appended to any existing URL query string or set as the HTTP body depends on the `Destination` of the encoding. The `Destination` enumeration has three cases:\n\n- `.methodDependent` - Applies encoded query string result to existing query string for `GET`, `HEAD` and `DELETE` requests and sets as the HTTP body for requests with any other HTTP method.\n- `.queryString` - Sets or appends encoded query string result to existing query string.\n- `.httpBody` - Sets encoded query string result as the HTTP body of the URL request.\n\nThe `Content-Type` HTTP header field of an encoded request with HTTP body is set to `application/x-www-form-urlencoded; charset=utf-8`. Since there is no published specification for how to encode collection types, the convention of appending `[]` to the key for array values (`foo[]=1&foo[]=2`), and appending the key surrounded by square brackets for nested dictionary values (`foo[bar]=baz`).\n\n##### GET Request With URL-Encoded Parameters\n\n```swift\nlet parameters: Parameters = [\"foo\": \"bar\"]\n\n// All three of these calls are equivalent\nAlamofire.request(\"https://httpbin.org/get\", parameters: parameters) // encoding defaults to `URLEncoding.default`\nAlamofire.request(\"https://httpbin.org/get\", parameters: parameters, encoding: URLEncoding.default)\nAlamofire.request(\"https://httpbin.org/get\", parameters: parameters, encoding: URLEncoding(destination: .methodDependent))\n\n// https://httpbin.org/get?foo=bar\n```\n\n##### POST Request With URL-Encoded Parameters\n\n```swift\nlet parameters: Parameters = [\n    \"foo\": \"bar\",\n    \"baz\": [\"a\", 1],\n    \"qux\": [\n        \"x\": 1,\n        \"y\": 2,\n        \"z\": 3\n    ]\n]\n\n// All three of these calls are equivalent\nAlamofire.request(\"https://httpbin.org/post\", method: .post, parameters: parameters)\nAlamofire.request(\"https://httpbin.org/post\", method: .post, parameters: parameters, encoding: URLEncoding.default)\nAlamofire.request(\"https://httpbin.org/post\", method: .post, parameters: parameters, encoding: URLEncoding.httpBody)\n\n// HTTP body: foo=bar&baz[]=a&baz[]=1&qux[x]=1&qux[y]=2&qux[z]=3\n```\n\n#### JSON Encoding\n\nThe `JSONEncoding` type creates a JSON representation of the parameters object, which is set as the HTTP body of the request. The `Content-Type` HTTP header field of an encoded request is set to `application/json`.\n\n##### POST Request with JSON-Encoded Parameters\n\n```swift\nlet parameters: Parameters = [\n    \"foo\": [1,2,3],\n    \"bar\": [\n        \"baz\": \"qux\"\n    ]\n]\n\n// Both calls are equivalent\nAlamofire.request(\"https://httpbin.org/post\", method: .post, parameters: parameters, encoding: JSONEncoding.default)\nAlamofire.request(\"https://httpbin.org/post\", method: .post, parameters: parameters, encoding: JSONEncoding(options: []))\n\n// HTTP body: {\"foo\": [1, 2, 3], \"bar\": {\"baz\": \"qux\"}}\n```\n\n#### Property List Encoding\n\nThe `PropertyListEncoding` uses `PropertyListSerialization` to create a plist representation of the parameters object, according to the associated format and write options values, which is set as the body of the request. The `Content-Type` HTTP header field of an encoded request is set to `application/x-plist`.\n\n#### Custom Encoding\n\nIn the event that the provided `ParameterEncoding` types do not meet your needs, you can create your own custom encoding. Here's a quick example of how you could build a custom `JSONStringArrayEncoding` type to encode a JSON string array onto a `Request`.\n\n```swift\nstruct JSONStringArrayEncoding: ParameterEncoding {\n\tprivate let array: [String]\n\n    init(array: [String]) {\n        self.array = array\n    }\n\n    func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {\n        var urlRequest = try urlRequest.asURLRequest()\n\n        let data = try JSONSerialization.data(withJSONObject: array, options: [])\n\n        if urlRequest.value(forHTTPHeaderField: \"Content-Type\") == nil {\n            urlRequest.setValue(\"application/json\", forHTTPHeaderField: \"Content-Type\")\n        }\n\n        urlRequest.httpBody = data\n\n        return urlRequest\n    }\n}\n```\n\n#### Manual Parameter Encoding of a URLRequest\n\nThe `ParameterEncoding` APIs can be used outside of making network requests.\n\n```swift\nlet url = URL(string: \"https://httpbin.org/get\")!\nvar urlRequest = URLRequest(url: url)\n\nlet parameters: Parameters = [\"foo\": \"bar\"]\nlet encodedURLRequest = try URLEncoding.queryString.encode(urlRequest, with: parameters)\n```\n\n### HTTP Headers\n\nAdding a custom HTTP header to a `Request` is supported directly in the global `request` method. This makes it easy to attach HTTP headers to a `Request` that can be constantly changing.\n\n```swift\nlet headers: HTTPHeaders = [\n    \"Authorization\": \"Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==\",\n    \"Accept\": \"application/json\"\n]\n\nAlamofire.request(\"https://httpbin.org/headers\", headers: headers).responseJSON { response in\n    debugPrint(response)\n}\n```\n\n> For HTTP headers that do not change, it is recommended to set them on the `URLSessionConfiguration` so they are automatically applied to any `URLSessionTask` created by the underlying `URLSession`. For more information, see the [Session Manager Configurations](#session-manager) section.\n\nThe default Alamofire `SessionManager` provides a default set of headers for every `Request`. These include:\n\n- `Accept-Encoding`, which defaults to `gzip;q=1.0, compress;q=0.5`, per [RFC 7230 §4.2.3](https://tools.ietf.org/html/rfc7230#section-4.2.3).\n- `Accept-Language`, which defaults to up to the top 6 preferred languages on the system, formatted like `en;q=1.0`, per [RFC 7231 §5.3.5](https://tools.ietf.org/html/rfc7231#section-5.3.5).\n- `User-Agent`, which contains versioning information about the current app. For example: `iOS Example/1.0 (com.alamofire.iOS-Example; build:1; iOS 10.0.0) Alamofire/4.0.0`, per [RFC 7231 §5.5.3](https://tools.ietf.org/html/rfc7231#section-5.5.3).\n\nIf you need to customize these headers, a custom `URLSessionConfiguration` should be created, the `defaultHTTPHeaders` property updated and the configuration applied to a new `SessionManager` instance.\n\n### Authentication\n\nAuthentication is handled on the system framework level by [`URLCredential`](https://developer.apple.com/reference/foundation/nsurlcredential) and [`URLAuthenticationChallenge`](https://developer.apple.com/reference/foundation/urlauthenticationchallenge).\n\n**Supported Authentication Schemes**\n\n- [HTTP Basic](http://en.wikipedia.org/wiki/Basic_access_authentication)\n- [HTTP Digest](http://en.wikipedia.org/wiki/Digest_access_authentication)\n- [Kerberos](http://en.wikipedia.org/wiki/Kerberos_%28protocol%29)\n- [NTLM](http://en.wikipedia.org/wiki/NT_LAN_Manager)\n\n#### HTTP Basic Authentication\n\nThe `authenticate` method on a `Request` will automatically provide a `URLCredential` to a `URLAuthenticationChallenge` when appropriate:\n\n```swift\nlet user = \"user\"\nlet password = \"password\"\n\nAlamofire.request(\"https://httpbin.org/basic-auth/\\(user)/\\(password)\")\n    .authenticate(user: user, password: password)\n    .responseJSON { response in\n        debugPrint(response)\n    }\n```\n\nDepending upon your server implementation, an `Authorization` header may also be appropriate:\n\n```swift\nlet user = \"user\"\nlet password = \"password\"\n\nvar headers: HTTPHeaders = [:]\n\nif let authorizationHeader = Request.authorizationHeader(user: user, password: password) {\n    headers[authorizationHeader.key] = authorizationHeader.value\n}\n\nAlamofire.request(\"https://httpbin.org/basic-auth/user/password\", headers: headers)\n    .responseJSON { response in\n        debugPrint(response)\n    }\n```\n\n#### Authentication with URLCredential\n\n```swift\nlet user = \"user\"\nlet password = \"password\"\n\nlet credential = URLCredential(user: user, password: password, persistence: .forSession)\n\nAlamofire.request(\"https://httpbin.org/basic-auth/\\(user)/\\(password)\")\n    .authenticate(usingCredential: credential)\n    .responseJSON { response in\n        debugPrint(response)\n    }\n```\n\n> It is important to note that when using a `URLCredential` for authentication, the underlying `URLSession` will actually end up making two requests if a challenge is issued by the server. The first request will not include the credential which \"may\" trigger a challenge from the server. The challenge is then received by Alamofire, the credential is appended and the request is retried by the underlying `URLSession`.\n\n### Downloading Data to a File\n\nRequests made in Alamofire that fetch data from a server can download the data in-memory or on-disk. The `Alamofire.request` APIs used in all the examples so far always downloads the server data in-memory. This is great for smaller payloads because it's more efficient, but really bad for larger payloads because the download could run your entire application out-of-memory. Because of this, you can also use the `Alamofire.download` APIs to download the server data to a temporary file on-disk.\n\n> This will only work on `macOS` as is. Other platforms don't allow access to the filesystem outside of your app's sandbox. To download files on other platforms, see the [Download File Destination](#download-file-destination) section.\n\n```swift\nAlamofire.download(\"https://httpbin.org/image/png\").responseData { response in\n    if let data = response.result.value {\n        let image = UIImage(data: data)\n    }\n}\n```\n\n> The `Alamofire.download` APIs should also be used if you need to download data while your app is in the background. For more information, please see the [Session Manager Configurations](#session-manager) section.\n\n#### Download File Destination\n\nYou can also provide a `DownloadFileDestination` closure to move the file from the temporary directory to a final destination. Before the temporary file is actually moved to the `destinationURL`, the `DownloadOptions` specified in the closure will be executed. The two currently supported `DownloadOptions` are:\n\n- `.createIntermediateDirectories` - Creates intermediate directories for the destination URL if specified.\n- `.removePreviousFile` - Removes a previous file from the destination URL if specified.\n\n```swift\nlet destination: DownloadRequest.DownloadFileDestination = { _, _ in\n    let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]\n    let fileURL = documentsURL.appendingPathComponent(\"pig.png\")\n\n    return (fileURL, [.removePreviousFile, .createIntermediateDirectories])\n}\n\nAlamofire.download(urlString, to: destination).response { response in\n    print(response)\n\n    if response.error == nil, let imagePath = response.destinationURL?.path {\n        let image = UIImage(contentsOfFile: imagePath)\n    }\n}\n```\n\nYou can also use the suggested download destination API.\n\n```swift\nlet destination = DownloadRequest.suggestedDownloadDestination(for: .documentDirectory)\nAlamofire.download(\"https://httpbin.org/image/png\", to: destination)\n```\n\n#### Download Progress\n\nMany times it can be helpful to report download progress to the user. Any `DownloadRequest` can report download progress using the `downloadProgress` API.\n\n```swift\nAlamofire.download(\"https://httpbin.org/image/png\")\n    .downloadProgress { progress in\n        print(\"Download Progress: \\(progress.fractionCompleted)\")\n    }\n    .responseData { response in\n        if let data = response.result.value {\n            let image = UIImage(data: data)\n        }\n    }\n```\n\nThe `downloadProgress` API also takes a `queue` parameter which defines which `DispatchQueue` the download progress closure should be called on.\n\n```swift\nlet utilityQueue = DispatchQueue.global(qos: .utility)\n\nAlamofire.download(\"https://httpbin.org/image/png\")\n    .downloadProgress(queue: utilityQueue) { progress in\n        print(\"Download Progress: \\(progress.fractionCompleted)\")\n    }\n    .responseData { response in\n        if let data = response.result.value {\n            let image = UIImage(data: data)\n        }\n    }\n```\n\n#### Resuming a Download\n\nIf a `DownloadRequest` is cancelled or interrupted, the underlying URL session may generate resume data for the active `DownloadRequest`. If this happens, the resume data can be re-used to restart the `DownloadRequest` where it left off. The resume data can be accessed through the download response, then reused when trying to restart the request.\n\n> **IMPORTANT:** On the latest release of all the Apple platforms (iOS 10, macOS 10.12, tvOS 10, watchOS 3), `resumeData` is broken on background URL session configurations. There's an underlying bug in the `resumeData` generation logic where the data is written incorrectly and will always fail to resume the download. For more information about the bug and possible workarounds, please see this Stack Overflow [post](http://stackoverflow.com/a/39347461/1342462).\n\n```swift\nclass ImageRequestor {\n    private var resumeData: Data?\n    private var image: UIImage?\n\n    func fetchImage(completion: (UIImage?) -> Void) {\n        guard image == nil else { completion(image) ; return }\n\n        let destination: DownloadRequest.DownloadFileDestination = { _, _ in\n            let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]\n            let fileURL = documentsURL.appendingPathComponent(\"pig.png\")\n\n            return (fileURL, [.removePreviousFile, .createIntermediateDirectories])\n        }\n\n        let request: DownloadRequest\n\n        if let resumeData = resumeData {\n            request = Alamofire.download(resumingWith: resumeData)\n        } else {\n            request = Alamofire.download(\"https://httpbin.org/image/png\")\n        }\n\n        request.responseData { response in\n            switch response.result {\n            case .success(let data):\n                self.image = UIImage(data: data)\n            case .failure:\n                self.resumeData = response.resumeData\n            }\n        }\n    }\n}\n```\n\n### Uploading Data to a Server\n\nWhen sending relatively small amounts of data to a server using JSON or URL encoded parameters, the `Alamofire.request` APIs are usually sufficient. If you need to send much larger amounts of data from a file URL or an `InputStream`, then the `Alamofire.upload` APIs are what you want to use.\n\n> The `Alamofire.upload` APIs should also be used if you need to upload data while your app is in the background. For more information, please see the [Session Manager Configurations](#session-manager) section.\n\n#### Uploading Data\n\n```swift\nlet imageData = UIImagePNGRepresentation(image)!\n\nAlamofire.upload(imageData, to: \"https://httpbin.org/post\").responseJSON { response in\n    debugPrint(response)\n}\n```\n\n#### Uploading a File\n\n```swift\nlet fileURL = Bundle.main.url(forResource: \"video\", withExtension: \"mov\")\n\nAlamofire.upload(fileURL, to: \"https://httpbin.org/post\").responseJSON { response in\n    debugPrint(response)\n}\n```\n\n#### Uploading Multipart Form Data\n\n```swift\nAlamofire.upload(\n    multipartFormData: { multipartFormData in\n        multipartFormData.append(unicornImageURL, withName: \"unicorn\")\n        multipartFormData.append(rainbowImageURL, withName: \"rainbow\")\n    },\n    to: \"https://httpbin.org/post\",\n    encodingCompletion: { encodingResult in\n    \tswitch encodingResult {\n    \tcase .success(let upload, _, _):\n            upload.responseJSON { response in\n                debugPrint(response)\n            }\n    \tcase .failure(let encodingError):\n    \t    print(encodingError)\n    \t}\n    }\n)\n```\n\n#### Upload Progress\n\nWhile your user is waiting for their upload to complete, sometimes it can be handy to show the progress of the upload to the user. Any `UploadRequest` can report both upload progress and download progress of the response data using the `uploadProgress` and `downloadProgress` APIs.\n\n```swift\nlet fileURL = Bundle.main.url(forResource: \"video\", withExtension: \"mov\")\n\nAlamofire.upload(fileURL, to: \"https://httpbin.org/post\")\n    .uploadProgress { progress in // main queue by default\n        print(\"Upload Progress: \\(progress.fractionCompleted)\")\n    }\n    .downloadProgress { progress in // main queue by default\n        print(\"Download Progress: \\(progress.fractionCompleted)\")\n    }\n    .responseJSON { response in\n        debugPrint(response)\n    }\n```\n\n### Statistical Metrics\n\n#### Timeline\n\nAlamofire collects timings throughout the lifecycle of a `Request` and creates a `Timeline` object exposed as a property on all response types.\n\n```swift\nAlamofire.request(\"https://httpbin.org/get\").responseJSON { response in\n    print(response.timeline)\n}\n```\n\nThe above reports the following `Timeline` info:\n\n- `Latency`: 0.428 seconds\n- `Request Duration`: 0.428 seconds\n- `Serialization Duration`: 0.001 seconds\n- `Total Duration`: 0.429 seconds\n\n#### URL Session Task Metrics\n\nIn iOS and tvOS 10 and macOS 10.12, Apple introduced the new [URLSessionTaskMetrics](https://developer.apple.com/reference/foundation/urlsessiontaskmetrics) APIs. The task metrics encapsulate some fantastic statistical information about the request and response execution. The API is very similar to the `Timeline`, but provides many more statistics that Alamofire doesn't have access to compute. The metrics can be accessed through any response type.\n\n```swift\nAlamofire.request(\"https://httpbin.org/get\").responseJSON { response in\n    print(response.metrics)\n}\n```\n\nIt's important to note that these APIs are only available on iOS and tvOS 10 and macOS 10.12. Therefore, depending on your deployment target, you may need to use these inside availability checks:\n\n```swift\nAlamofire.request(\"https://httpbin.org/get\").responseJSON { response in\n    if #available(iOS 10.0, *) {\n        print(response.metrics)\n    }\n}\n```\n\n### cURL Command Output\n\nDebugging platform issues can be frustrating. Thankfully, Alamofire `Request` objects conform to both the `CustomStringConvertible` and `CustomDebugStringConvertible` protocols to provide some VERY helpful debugging tools.\n\n#### CustomStringConvertible\n\n```swift\nlet request = Alamofire.request(\"https://httpbin.org/ip\")\n\nprint(request)\n// GET https://httpbin.org/ip (200)\n```\n\n#### CustomDebugStringConvertible\n\n```swift\nlet request = Alamofire.request(\"https://httpbin.org/get\", parameters: [\"foo\": \"bar\"])\ndebugPrint(request)\n```\n\nOutputs:\n\n```bash\n$ curl -i \\\n    -H \"User-Agent: Alamofire/4.0.0\" \\\n    -H \"Accept-Encoding: gzip;q=1.0, compress;q=0.5\" \\\n    -H \"Accept-Language: en;q=1.0,fr;q=0.9,de;q=0.8,zh-Hans;q=0.7,zh-Hant;q=0.6,ja;q=0.5\" \\\n    \"https://httpbin.org/get?foo=bar\"\n```\n\n---\n\n## Advanced Usage\n\nAlamofire is built on `URLSession` and the Foundation URL Loading System. To make the most of this framework, it is recommended that you be familiar with the concepts and capabilities of the underlying networking stack.\n\n**Recommended Reading**\n\n- [URL Loading System Programming Guide](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html)\n- [URLSession Class Reference](https://developer.apple.com/reference/foundation/nsurlsession)\n- [URLCache Class Reference](https://developer.apple.com/reference/foundation/urlcache)\n- [URLAuthenticationChallenge Class Reference](https://developer.apple.com/reference/foundation/urlauthenticationchallenge)\n\n### Session Manager\n\nTop-level convenience methods like `Alamofire.request` use a default instance of `Alamofire.SessionManager`, which is configured with the default `URLSessionConfiguration`.\n\nAs such, the following two statements are equivalent:\n\n```swift\nAlamofire.request(\"https://httpbin.org/get\")\n```\n\n```swift\nlet sessionManager = Alamofire.SessionManager.default\nsessionManager.request(\"https://httpbin.org/get\")\n```\n\nApplications can create session managers for background and ephemeral sessions, as well as new managers that customize the default session configuration, such as for default headers (`httpAdditionalHeaders`) or timeout interval (`timeoutIntervalForRequest`).\n\n#### Creating a Session Manager with Default Configuration\n\n```swift\nlet configuration = URLSessionConfiguration.default\nlet sessionManager = Alamofire.SessionManager(configuration: configuration)\n```\n\n#### Creating a Session Manager with Background Configuration\n\n```swift\nlet configuration = URLSessionConfiguration.background(withIdentifier: \"com.example.app.background\")\nlet sessionManager = Alamofire.SessionManager(configuration: configuration)\n```\n\n#### Creating a Session Manager with Ephemeral Configuration\n\n```swift\nlet configuration = URLSessionConfiguration.ephemeral\nlet sessionManager = Alamofire.SessionManager(configuration: configuration)\n```\n\n#### Modifying the Session Configuration\n\n```swift\nvar defaultHeaders = Alamofire.SessionManager.defaultHTTPHeaders\ndefaultHeaders[\"DNT\"] = \"1 (Do Not Track Enabled)\"\n\nlet configuration = URLSessionConfiguration.default\nconfiguration.httpAdditionalHeaders = defaultHeaders\n\nlet sessionManager = Alamofire.SessionManager(configuration: configuration)\n```\n\n> This is **not** recommended for `Authorization` or `Content-Type` headers. Instead, use the `headers` parameter in the top-level `Alamofire.request` APIs, `URLRequestConvertible` and `ParameterEncoding`, respectively.\n\n### Session Delegate\n\nBy default, an Alamofire `SessionManager` instance creates a `SessionDelegate` object to handle all the various types of delegate callbacks that are generated by the underlying `URLSession`. The implementations of each delegate method handle the most common use cases for these types of calls abstracting the complexity away from the top-level APIs. However, advanced users may find the need to override the default functionality for various reasons.\n\n#### Override Closures\n\nThe first way to customize the `SessionDelegate` behavior is through the use of the override closures. Each closure gives you the ability to override the implementation of the matching `SessionDelegate` API, yet still use the default implementation for all other APIs. This makes it easy to customize subsets of the delegate functionality. Here are a few examples of some of the override closures available:\n\n```swift\n/// Overrides default behavior for URLSessionDelegate method `urlSession(_:didReceive:completionHandler:)`.\nopen var sessionDidReceiveChallenge: ((URLSession, URLAuthenticationChallenge) -> (URLSession.AuthChallengeDisposition, URLCredential?))?\n\n/// Overrides default behavior for URLSessionDelegate method `urlSessionDidFinishEvents(forBackgroundURLSession:)`.\nopen var sessionDidFinishEventsForBackgroundURLSession: ((URLSession) -> Void)?\n\n/// Overrides default behavior for URLSessionTaskDelegate method `urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)`.\nopen var taskWillPerformHTTPRedirection: ((URLSession, URLSessionTask, HTTPURLResponse, URLRequest) -> URLRequest?)?\n\n/// Overrides default behavior for URLSessionDataDelegate method `urlSession(_:dataTask:willCacheResponse:completionHandler:)`.\nopen var dataTaskWillCacheResponse: ((URLSession, URLSessionDataTask, CachedURLResponse) -> CachedURLResponse?)?\n```\n\nThe following is a short example of how to use the `taskWillPerformHTTPRedirection` to avoid following redirects to any `apple.com` domains.\n\n```swift\nlet sessionManager = Alamofire.SessionManager(configuration: URLSessionConfiguration.default)\nlet delegate: Alamofire.SessionDelegate = sessionManager.delegate\n\ndelegate.taskWillPerformHTTPRedirection = { session, task, response, request in\n    var finalRequest = request\n\n    if\n        let originalRequest = task.originalRequest,\n        let urlString = originalRequest.url?.urlString,\n        urlString.contains(\"apple.com\")\n    {\n        finalRequest = originalRequest\n    }\n\n    return finalRequest\n}\n```\n\n#### Subclassing\n\nAnother way to override the default implementation of the `SessionDelegate` is to subclass it. Subclassing allows you completely customize the behavior of the API or to create a proxy for the API and still use the default implementation. Creating a proxy allows you to log events, emit notifications, provide pre and post hook implementations, etc. Here's a quick example of subclassing the `SessionDelegate` and logging a message when a redirect occurs.\n\n```swift\nclass LoggingSessionDelegate: SessionDelegate {\n    override func urlSession(\n        _ session: URLSession,\n        task: URLSessionTask,\n        willPerformHTTPRedirection response: HTTPURLResponse,\n        newRequest request: URLRequest,\n        completionHandler: @escaping (URLRequest?) -> Void)\n    {\n        print(\"URLSession will perform HTTP redirection to request: \\(request)\")\n\n        super.urlSession(\n            session,\n            task: task,\n            willPerformHTTPRedirection: response,\n            newRequest: request,\n            completionHandler: completionHandler\n        )\n    }\n}\n```\n\nGenerally speaking, either the default implementation or the override closures should provide the necessary functionality required. Subclassing should only be used as a last resort.\n\n> It is important to keep in mind that the `subdelegates` are initialized and destroyed in the default implementation. Be careful when subclassing to not introduce memory leaks.\n\n### Request\n\nThe result of a `request`, `download`, `upload` or `stream` methods are a `DataRequest`, `DownloadRequest`, `UploadRequest` and `StreamRequest` which all inherit from `Request`. All `Request` instances are always created by an owning session manager, and never initialized directly.\n\nEach subclass has specialized methods such as `authenticate`, `validate`, `responseJSON` and `uploadProgress` that each return the caller instance in order to facilitate method chaining.\n\nRequests can be suspended, resumed and cancelled:\n\n- `suspend()`: Suspends the underlying task and dispatch queue.\n- `resume()`: Resumes the underlying task and dispatch queue. If the owning manager does not have `startRequestsImmediately` set to `true`, the request must call `resume()` in order to start.\n- `cancel()`: Cancels the underlying task, producing an error that is passed to any registered response handlers.\n\n### Routing Requests\n\nAs apps grow in size, it's important to adopt common patterns as you build out your network stack. An important part of that design is how to route your requests. The Alamofire `URLConvertible` and `URLRequestConvertible` protocols along with the `Router` design pattern are here to help.\n\n#### URLConvertible\n\nTypes adopting the `URLConvertible` protocol can be used to construct URLs, which are then used to construct URL requests internally. `String`, `URL`, and `URLComponents` conform to `URLConvertible` by default, allowing any of them to be passed as `url` parameters to the `request`, `upload`, and `download` methods:\n\n```swift\nlet urlString = \"https://httpbin.org/post\"\nAlamofire.request(urlString, method: .post)\n\nlet url = URL(string: urlString)!\nAlamofire.request(url, method: .post)\n\nlet urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: true)!\nAlamofire.request(urlComponents, method: .post)\n```\n\nApplications interacting with web applications in a significant manner are encouraged to have custom types conform to `URLConvertible` as a convenient way to map domain-specific models to server resources.\n\n##### Type-Safe Routing\n\n```swift\nextension User: URLConvertible {\n    static let baseURLString = \"https://example.com\"\n\n    func asURL() throws -> URL {\n    \tlet urlString = User.baseURLString + \"/users/\\(username)/\"\n        return try urlString.asURL()\n    }\n}\n```\n\n```swift\nlet user = User(username: \"mattt\")\nAlamofire.request(user) // https://example.com/users/mattt\n```\n\n#### URLRequestConvertible\n\nTypes adopting the `URLRequestConvertible` protocol can be used to construct URL requests. `URLRequest` conforms to `URLRequestConvertible` by default, allowing it to be passed into `request`, `upload`, and `download` methods directly (this is the recommended way to specify custom HTTP body for individual requests):\n\n```swift\nlet url = URL(string: \"https://httpbin.org/post\")!\nvar urlRequest = URLRequest(url: url)\nurlRequest.httpMethod = \"POST\"\n\nlet parameters = [\"foo\": \"bar\"]\n\ndo {\n    urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: [])\n} catch {\n    // No-op\n}\n\nurlRequest.setValue(\"application/json\", forHTTPHeaderField: \"Content-Type\")\n\nAlamofire.request(urlRequest)\n```\n\nApplications interacting with web applications in a significant manner are encouraged to have custom types conform to `URLRequestConvertible` as a way to ensure consistency of requested endpoints. Such an approach can be used to abstract away server-side inconsistencies and provide type-safe routing, as well as manage authentication credentials and other state.\n\n##### API Parameter Abstraction\n\n```swift\nenum Router: URLRequestConvertible {\n    case search(query: String, page: Int)\n\n    static let baseURLString = \"https://example.com\"\n    static let perPage = 50\n\n    // MARK: URLRequestConvertible\n\n    func asURLRequest() throws -> URLRequest {\n        let result: (path: String, parameters: Parameters) = {\n            switch self {\n            case let .search(query, page) where page > 0:\n                return (\"/search\", [\"q\": query, \"offset\": Router.perPage * page])\n            case let .search(query, _):\n                return (\"/search\", [\"q\": query])\n            }\n        }()\n\n        let url = try Router.baseURLString.asURL()\n        let urlRequest = URLRequest(url: url.appendingPathComponent(result.path))\n\n        return try URLEncoding.default.encode(urlRequest, with: result.parameters)\n    }\n}\n```\n\n```swift\nAlamofire.request(Router.search(query: \"foo bar\", page: 1)) // https://example.com/search?q=foo%20bar&offset=50\n```\n\n##### CRUD & Authorization\n\n```swift\nimport Alamofire\n\nenum Router: URLRequestConvertible {\n    case createUser(parameters: Parameters)\n    case readUser(username: String)\n    case updateUser(username: String, parameters: Parameters)\n    case destroyUser(username: String)\n\n    static let baseURLString = \"https://example.com\"\n\n    var method: HTTPMethod {\n        switch self {\n        case .createUser:\n            return .post\n        case .readUser:\n            return .get\n        case .updateUser:\n            return .put\n        case .destroyUser:\n            return .delete\n        }\n    }\n\n    var path: String {\n        switch self {\n        case .createUser:\n            return \"/users\"\n        case .readUser(let username):\n            return \"/users/\\(username)\"\n        case .updateUser(let username, _):\n            return \"/users/\\(username)\"\n        case .destroyUser(let username):\n            return \"/users/\\(username)\"\n        }\n    }\n\n    // MARK: URLRequestConvertible\n\n    func asURLRequest() throws -> URLRequest {\n    \tlet url = try Router.baseURLString.asURL()\n\n        var urlRequest = URLRequest(url: url.appendingPathComponent(path))\n        urlRequest.httpMethod = method.rawValue\n\n        switch self {\n        case .createUser(let parameters):\n            urlRequest = try URLEncoding.default.encode(urlRequest, with: parameters)\n        case .updateUser(_, let parameters):\n            urlRequest = try URLEncoding.default.encode(urlRequest, with: parameters)\n        default:\n            break\n        }\n\n        return urlRequest\n    }\n}\n```\n\n```swift\nAlamofire.request(Router.readUser(\"mattt\")) // GET https://example.com/users/mattt\n```\n\n### Adapting and Retrying Requests\n\nMost web services these days are behind some sort of authentication system. One of the more common ones today is OAuth. This generally involves generating an access token authorizing your application or user to call the various supported web services. While creating these initial access tokens can be laborsome, it can be even more complicated when your access token expires and you need to fetch a new one. There are many thread-safety issues that need to be considered.\n\nThe `RequestAdapter` and `RequestRetrier` protocols were created to make it much easier to create a thread-safe authentication system for a specific set of web services.\n\n#### RequestAdapter\n\nThe `RequestAdapter` protocol allows each `Request` made on a `SessionManager` to be inspected and adapted before being created. One very specific way to use an adapter is to append an `Authorization` header to requests behind a certain type of authentication.\n\n```swift\nclass AccessTokenAdapter: RequestAdapter {\n    private let accessToken: String\n\n    init(accessToken: String) {\n        self.accessToken = accessToken\n    }\n\n    func adapt(_ urlRequest: URLRequest) throws -> URLRequest {\n        var urlRequest = urlRequest\n\n        if let urlString = urlRequest.url?.absoluteString, urlString.hasPrefix(\"https://httpbin.org\") {\n            urlRequest.setValue(\"Bearer \" + accessToken, forHTTPHeaderField: \"Authorization\")\n        }\n\n        return urlRequest\n\t}\n}\n```\n\n```swift\nlet sessionManager = SessionManager()\nsessionManager.adapter = AccessTokenAdapter(accessToken: \"1234\")\n\nsessionManager.request(\"https://httpbin.org/get\")\n```\n\n#### RequestRetrier\n\nThe `RequestRetrier` protocol allows a `Request` that encountered an `Error` while being executed to be retried. When using both the `RequestAdapter` and `RequestRetrier` protocols together, you can create credential refresh systems for OAuth1, OAuth2, Basic Auth and even exponential backoff retry policies. The possibilities are endless. Here's an example of how you could implement a refresh flow for OAuth2 access tokens.\n\n> **DISCLAIMER:** This is **NOT** a global `OAuth2` solution. It is merely an example demonstrating how one could use the `RequestAdapter` in conjunction with the `RequestRetrier` to create a thread-safe refresh system.\n\n> To reiterate, **do NOT copy** this sample code and drop it into a production application. This is merely an example. Each authentication system must be tailored to a particular platform and authentication type.\n\n```swift\nclass OAuth2Handler: RequestAdapter, RequestRetrier {\n    private typealias RefreshCompletion = (_ succeeded: Bool, _ accessToken: String?, _ refreshToken: String?) -> Void\n\n    private let sessionManager: SessionManager = {\n        let configuration = URLSessionConfiguration.default\n        configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders\n\n        return SessionManager(configuration: configuration)\n    }()\n\n    private let lock = NSLock()\n\n    private var clientID: String\n    private var baseURLString: String\n    private var accessToken: String\n    private var refreshToken: String\n\n    private var isRefreshing = false\n    private var requestsToRetry: [RequestRetryCompletion] = []\n\n    // MARK: - Initialization\n\n    public init(clientID: String, baseURLString: String, accessToken: String, refreshToken: String) {\n        self.clientID = clientID\n        self.baseURLString = baseURLString\n        self.accessToken = accessToken\n        self.refreshToken = refreshToken\n    }\n\n    // MARK: - RequestAdapter\n\n    func adapt(_ urlRequest: URLRequest) throws -> URLRequest {\n        if let urlString = urlRequest.url?.absoluteString, urlString.hasPrefix(baseURLString) {\n            var urlRequest = urlRequest\n            urlRequest.setValue(\"Bearer \" + accessToken, forHTTPHeaderField: \"Authorization\")\n            return urlRequest\n        }\n\n        return urlRequest\n    }\n\n    // MARK: - RequestRetrier\n\n    func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) {\n        lock.lock() ; defer { lock.unlock() }\n\n        if let response = request.task?.response as? HTTPURLResponse, response.statusCode == 401 {\n            requestsToRetry.append(completion)\n\n            if !isRefreshing {\n                refreshTokens { [weak self] succeeded, accessToken, refreshToken in\n                    guard let strongSelf = self else { return }\n\n                    strongSelf.lock.lock() ; defer { strongSelf.lock.unlock() }\n\n                    if let accessToken = accessToken, let refreshToken = refreshToken {\n                        strongSelf.accessToken = accessToken\n                        strongSelf.refreshToken = refreshToken\n                    }\n\n                    strongSelf.requestsToRetry.forEach { $0(succeeded, 0.0) }\n                    strongSelf.requestsToRetry.removeAll()\n                }\n            }\n        } else {\n            completion(false, 0.0)\n        }\n    }\n\n    // MARK: - Private - Refresh Tokens\n\n    private func refreshTokens(completion: @escaping RefreshCompletion) {\n        guard !isRefreshing else { return }\n\n        isRefreshing = true\n\n        let urlString = \"\\(baseURLString)/oauth2/token\"\n\n        let parameters: [String: Any] = [\n            \"access_token\": accessToken,\n            \"refresh_token\": refreshToken,\n            \"client_id\": clientID,\n            \"grant_type\": \"refresh_token\"\n        ]\n\n        sessionManager.request(urlString, method: .post, parameters: parameters, encoding: JSONEncoding.default)\n            .responseJSON { [weak self] response in\n                guard let strongSelf = self else { return }\n\n                if \n                    let json = response.result.value as? [String: Any], \n                    let accessToken = json[\"access_token\"] as? String, \n                    let refreshToken = json[\"refresh_token\"] as? String \n                {\n                    completion(true, accessToken, refreshToken)\n                } else {\n                    completion(false, nil, nil)\n                }\n\n                strongSelf.isRefreshing = false\n            }\n    }\n}\n```\n\n```swift\nlet baseURLString = \"https://some.domain-behind-oauth2.com\"\n\nlet oauthHandler = OAuth2Handler(\n    clientID: \"12345678\",\n    baseURLString: baseURLString,\n    accessToken: \"abcd1234\",\n    refreshToken: \"ef56789a\"\n)\n\nlet sessionManager = SessionManager()\nsessionManager.adapter = oauthHandler\nsessionManager.retrier = oauthHandler\n\nlet urlString = \"\\(baseURLString)/some/endpoint\"\n\nsessionManager.request(urlString).validate().responseJSON { response in\n    debugPrint(response)\n}\n```\n\nOnce the `OAuth2Handler` is applied as both the `adapter` and `retrier` for the `SessionManager`, it will handle an invalid access token error by automatically refreshing the access token and retrying all failed requests in the same order they failed.\n\n> If you needed them to execute in the same order they were created, you could sort them by their task identifiers.\n\nThe example above only checks for a `401` response code which is not nearly robust enough, but does demonstrate how one could check for an invalid access token error. In a production application, one would want to check the `realm` and most likely the `www-authenticate` header response although it depends on the OAuth2 implementation.\n\nAnother important note is that this authentication system could be shared between multiple session managers. For example, you may need to use both a `default` and `ephemeral` session configuration for the same set of web services. The example above allows the same `oauthHandler` instance to be shared across multiple session managers to manage the single refresh flow.\n\n### Custom Response Serialization\n\nAlamofire provides built-in response serialization for data, strings, JSON, and property lists:\n\n```swift\nAlamofire.request(...).responseData { (resp: DataResponse<Data>) in ... }\nAlamofire.request(...).responseString { (resp: DataResponse<String>) in ... }\nAlamofire.request(...).responseJSON { (resp: DataResponse<Any>) in ... }\nAlamofire.request(...).responsePropertyList { resp: DataResponse<Any>) in ... }\n```\n\nThose responses wrap deserialized *values* (Data, String, Any) or *errors* (network, validation errors), as well as *meta-data* (URL request, HTTP headers, status code, [metrics](#statistical-metrics), ...).\n\nYou have several ways to customize all of those response elements:\n\n- [Response Mapping](#response-mapping)\n- [Handling Errors](#handling-errors)\n- [Creating a Custom Response Serializer](#creating-a-custom-response-serializer)\n- [Generic Response Object Serialization](#generic-response-object-serialization)\n\n#### Response Mapping\n\nResponse mapping is the simplest way to produce customized responses. It transforms the value of a response, while preserving eventual errors and meta-data. For example, you can turn a json response `DataResponse<Any>` into a response that holds an application model, such as `DataResponse<User>`. You perform response mapping with the `DataResponse.map` method:\n\n```swift\nAlamofire.request(\"https://example.com/users/mattt\").responseJSON { (response: DataResponse<Any>) in\n    let userResponse = response.map { json in\n        // We assume an existing User(json: Any) initializer\n        return User(json: json)\n    }\n\n    // Process userResponse, of type DataResponse<User>:\n    if let user = userResponse.value {\n        print(\"User: { username: \\(user.username), name: \\(user.name) }\")\n    }\n}\n```\n\nWhen the transformation may throw an error, use `flatMap` instead:\n\n```swift\nAlamofire.request(\"https://example.com/users/mattt\").responseJSON { response in\n    let userResponse = response.flatMap { json in\n        try User(json: json)\n    }\n}\n```\n\nResponse mapping is a good fit for your custom completion handlers:\n\n```swift\n@discardableResult\nfunc loadUser(completionHandler: @escaping (DataResponse<User>) -> Void) -> Alamofire.DataRequest {\n    return Alamofire.request(\"https://example.com/users/mattt\").responseJSON { response in\n        let userResponse = response.flatMap { json in\n            try User(json: json)\n        }\n\n        completionHandler(userResponse)\n    }\n}\n\nloadUser { response in\n    if let user = response.value {\n        print(\"User: { username: \\(user.username), name: \\(user.name) }\")\n    }\n}\n```\n\nWhen the map/flatMap closure may process a big amount of data, make sure you execute it outside of the main thread:\n\n```swift\n@discardableResult\nfunc loadUser(completionHandler: @escaping (DataResponse<User>) -> Void) -> Alamofire.DataRequest {\n    let utilityQueue = DispatchQueue.global(qos: .utility)\n\n    return Alamofire.request(\"https://example.com/users/mattt\").responseJSON(queue: utilityQueue) { response in\n        let userResponse = response.flatMap { json in\n            try User(json: json)\n        }\n\n        DispatchQueue.main.async {\n            completionHandler(userResponse)\n        }\n    }\n}\n```\n\n`map` and `flatMap` are also available for [download responses](#downloading-data-to-a-file).\n\n#### Handling Errors\n\nBefore implementing custom response serializers or object serialization methods, it's important to consider how to handle any errors that may occur. There are two basic options: passing existing errors along unmodified, to be dealt with at response time; or, wrapping all errors in an `Error` type specific to your app.\n\nFor example, here's a simple `BackendError` enum which will be used in later examples:\n\n```swift\nenum BackendError: Error {\n    case network(error: Error) // Capture any underlying Error from the URLSession API\n    case dataSerialization(error: Error)\n    case jsonSerialization(error: Error)\n    case xmlSerialization(error: Error)\n    case objectSerialization(reason: String)\n}\n```\n\n#### Creating a Custom Response Serializer\n\nAlamofire provides built-in response serialization for strings, JSON, and property lists, but others can be added in extensions on `Alamofire.DataRequest` and / or `Alamofire.DownloadRequest`.\n\nFor example, here's how a response handler using [Ono](https://github.com/mattt/Ono) might be implemented:\n\n```swift\nextension DataRequest {\n    static func xmlResponseSerializer() -> DataResponseSerializer<ONOXMLDocument> {\n        return DataResponseSerializer { request, response, data, error in\n            // Pass through any underlying URLSession error to the .network case.\n            guard error == nil else { return .failure(BackendError.network(error: error!)) }\n\n            // Use Alamofire's existing data serializer to extract the data, passing the error as nil, as it has\n            // already been handled.\n            let result = Request.serializeResponseData(response: response, data: data, error: nil)\n\n            guard case let .success(validData) = result else {\n                return .failure(BackendError.dataSerialization(error: result.error! as! AFError))\n            }\n\n            do {\n                let xml = try ONOXMLDocument(data: validData)\n                return .success(xml)\n            } catch {\n                return .failure(BackendError.xmlSerialization(error: error))\n            }\n        }\n    }\n\n    @discardableResult\n    func responseXMLDocument(\n        queue: DispatchQueue? = nil,\n        completionHandler: @escaping (DataResponse<ONOXMLDocument>) -> Void)\n        -> Self\n    {\n        return response(\n            queue: queue,\n            responseSerializer: DataRequest.xmlResponseSerializer(),\n            completionHandler: completionHandler\n        )\n    }\n}\n```\n\n#### Generic Response Object Serialization\n\nGenerics can be used to provide automatic, type-safe response object serialization.\n\n```swift\nprotocol ResponseObjectSerializable {\n    init?(response: HTTPURLResponse, representation: Any)\n}\n\nextension DataRequest {\n    func responseObject<T: ResponseObjectSerializable>(\n        queue: DispatchQueue? = nil,\n        completionHandler: @escaping (DataResponse<T>) -> Void)\n        -> Self\n    {\n        let responseSerializer = DataResponseSerializer<T> { request, response, data, error in\n            guard error == nil else { return .failure(BackendError.network(error: error!)) }\n\n            let jsonResponseSerializer = DataRequest.jsonResponseSerializer(options: .allowFragments)\n            let result = jsonResponseSerializer.serializeResponse(request, response, data, nil)\n\n            guard case let .success(jsonObject) = result else {\n                return .failure(BackendError.jsonSerialization(error: result.error!))\n            }\n\n            guard let response = response, let responseObject = T(response: response, representation: jsonObject) else {\n                return .failure(BackendError.objectSerialization(reason: \"JSON could not be serialized: \\(jsonObject)\"))\n            }\n\n            return .success(responseObject)\n        }\n\n        return response(queue: queue, responseSerializer: responseSerializer, completionHandler: completionHandler)\n    }\n}\n```\n\n```swift\nstruct User: ResponseObjectSerializable, CustomStringConvertible {\n    let username: String\n    let name: String\n\n    var description: String {\n        return \"User: { username: \\(username), name: \\(name) }\"\n    }\n\n    init?(response: HTTPURLResponse, representation: Any) {\n        guard\n            let username = response.url?.lastPathComponent,\n            let representation = representation as? [String: Any],\n            let name = representation[\"name\"] as? String\n        else { return nil }\n\n        self.username = username\n        self.name = name\n    }\n}\n```\n\n```swift\nAlamofire.request(\"https://example.com/users/mattt\").responseObject { (response: DataResponse<User>) in\n    debugPrint(response)\n\n    if let user = response.result.value {\n        print(\"User: { username: \\(user.username), name: \\(user.name) }\")\n    }\n}\n```\n\nThe same approach can also be used to handle endpoints that return a representation of a collection of objects:\n\n```swift\nprotocol ResponseCollectionSerializable {\n    static func collection(from response: HTTPURLResponse, withRepresentation representation: Any) -> [Self]\n}\n\nextension ResponseCollectionSerializable where Self: ResponseObjectSerializable {\n    static func collection(from response: HTTPURLResponse, withRepresentation representation: Any) -> [Self] {\n        var collection: [Self] = []\n\n        if let representation = representation as? [[String: Any]] {\n            for itemRepresentation in representation {\n                if let item = Self(response: response, representation: itemRepresentation) {\n                    collection.append(item)\n                }\n            }\n        }\n\n        return collection\n    }\n}\n```\n\n```swift\nextension DataRequest {\n    @discardableResult\n    func responseCollection<T: ResponseCollectionSerializable>(\n        queue: DispatchQueue? = nil,\n        completionHandler: @escaping (DataResponse<[T]>) -> Void) -> Self\n    {\n        let responseSerializer = DataResponseSerializer<[T]> { request, response, data, error in\n            guard error == nil else { return .failure(BackendError.network(error: error!)) }\n\n            let jsonSerializer = DataRequest.jsonResponseSerializer(options: .allowFragments)\n            let result = jsonSerializer.serializeResponse(request, response, data, nil)\n\n            guard case let .success(jsonObject) = result else {\n                return .failure(BackendError.jsonSerialization(error: result.error!))\n            }\n\n            guard let response = response else {\n                let reason = \"Response collection could not be serialized due to nil response.\"\n                return .failure(BackendError.objectSerialization(reason: reason))\n            }\n\n            return .success(T.collection(from: response, withRepresentation: jsonObject))\n        }\n\n        return response(responseSerializer: responseSerializer, completionHandler: completionHandler)\n    }\n}\n```\n\n```swift\nstruct User: ResponseObjectSerializable, ResponseCollectionSerializable, CustomStringConvertible {\n    let username: String\n    let name: String\n\n    var description: String {\n        return \"User: { username: \\(username), name: \\(name) }\"\n    }\n\n    init?(response: HTTPURLResponse, representation: Any) {\n        guard\n            let username = response.url?.lastPathComponent,\n            let representation = representation as? [String: Any],\n            let name = representation[\"name\"] as? String\n        else { return nil }\n\n        self.username = username\n        self.name = name\n    }\n}\n```\n\n```swift\nAlamofire.request(\"https://example.com/users\").responseCollection { (response: DataResponse<[User]>) in\n    debugPrint(response)\n\n    if let users = response.result.value {\n        users.forEach { print(\"- \\($0)\") }\n    }\n}\n```\n\n### Security\n\nUsing a secure HTTPS connection when communicating with servers and web services is an important step in securing sensitive data. By default, Alamofire will evaluate the certificate chain provided by the server using Apple's built in validation provided by the Security framework. While this guarantees the certificate chain is valid, it does not prevent man-in-the-middle (MITM) attacks or other potential vulnerabilities. In order to mitigate MITM attacks, applications dealing with sensitive customer data or financial information should use certificate or public key pinning provided by the `ServerTrustPolicy`.\n\n#### ServerTrustPolicy\n\nThe `ServerTrustPolicy` enumeration evaluates the server trust generally provided by an `URLAuthenticationChallenge` when connecting to a server over a secure HTTPS connection.\n\n```swift\nlet serverTrustPolicy = ServerTrustPolicy.pinCertificates(\n    certificates: ServerTrustPolicy.certificates(),\n    validateCertificateChain: true,\n    validateHost: true\n)\n```\n\nThere are many different cases of server trust evaluation giving you complete control over the validation process:\n\n* `performDefaultEvaluation`: Uses the default server trust evaluation while allowing you to control whether to validate the host provided by the challenge.\n* `pinCertificates`: Uses the pinned certificates to validate the server trust. The server trust is considered valid if one of the pinned certificates match one of the server certificates.\n* `pinPublicKeys`: Uses the pinned public keys to validate the server trust. The server trust is considered valid if one of the pinned public keys match one of the server certificate public keys.\n* `disableEvaluation`: Disables all evaluation which in turn will always consider any server trust as valid.\n* `customEvaluation`: Uses the associated closure to evaluate the validity of the server trust thus giving you complete control over the validation process. Use with caution.\n\n#### Server Trust Policy Manager\n\nThe `ServerTrustPolicyManager` is responsible for storing an internal mapping of server trust policies to a particular host. This allows Alamofire to evaluate each host against a different server trust policy.\n\n```swift\nlet serverTrustPolicies: [String: ServerTrustPolicy] = [\n    \"test.example.com\": .pinCertificates(\n        certificates: ServerTrustPolicy.certificates(),\n        validateCertificateChain: true,\n        validateHost: true\n    ),\n    \"insecure.expired-apis.com\": .disableEvaluation\n]\n\nlet sessionManager = SessionManager(\n    serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)\n)\n```\n\n> Make sure to keep a reference to the new `SessionManager` instance, otherwise your requests will all get cancelled when your `sessionManager` is deallocated.\n\nThese server trust policies will result in the following behavior:\n\n- `test.example.com` will always use certificate pinning with certificate chain and host validation enabled thus requiring the following criteria to be met to allow the TLS handshake to succeed:\n\t- Certificate chain MUST be valid.\n\t- Certificate chain MUST include one of the pinned certificates.\n\t- Challenge host MUST match the host in the certificate chain's leaf certificate.\n- `insecure.expired-apis.com` will never evaluate the certificate chain and will always allow the TLS handshake to succeed.\n- All other hosts will use the default evaluation provided by Apple.\n\n##### Subclassing Server Trust Policy Manager\n\nIf you find yourself needing more flexible server trust policy matching behavior (i.e. wildcarded domains), then subclass the `ServerTrustPolicyManager` and override the `serverTrustPolicyForHost` method with your own custom implementation.\n\n```swift\nclass CustomServerTrustPolicyManager: ServerTrustPolicyManager {\n    override func serverTrustPolicy(forHost host: String) -> ServerTrustPolicy? {\n        var policy: ServerTrustPolicy?\n\n        // Implement your custom domain matching behavior...\n\n        return policy\n    }\n}\n```\n\n#### Validating the Host\n\nThe `.performDefaultEvaluation`, `.pinCertificates` and `.pinPublicKeys` server trust policies all take a `validateHost` parameter. Setting the value to `true` will cause the server trust evaluation to verify that hostname in the certificate matches the hostname of the challenge. If they do not match, evaluation will fail. A `validateHost` value of `false` will still evaluate the full certificate chain, but will not validate the hostname of the leaf certificate.\n\n> It is recommended that `validateHost` always be set to `true` in production environments.\n\n#### Validating the Certificate Chain\n\nPinning certificates and public keys both have the option of validating the certificate chain using the `validateCertificateChain` parameter. By setting this value to `true`, the full certificate chain will be evaluated in addition to performing a byte equality check against the pinned certificates or public keys. A value of `false` will skip the certificate chain validation, but will still perform the byte equality check.\n\nThere are several cases where it may make sense to disable certificate chain validation. The most common use cases for disabling validation are self-signed and expired certificates. The evaluation would always fail in both of these cases, but the byte equality check will still ensure you are receiving the certificate you expect from the server.\n\n> It is recommended that `validateCertificateChain` always be set to `true` in production environments.\n\n#### App Transport Security\n\nWith the addition of App Transport Security (ATS) in iOS 9, it is possible that using a custom `ServerTrustPolicyManager` with several `ServerTrustPolicy` objects will have no effect. If you continuously see `CFNetwork SSLHandshake failed (-9806)` errors, you have probably run into this problem. Apple's ATS system overrides the entire challenge system unless you configure the ATS settings in your app's plist to disable enough of it to allow your app to evaluate the server trust.\n\nIf you run into this problem (high probability with self-signed certificates), you can work around this issue by adding the following to your `Info.plist`.\n\n```xml\n<dict>\n    <key>NSAppTransportSecurity</key>\n    <dict>\n        <key>NSExceptionDomains</key>\n        <dict>\n            <key>example.com</key>\n            <dict>\n                <key>NSExceptionAllowsInsecureHTTPLoads</key>\n                <true/>\n                <key>NSExceptionRequiresForwardSecrecy</key>\n                <false/>\n                <key>NSIncludesSubdomains</key>\n                <true/>\n                <!-- Optional: Specify minimum TLS version -->\n                <key>NSTemporaryExceptionMinimumTLSVersion</key>\n                <string>TLSv1.2</string>\n            </dict>\n        </dict>\n    </dict>\n</dict>\n```\n\nWhether you need to set the `NSExceptionRequiresForwardSecrecy` to `NO` depends on whether your TLS connection is using an allowed cipher suite. In certain cases, it will need to be set to `NO`. The `NSExceptionAllowsInsecureHTTPLoads` MUST be set to `YES` in order to allow the `SessionDelegate` to receive challenge callbacks. Once the challenge callbacks are being called, the `ServerTrustPolicyManager` will take over the server trust evaluation. You may also need to specify the `NSTemporaryExceptionMinimumTLSVersion` if you're trying to connect to a host that only supports TLS versions less than `1.2`.\n\n> It is recommended to always use valid certificates in production environments.\n\n### Network Reachability\n\nThe `NetworkReachabilityManager` listens for reachability changes of hosts and addresses for both WWAN and WiFi network interfaces.\n\n```swift\nlet manager = NetworkReachabilityManager(host: \"www.apple.com\")\n\nmanager?.listener = { status in\n    print(\"Network Status Changed: \\(status)\")\n}\n\nmanager?.startListening()\n```\n\n> Make sure to remember to retain the `manager` in the above example, or no status changes will be reported.\n> Also, do not include the scheme in the `host` string or reachability won't function correctly.\n\nThere are some important things to remember when using network reachability to determine what to do next.\n\n- **Do NOT** use Reachability to determine if a network request should be sent.\n    - You should **ALWAYS** send it.\n- When Reachability is restored, use the event to retry failed network requests.\n    - Even though the network requests may still fail, this is a good moment to retry them.\n- The network reachability status can be useful for determining why a network request may have failed.\n    - If a network request fails, it is more useful to tell the user that the network request failed due to being offline rather than a more technical error, such as \"request timed out.\"\n\n> It is recommended to check out [WWDC 2012 Session 706, \"Networking Best Practices\"](https://developer.apple.com/videos/play/wwdc2012-706/) for more info.\n\n---\n\n## Open Radars\n\nThe following radars have some effect on the current implementation of Alamofire.\n\n- [`rdar://21349340`](http://www.openradar.me/radar?id=5517037090635776) - Compiler throwing warning due to toll-free bridging issue in test case\n- `rdar://26870455` - Background URL Session Configurations do not work in the simulator\n- `rdar://26849668` - Some URLProtocol APIs do not properly handle `URLRequest`\n\n## Resolved Radars\n\nThe following radars have been resolved over time after being filed against the Alamofire project.\n\n- [`rdar://26761490`](http://www.openradar.me/radar?id=5010235949318144) - Swift string interpolation causing memory leak with common usage (Resolved on 9/1/17 in Xcode 9 beta 6).\n\n## FAQ\n\n### What's the origin of the name Alamofire?\n\nAlamofire is named after the [Alamo Fire flower](https://aggie-horticulture.tamu.edu/wildseed/alamofire.html), a hybrid variant of the Bluebonnet, the official state flower of Texas.\n\n### What logic belongs in a Router vs. a Request Adapter?\n\nSimple, static data such as paths, parameters and common headers belong in the `Router`. Dynamic data such as an `Authorization` header whose value can changed based on an authentication system belongs in a `RequestAdapter`.\n\nThe reason the dynamic data MUST be placed into the `RequestAdapter` is to support retry operations. When a `Request` is retried, the original request is not rebuilt meaning the `Router` will not be called again. The `RequestAdapter` is called again allowing the dynamic data to be updated on the original request before retrying the `Request`.\n\n---\n\n## Credits\n\nAlamofire is owned and maintained by the [Alamofire Software Foundation](http://alamofire.org). You can follow them on Twitter at [@AlamofireSF](https://twitter.com/AlamofireSF) for project updates and releases.\n\n### Security Disclosure\n\nIf you believe you have identified a security vulnerability with Alamofire, you should report it as soon as possible via email to security@alamofire.org. Please do not post it to a public issue tracker.\n\n## Donations\n\nThe [ASF](https://github.com/Alamofire/Foundation#members) is looking to raise money to officially register as a federal non-profit organization. Registering will allow us members to gain some legal protections and also allow us to put donations to use, tax free. Donating to the ASF will enable us to:\n\n- Pay our legal fees to register as a federal non-profit organization\n- Pay our yearly legal fees to keep the non-profit in good status\n- Pay for our mail servers to help us stay on top of all questions and security issues\n- Potentially fund test servers to make it easier for us to test the edge cases\n- Potentially fund developers to work on one of our projects full-time\n\nThe community adoption of the ASF libraries has been amazing. We are greatly humbled by your enthusiasm around the projects, and want to continue to do everything we can to move the needle forward. With your continued support, the ASF will be able to improve its reach and also provide better legal safety for the core members. If you use any of our libraries for work, see if your employers would be interested in donating. Our initial goal is to raise $1000 to get all our legal ducks in a row and kickstart this campaign. Any amount you can donate today to help us reach our goal would be greatly appreciated.\n\n<a href='https://pledgie.com/campaigns/31474'><img alt='Click here to lend your support to: Alamofire Software Foundation and make a donation at pledgie.com !' src='https://pledgie.com/campaigns/31474.png?skin_name=chrome' border='0' ></a>\n\n## License\n\nAlamofire is released under the MIT license. [See LICENSE](https://github.com/Alamofire/Alamofire/blob/master/LICENSE) for details.\n"
  },
  {
    "path": "Pods/Alamofire/Source/AFError.swift",
    "content": "//\n//  AFError.swift\n//\n//  Copyright (c) 2014-2017 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// `AFError` is the error type returned by Alamofire. It encompasses a few different types of errors, each with\n/// their own associated reasons.\n///\n/// - invalidURL:                  Returned when a `URLConvertible` type fails to create a valid `URL`.\n/// - parameterEncodingFailed:     Returned when a parameter encoding object throws an error during the encoding process.\n/// - multipartEncodingFailed:     Returned when some step in the multipart encoding process fails.\n/// - responseValidationFailed:    Returned when a `validate()` call fails.\n/// - responseSerializationFailed: Returned when a response serializer encounters an error in the serialization process.\npublic enum AFError: Error {\n    /// The underlying reason the parameter encoding error occurred.\n    ///\n    /// - missingURL:                 The URL request did not have a URL to encode.\n    /// - jsonEncodingFailed:         JSON serialization failed with an underlying system error during the\n    ///                               encoding process.\n    /// - propertyListEncodingFailed: Property list serialization failed with an underlying system error during\n    ///                               encoding process.\n    public enum ParameterEncodingFailureReason {\n        case missingURL\n        case jsonEncodingFailed(error: Error)\n        case propertyListEncodingFailed(error: Error)\n    }\n\n    /// The underlying reason the multipart encoding error occurred.\n    ///\n    /// - bodyPartURLInvalid:                   The `fileURL` provided for reading an encodable body part isn't a\n    ///                                         file URL.\n    /// - bodyPartFilenameInvalid:              The filename of the `fileURL` provided has either an empty\n    ///                                         `lastPathComponent` or `pathExtension.\n    /// - bodyPartFileNotReachable:             The file at the `fileURL` provided was not reachable.\n    /// - bodyPartFileNotReachableWithError:    Attempting to check the reachability of the `fileURL` provided threw\n    ///                                         an error.\n    /// - bodyPartFileIsDirectory:              The file at the `fileURL` provided is actually a directory.\n    /// - bodyPartFileSizeNotAvailable:         The size of the file at the `fileURL` provided was not returned by\n    ///                                         the system.\n    /// - bodyPartFileSizeQueryFailedWithError: The attempt to find the size of the file at the `fileURL` provided\n    ///                                         threw an error.\n    /// - bodyPartInputStreamCreationFailed:    An `InputStream` could not be created for the provided `fileURL`.\n    /// - outputStreamCreationFailed:           An `OutputStream` could not be created when attempting to write the\n    ///                                         encoded data to disk.\n    /// - outputStreamFileAlreadyExists:        The encoded body data could not be writtent disk because a file\n    ///                                         already exists at the provided `fileURL`.\n    /// - outputStreamURLInvalid:               The `fileURL` provided for writing the encoded body data to disk is\n    ///                                         not a file URL.\n    /// - outputStreamWriteFailed:              The attempt to write the encoded body data to disk failed with an\n    ///                                         underlying error.\n    /// - inputStreamReadFailed:                The attempt to read an encoded body part `InputStream` failed with\n    ///                                         underlying system error.\n    public enum MultipartEncodingFailureReason {\n        case bodyPartURLInvalid(url: URL)\n        case bodyPartFilenameInvalid(in: URL)\n        case bodyPartFileNotReachable(at: URL)\n        case bodyPartFileNotReachableWithError(atURL: URL, error: Error)\n        case bodyPartFileIsDirectory(at: URL)\n        case bodyPartFileSizeNotAvailable(at: URL)\n        case bodyPartFileSizeQueryFailedWithError(forURL: URL, error: Error)\n        case bodyPartInputStreamCreationFailed(for: URL)\n\n        case outputStreamCreationFailed(for: URL)\n        case outputStreamFileAlreadyExists(at: URL)\n        case outputStreamURLInvalid(url: URL)\n        case outputStreamWriteFailed(error: Error)\n\n        case inputStreamReadFailed(error: Error)\n    }\n\n    /// The underlying reason the response validation error occurred.\n    ///\n    /// - dataFileNil:             The data file containing the server response did not exist.\n    /// - dataFileReadFailed:      The data file containing the server response could not be read.\n    /// - missingContentType:      The response did not contain a `Content-Type` and the `acceptableContentTypes`\n    ///                            provided did not contain wildcard type.\n    /// - unacceptableContentType: The response `Content-Type` did not match any type in the provided\n    ///                            `acceptableContentTypes`.\n    /// - unacceptableStatusCode:  The response status code was not acceptable.\n    public enum ResponseValidationFailureReason {\n        case dataFileNil\n        case dataFileReadFailed(at: URL)\n        case missingContentType(acceptableContentTypes: [String])\n        case unacceptableContentType(acceptableContentTypes: [String], responseContentType: String)\n        case unacceptableStatusCode(code: Int)\n    }\n\n    /// The underlying reason the response serialization error occurred.\n    ///\n    /// - inputDataNil:                    The server response contained no data.\n    /// - inputDataNilOrZeroLength:        The server response contained no data or the data was zero length.\n    /// - inputFileNil:                    The file containing the server response did not exist.\n    /// - inputFileReadFailed:             The file containing the server response could not be read.\n    /// - stringSerializationFailed:       String serialization failed using the provided `String.Encoding`.\n    /// - jsonSerializationFailed:         JSON serialization failed with an underlying system error.\n    /// - propertyListSerializationFailed: Property list serialization failed with an underlying system error.\n    public enum ResponseSerializationFailureReason {\n        case inputDataNil\n        case inputDataNilOrZeroLength\n        case inputFileNil\n        case inputFileReadFailed(at: URL)\n        case stringSerializationFailed(encoding: String.Encoding)\n        case jsonSerializationFailed(error: Error)\n        case propertyListSerializationFailed(error: Error)\n    }\n\n    case invalidURL(url: URLConvertible)\n    case parameterEncodingFailed(reason: ParameterEncodingFailureReason)\n    case multipartEncodingFailed(reason: MultipartEncodingFailureReason)\n    case responseValidationFailed(reason: ResponseValidationFailureReason)\n    case responseSerializationFailed(reason: ResponseSerializationFailureReason)\n}\n\n// MARK: - Adapt Error\n\nstruct AdaptError: Error {\n    let error: Error\n}\n\nextension Error {\n    var underlyingAdaptError: Error? { return (self as? AdaptError)?.error }\n}\n\n// MARK: - Error Booleans\n\nextension AFError {\n    /// Returns whether the AFError is an invalid URL error.\n    public var isInvalidURLError: Bool {\n        if case .invalidURL = self { return true }\n        return false\n    }\n\n    /// Returns whether the AFError is a parameter encoding error. When `true`, the `underlyingError` property will\n    /// contain the associated value.\n    public var isParameterEncodingError: Bool {\n        if case .parameterEncodingFailed = self { return true }\n        return false\n    }\n\n    /// Returns whether the AFError is a multipart encoding error. When `true`, the `url` and `underlyingError` properties\n    /// will contain the associated values.\n    public var isMultipartEncodingError: Bool {\n        if case .multipartEncodingFailed = self { return true }\n        return false\n    }\n\n    /// Returns whether the `AFError` is a response validation error. When `true`, the `acceptableContentTypes`,\n    /// `responseContentType`, and `responseCode` properties will contain the associated values.\n    public var isResponseValidationError: Bool {\n        if case .responseValidationFailed = self { return true }\n        return false\n    }\n\n    /// Returns whether the `AFError` is a response serialization error. When `true`, the `failedStringEncoding` and\n    /// `underlyingError` properties will contain the associated values.\n    public var isResponseSerializationError: Bool {\n        if case .responseSerializationFailed = self { return true }\n        return false\n    }\n}\n\n// MARK: - Convenience Properties\n\nextension AFError {\n    /// The `URLConvertible` associated with the error.\n    public var urlConvertible: URLConvertible? {\n        switch self {\n        case .invalidURL(let url):\n            return url\n        default:\n            return nil\n        }\n    }\n\n    /// The `URL` associated with the error.\n    public var url: URL? {\n        switch self {\n        case .multipartEncodingFailed(let reason):\n            return reason.url\n        default:\n            return nil\n        }\n    }\n\n    /// The `Error` returned by a system framework associated with a `.parameterEncodingFailed`,\n    /// `.multipartEncodingFailed` or `.responseSerializationFailed` error.\n    public var underlyingError: Error? {\n        switch self {\n        case .parameterEncodingFailed(let reason):\n            return reason.underlyingError\n        case .multipartEncodingFailed(let reason):\n            return reason.underlyingError\n        case .responseSerializationFailed(let reason):\n            return reason.underlyingError\n        default:\n            return nil\n        }\n    }\n\n    /// The acceptable `Content-Type`s of a `.responseValidationFailed` error.\n    public var acceptableContentTypes: [String]? {\n        switch self {\n        case .responseValidationFailed(let reason):\n            return reason.acceptableContentTypes\n        default:\n            return nil\n        }\n    }\n\n    /// The response `Content-Type` of a `.responseValidationFailed` error.\n    public var responseContentType: String? {\n        switch self {\n        case .responseValidationFailed(let reason):\n            return reason.responseContentType\n        default:\n            return nil\n        }\n    }\n\n    /// The response code of a `.responseValidationFailed` error.\n    public var responseCode: Int? {\n        switch self {\n        case .responseValidationFailed(let reason):\n            return reason.responseCode\n        default:\n            return nil\n        }\n    }\n\n    /// The `String.Encoding` associated with a failed `.stringResponse()` call.\n    public var failedStringEncoding: String.Encoding? {\n        switch self {\n        case .responseSerializationFailed(let reason):\n            return reason.failedStringEncoding\n        default:\n            return nil\n        }\n    }\n}\n\nextension AFError.ParameterEncodingFailureReason {\n    var underlyingError: Error? {\n        switch self {\n        case .jsonEncodingFailed(let error), .propertyListEncodingFailed(let error):\n            return error\n        default:\n            return nil\n        }\n    }\n}\n\nextension AFError.MultipartEncodingFailureReason {\n    var url: URL? {\n        switch self {\n        case .bodyPartURLInvalid(let url), .bodyPartFilenameInvalid(let url), .bodyPartFileNotReachable(let url),\n             .bodyPartFileIsDirectory(let url), .bodyPartFileSizeNotAvailable(let url),\n             .bodyPartInputStreamCreationFailed(let url), .outputStreamCreationFailed(let url),\n             .outputStreamFileAlreadyExists(let url), .outputStreamURLInvalid(let url),\n             .bodyPartFileNotReachableWithError(let url, _), .bodyPartFileSizeQueryFailedWithError(let url, _):\n            return url\n        default:\n            return nil\n        }\n    }\n\n    var underlyingError: Error? {\n        switch self {\n        case .bodyPartFileNotReachableWithError(_, let error), .bodyPartFileSizeQueryFailedWithError(_, let error),\n             .outputStreamWriteFailed(let error), .inputStreamReadFailed(let error):\n            return error\n        default:\n            return nil\n        }\n    }\n}\n\nextension AFError.ResponseValidationFailureReason {\n    var acceptableContentTypes: [String]? {\n        switch self {\n        case .missingContentType(let types), .unacceptableContentType(let types, _):\n            return types\n        default:\n            return nil\n        }\n    }\n\n    var responseContentType: String? {\n        switch self {\n        case .unacceptableContentType(_, let responseType):\n            return responseType\n        default:\n            return nil\n        }\n    }\n\n    var responseCode: Int? {\n        switch self {\n        case .unacceptableStatusCode(let code):\n            return code\n        default:\n            return nil\n        }\n    }\n}\n\nextension AFError.ResponseSerializationFailureReason {\n    var failedStringEncoding: String.Encoding? {\n        switch self {\n        case .stringSerializationFailed(let encoding):\n            return encoding\n        default:\n            return nil\n        }\n    }\n\n    var underlyingError: Error? {\n        switch self {\n        case .jsonSerializationFailed(let error), .propertyListSerializationFailed(let error):\n            return error\n        default:\n            return nil\n        }\n    }\n}\n\n// MARK: - Error Descriptions\n\nextension AFError: LocalizedError {\n    public var errorDescription: String? {\n        switch self {\n        case .invalidURL(let url):\n            return \"URL is not valid: \\(url)\"\n        case .parameterEncodingFailed(let reason):\n            return reason.localizedDescription\n        case .multipartEncodingFailed(let reason):\n            return reason.localizedDescription\n        case .responseValidationFailed(let reason):\n            return reason.localizedDescription\n        case .responseSerializationFailed(let reason):\n            return reason.localizedDescription\n        }\n    }\n}\n\nextension AFError.ParameterEncodingFailureReason {\n    var localizedDescription: String {\n        switch self {\n        case .missingURL:\n            return \"URL request to encode was missing a URL\"\n        case .jsonEncodingFailed(let error):\n            return \"JSON could not be encoded because of error:\\n\\(error.localizedDescription)\"\n        case .propertyListEncodingFailed(let error):\n            return \"PropertyList could not be encoded because of error:\\n\\(error.localizedDescription)\"\n        }\n    }\n}\n\nextension AFError.MultipartEncodingFailureReason {\n    var localizedDescription: String {\n        switch self {\n        case .bodyPartURLInvalid(let url):\n            return \"The URL provided is not a file URL: \\(url)\"\n        case .bodyPartFilenameInvalid(let url):\n            return \"The URL provided does not have a valid filename: \\(url)\"\n        case .bodyPartFileNotReachable(let url):\n            return \"The URL provided is not reachable: \\(url)\"\n        case .bodyPartFileNotReachableWithError(let url, let error):\n            return (\n                \"The system returned an error while checking the provided URL for \" +\n                \"reachability.\\nURL: \\(url)\\nError: \\(error)\"\n            )\n        case .bodyPartFileIsDirectory(let url):\n            return \"The URL provided is a directory: \\(url)\"\n        case .bodyPartFileSizeNotAvailable(let url):\n            return \"Could not fetch the file size from the provided URL: \\(url)\"\n        case .bodyPartFileSizeQueryFailedWithError(let url, let error):\n            return (\n                \"The system returned an error while attempting to fetch the file size from the \" +\n                \"provided URL.\\nURL: \\(url)\\nError: \\(error)\"\n            )\n        case .bodyPartInputStreamCreationFailed(let url):\n            return \"Failed to create an InputStream for the provided URL: \\(url)\"\n        case .outputStreamCreationFailed(let url):\n            return \"Failed to create an OutputStream for URL: \\(url)\"\n        case .outputStreamFileAlreadyExists(let url):\n            return \"A file already exists at the provided URL: \\(url)\"\n        case .outputStreamURLInvalid(let url):\n            return \"The provided OutputStream URL is invalid: \\(url)\"\n        case .outputStreamWriteFailed(let error):\n            return \"OutputStream write failed with error: \\(error)\"\n        case .inputStreamReadFailed(let error):\n            return \"InputStream read failed with error: \\(error)\"\n        }\n    }\n}\n\nextension AFError.ResponseSerializationFailureReason {\n    var localizedDescription: String {\n        switch self {\n        case .inputDataNil:\n            return \"Response could not be serialized, input data was nil.\"\n        case .inputDataNilOrZeroLength:\n            return \"Response could not be serialized, input data was nil or zero length.\"\n        case .inputFileNil:\n            return \"Response could not be serialized, input file was nil.\"\n        case .inputFileReadFailed(let url):\n            return \"Response could not be serialized, input file could not be read: \\(url).\"\n        case .stringSerializationFailed(let encoding):\n            return \"String could not be serialized with encoding: \\(encoding).\"\n        case .jsonSerializationFailed(let error):\n            return \"JSON could not be serialized because of error:\\n\\(error.localizedDescription)\"\n        case .propertyListSerializationFailed(let error):\n            return \"PropertyList could not be serialized because of error:\\n\\(error.localizedDescription)\"\n        }\n    }\n}\n\nextension AFError.ResponseValidationFailureReason {\n    var localizedDescription: String {\n        switch self {\n        case .dataFileNil:\n            return \"Response could not be validated, data file was nil.\"\n        case .dataFileReadFailed(let url):\n            return \"Response could not be validated, data file could not be read: \\(url).\"\n        case .missingContentType(let types):\n            return (\n                \"Response Content-Type was missing and acceptable content types \" +\n                \"(\\(types.joined(separator: \",\"))) do not match \\\"*/*\\\".\"\n            )\n        case .unacceptableContentType(let acceptableTypes, let responseType):\n            return (\n                \"Response Content-Type \\\"\\(responseType)\\\" does not match any acceptable types: \" +\n                \"\\(acceptableTypes.joined(separator: \",\")).\"\n            )\n        case .unacceptableStatusCode(let code):\n            return \"Response status code was unacceptable: \\(code).\"\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/Alamofire.swift",
    "content": "//\n//  Alamofire.swift\n//\n//  Copyright (c) 2014-2017 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// Types adopting the `URLConvertible` protocol can be used to construct URLs, which are then used to construct\n/// URL requests.\npublic protocol URLConvertible {\n    /// Returns a URL that conforms to RFC 2396 or throws an `Error`.\n    ///\n    /// - throws: An `Error` if the type cannot be converted to a `URL`.\n    ///\n    /// - returns: A URL or throws an `Error`.\n    func asURL() throws -> URL\n}\n\nextension String: URLConvertible {\n    /// Returns a URL if `self` represents a valid URL string that conforms to RFC 2396 or throws an `AFError`.\n    ///\n    /// - throws: An `AFError.invalidURL` if `self` is not a valid URL string.\n    ///\n    /// - returns: A URL or throws an `AFError`.\n    public func asURL() throws -> URL {\n        guard let url = URL(string: self) else { throw AFError.invalidURL(url: self) }\n        return url\n    }\n}\n\nextension URL: URLConvertible {\n    /// Returns self.\n    public func asURL() throws -> URL { return self }\n}\n\nextension URLComponents: URLConvertible {\n    /// Returns a URL if `url` is not nil, otherwise throws an `Error`.\n    ///\n    /// - throws: An `AFError.invalidURL` if `url` is `nil`.\n    ///\n    /// - returns: A URL or throws an `AFError`.\n    public func asURL() throws -> URL {\n        guard let url = url else { throw AFError.invalidURL(url: self) }\n        return url\n    }\n}\n\n// MARK: -\n\n/// Types adopting the `URLRequestConvertible` protocol can be used to construct URL requests.\npublic protocol URLRequestConvertible {\n    /// Returns a URL request or throws if an `Error` was encountered.\n    ///\n    /// - throws: An `Error` if the underlying `URLRequest` is `nil`.\n    ///\n    /// - returns: A URL request.\n    func asURLRequest() throws -> URLRequest\n}\n\nextension URLRequestConvertible {\n    /// The URL request.\n    public var urlRequest: URLRequest? { return try? asURLRequest() }\n}\n\nextension URLRequest: URLRequestConvertible {\n    /// Returns a URL request or throws if an `Error` was encountered.\n    public func asURLRequest() throws -> URLRequest { return self }\n}\n\n// MARK: -\n\nextension URLRequest {\n    /// Creates an instance with the specified `method`, `urlString` and `headers`.\n    ///\n    /// - parameter url:     The URL.\n    /// - parameter method:  The HTTP method.\n    /// - parameter headers: The HTTP headers. `nil` by default.\n    ///\n    /// - returns: The new `URLRequest` instance.\n    public init(url: URLConvertible, method: HTTPMethod, headers: HTTPHeaders? = nil) throws {\n        let url = try url.asURL()\n\n        self.init(url: url)\n\n        httpMethod = method.rawValue\n\n        if let headers = headers {\n            for (headerField, headerValue) in headers {\n                setValue(headerValue, forHTTPHeaderField: headerField)\n            }\n        }\n    }\n\n    func adapt(using adapter: RequestAdapter?) throws -> URLRequest {\n        guard let adapter = adapter else { return self }\n        return try adapter.adapt(self)\n    }\n}\n\n// MARK: - Data Request\n\n/// Creates a `DataRequest` using the default `SessionManager` to retrieve the contents of the specified `url`,\n/// `method`, `parameters`, `encoding` and `headers`.\n///\n/// - parameter url:        The URL.\n/// - parameter method:     The HTTP method. `.get` by default.\n/// - parameter parameters: The parameters. `nil` by default.\n/// - parameter encoding:   The parameter encoding. `URLEncoding.default` by default.\n/// - parameter headers:    The HTTP headers. `nil` by default.\n///\n/// - returns: The created `DataRequest`.\n@discardableResult\npublic func request(\n    _ url: URLConvertible,\n    method: HTTPMethod = .get,\n    parameters: Parameters? = nil,\n    encoding: ParameterEncoding = URLEncoding.default,\n    headers: HTTPHeaders? = nil)\n    -> DataRequest\n{\n    return SessionManager.default.request(\n        url,\n        method: method,\n        parameters: parameters,\n        encoding: encoding,\n        headers: headers\n    )\n}\n\n/// Creates a `DataRequest` using the default `SessionManager` to retrieve the contents of a URL based on the\n/// specified `urlRequest`.\n///\n/// - parameter urlRequest: The URL request\n///\n/// - returns: The created `DataRequest`.\n@discardableResult\npublic func request(_ urlRequest: URLRequestConvertible) -> DataRequest {\n    return SessionManager.default.request(urlRequest)\n}\n\n// MARK: - Download Request\n\n// MARK: URL Request\n\n/// Creates a `DownloadRequest` using the default `SessionManager` to retrieve the contents of the specified `url`,\n/// `method`, `parameters`, `encoding`, `headers` and save them to the `destination`.\n///\n/// If `destination` is not specified, the contents will remain in the temporary location determined by the\n/// underlying URL session.\n///\n/// - parameter url:         The URL.\n/// - parameter method:      The HTTP method. `.get` by default.\n/// - parameter parameters:  The parameters. `nil` by default.\n/// - parameter encoding:    The parameter encoding. `URLEncoding.default` by default.\n/// - parameter headers:     The HTTP headers. `nil` by default.\n/// - parameter destination: The closure used to determine the destination of the downloaded file. `nil` by default.\n///\n/// - returns: The created `DownloadRequest`.\n@discardableResult\npublic func download(\n    _ url: URLConvertible,\n    method: HTTPMethod = .get,\n    parameters: Parameters? = nil,\n    encoding: ParameterEncoding = URLEncoding.default,\n    headers: HTTPHeaders? = nil,\n    to destination: DownloadRequest.DownloadFileDestination? = nil)\n    -> DownloadRequest\n{\n    return SessionManager.default.download(\n        url,\n        method: method,\n        parameters: parameters,\n        encoding: encoding,\n        headers: headers,\n        to: destination\n    )\n}\n\n/// Creates a `DownloadRequest` using the default `SessionManager` to retrieve the contents of a URL based on the\n/// specified `urlRequest` and save them to the `destination`.\n///\n/// If `destination` is not specified, the contents will remain in the temporary location determined by the\n/// underlying URL session.\n///\n/// - parameter urlRequest:  The URL request.\n/// - parameter destination: The closure used to determine the destination of the downloaded file. `nil` by default.\n///\n/// - returns: The created `DownloadRequest`.\n@discardableResult\npublic func download(\n    _ urlRequest: URLRequestConvertible,\n    to destination: DownloadRequest.DownloadFileDestination? = nil)\n    -> DownloadRequest\n{\n    return SessionManager.default.download(urlRequest, to: destination)\n}\n\n// MARK: Resume Data\n\n/// Creates a `DownloadRequest` using the default `SessionManager` from the `resumeData` produced from a\n/// previous request cancellation to retrieve the contents of the original request and save them to the `destination`.\n///\n/// If `destination` is not specified, the contents will remain in the temporary location determined by the\n/// underlying URL session.\n///\n/// On the latest release of all the Apple platforms (iOS 10, macOS 10.12, tvOS 10, watchOS 3), `resumeData` is broken\n/// on background URL session configurations. There's an underlying bug in the `resumeData` generation logic where the\n/// data is written incorrectly and will always fail to resume the download. For more information about the bug and\n/// possible workarounds, please refer to the following Stack Overflow post:\n///\n///    - http://stackoverflow.com/a/39347461/1342462\n///\n/// - parameter resumeData:  The resume data. This is an opaque data blob produced by `URLSessionDownloadTask`\n///                          when a task is cancelled. See `URLSession -downloadTask(withResumeData:)` for additional\n///                          information.\n/// - parameter destination: The closure used to determine the destination of the downloaded file. `nil` by default.\n///\n/// - returns: The created `DownloadRequest`.\n@discardableResult\npublic func download(\n    resumingWith resumeData: Data,\n    to destination: DownloadRequest.DownloadFileDestination? = nil)\n    -> DownloadRequest\n{\n    return SessionManager.default.download(resumingWith: resumeData, to: destination)\n}\n\n// MARK: - Upload Request\n\n// MARK: File\n\n/// Creates an `UploadRequest` using the default `SessionManager` from the specified `url`, `method` and `headers`\n/// for uploading the `file`.\n///\n/// - parameter file:    The file to upload.\n/// - parameter url:     The URL.\n/// - parameter method:  The HTTP method. `.post` by default.\n/// - parameter headers: The HTTP headers. `nil` by default.\n///\n/// - returns: The created `UploadRequest`.\n@discardableResult\npublic func upload(\n    _ fileURL: URL,\n    to url: URLConvertible,\n    method: HTTPMethod = .post,\n    headers: HTTPHeaders? = nil)\n    -> UploadRequest\n{\n    return SessionManager.default.upload(fileURL, to: url, method: method, headers: headers)\n}\n\n/// Creates a `UploadRequest` using the default `SessionManager` from the specified `urlRequest` for\n/// uploading the `file`.\n///\n/// - parameter file:       The file to upload.\n/// - parameter urlRequest: The URL request.\n///\n/// - returns: The created `UploadRequest`.\n@discardableResult\npublic func upload(_ fileURL: URL, with urlRequest: URLRequestConvertible) -> UploadRequest {\n    return SessionManager.default.upload(fileURL, with: urlRequest)\n}\n\n// MARK: Data\n\n/// Creates an `UploadRequest` using the default `SessionManager` from the specified `url`, `method` and `headers`\n/// for uploading the `data`.\n///\n/// - parameter data:    The data to upload.\n/// - parameter url:     The URL.\n/// - parameter method:  The HTTP method. `.post` by default.\n/// - parameter headers: The HTTP headers. `nil` by default.\n///\n/// - returns: The created `UploadRequest`.\n@discardableResult\npublic func upload(\n    _ data: Data,\n    to url: URLConvertible,\n    method: HTTPMethod = .post,\n    headers: HTTPHeaders? = nil)\n    -> UploadRequest\n{\n    return SessionManager.default.upload(data, to: url, method: method, headers: headers)\n}\n\n/// Creates an `UploadRequest` using the default `SessionManager` from the specified `urlRequest` for\n/// uploading the `data`.\n///\n/// - parameter data:       The data to upload.\n/// - parameter urlRequest: The URL request.\n///\n/// - returns: The created `UploadRequest`.\n@discardableResult\npublic func upload(_ data: Data, with urlRequest: URLRequestConvertible) -> UploadRequest {\n    return SessionManager.default.upload(data, with: urlRequest)\n}\n\n// MARK: InputStream\n\n/// Creates an `UploadRequest` using the default `SessionManager` from the specified `url`, `method` and `headers`\n/// for uploading the `stream`.\n///\n/// - parameter stream:  The stream to upload.\n/// - parameter url:     The URL.\n/// - parameter method:  The HTTP method. `.post` by default.\n/// - parameter headers: The HTTP headers. `nil` by default.\n///\n/// - returns: The created `UploadRequest`.\n@discardableResult\npublic func upload(\n    _ stream: InputStream,\n    to url: URLConvertible,\n    method: HTTPMethod = .post,\n    headers: HTTPHeaders? = nil)\n    -> UploadRequest\n{\n    return SessionManager.default.upload(stream, to: url, method: method, headers: headers)\n}\n\n/// Creates an `UploadRequest` using the default `SessionManager` from the specified `urlRequest` for\n/// uploading the `stream`.\n///\n/// - parameter urlRequest: The URL request.\n/// - parameter stream:     The stream to upload.\n///\n/// - returns: The created `UploadRequest`.\n@discardableResult\npublic func upload(_ stream: InputStream, with urlRequest: URLRequestConvertible) -> UploadRequest {\n    return SessionManager.default.upload(stream, with: urlRequest)\n}\n\n// MARK: MultipartFormData\n\n/// Encodes `multipartFormData` using `encodingMemoryThreshold` with the default `SessionManager` and calls\n/// `encodingCompletion` with new `UploadRequest` using the `url`, `method` and `headers`.\n///\n/// It is important to understand the memory implications of uploading `MultipartFormData`. If the cummulative\n/// payload is small, encoding the data in-memory and directly uploading to a server is the by far the most\n/// efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to\n/// be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory\n/// footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be\n/// used for larger payloads such as video content.\n///\n/// The `encodingMemoryThreshold` parameter allows Alamofire to automatically determine whether to encode in-memory\n/// or stream from disk. If the content length of the `MultipartFormData` is below the `encodingMemoryThreshold`,\n/// encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk\n/// during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding\n/// technique was used.\n///\n/// - parameter multipartFormData:       The closure used to append body parts to the `MultipartFormData`.\n/// - parameter encodingMemoryThreshold: The encoding memory threshold in bytes.\n///                                      `multipartFormDataEncodingMemoryThreshold` by default.\n/// - parameter url:                     The URL.\n/// - parameter method:                  The HTTP method. `.post` by default.\n/// - parameter headers:                 The HTTP headers. `nil` by default.\n/// - parameter encodingCompletion:      The closure called when the `MultipartFormData` encoding is complete.\npublic func upload(\n    multipartFormData: @escaping (MultipartFormData) -> Void,\n    usingThreshold encodingMemoryThreshold: UInt64 = SessionManager.multipartFormDataEncodingMemoryThreshold,\n    to url: URLConvertible,\n    method: HTTPMethod = .post,\n    headers: HTTPHeaders? = nil,\n    encodingCompletion: ((SessionManager.MultipartFormDataEncodingResult) -> Void)?)\n{\n    return SessionManager.default.upload(\n        multipartFormData: multipartFormData,\n        usingThreshold: encodingMemoryThreshold,\n        to: url,\n        method: method,\n        headers: headers,\n        encodingCompletion: encodingCompletion\n    )\n}\n\n/// Encodes `multipartFormData` using `encodingMemoryThreshold` and the default `SessionManager` and\n/// calls `encodingCompletion` with new `UploadRequest` using the `urlRequest`.\n///\n/// It is important to understand the memory implications of uploading `MultipartFormData`. If the cummulative\n/// payload is small, encoding the data in-memory and directly uploading to a server is the by far the most\n/// efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to\n/// be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory\n/// footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be\n/// used for larger payloads such as video content.\n///\n/// The `encodingMemoryThreshold` parameter allows Alamofire to automatically determine whether to encode in-memory\n/// or stream from disk. If the content length of the `MultipartFormData` is below the `encodingMemoryThreshold`,\n/// encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk\n/// during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding\n/// technique was used.\n///\n/// - parameter multipartFormData:       The closure used to append body parts to the `MultipartFormData`.\n/// - parameter encodingMemoryThreshold: The encoding memory threshold in bytes.\n///                                      `multipartFormDataEncodingMemoryThreshold` by default.\n/// - parameter urlRequest:              The URL request.\n/// - parameter encodingCompletion:      The closure called when the `MultipartFormData` encoding is complete.\npublic func upload(\n    multipartFormData: @escaping (MultipartFormData) -> Void,\n    usingThreshold encodingMemoryThreshold: UInt64 = SessionManager.multipartFormDataEncodingMemoryThreshold,\n    with urlRequest: URLRequestConvertible,\n    encodingCompletion: ((SessionManager.MultipartFormDataEncodingResult) -> Void)?)\n{\n    return SessionManager.default.upload(\n        multipartFormData: multipartFormData,\n        usingThreshold: encodingMemoryThreshold,\n        with: urlRequest,\n        encodingCompletion: encodingCompletion\n    )\n}\n\n#if !os(watchOS)\n\n// MARK: - Stream Request\n\n// MARK: Hostname and Port\n\n/// Creates a `StreamRequest` using the default `SessionManager` for bidirectional streaming with the `hostname`\n/// and `port`.\n///\n/// If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n///\n/// - parameter hostName: The hostname of the server to connect to.\n/// - parameter port:     The port of the server to connect to.\n///\n/// - returns: The created `StreamRequest`.\n@discardableResult\n@available(iOS 9.0, macOS 10.11, tvOS 9.0, *)\npublic func stream(withHostName hostName: String, port: Int) -> StreamRequest {\n    return SessionManager.default.stream(withHostName: hostName, port: port)\n}\n\n// MARK: NetService\n\n/// Creates a `StreamRequest` using the default `SessionManager` for bidirectional streaming with the `netService`.\n///\n/// If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n///\n/// - parameter netService: The net service used to identify the endpoint.\n///\n/// - returns: The created `StreamRequest`.\n@discardableResult\n@available(iOS 9.0, macOS 10.11, tvOS 9.0, *)\npublic func stream(with netService: NetService) -> StreamRequest {\n    return SessionManager.default.stream(with: netService)\n}\n\n#endif\n"
  },
  {
    "path": "Pods/Alamofire/Source/DispatchQueue+Alamofire.swift",
    "content": "//\n//  DispatchQueue+Alamofire.swift\n//\n//  Copyright (c) 2014-2017 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Dispatch\nimport Foundation\n\nextension DispatchQueue {\n    static var userInteractive: DispatchQueue { return DispatchQueue.global(qos: .userInteractive) }\n    static var userInitiated: DispatchQueue { return DispatchQueue.global(qos: .userInitiated) }\n    static var utility: DispatchQueue { return DispatchQueue.global(qos: .utility) }\n    static var background: DispatchQueue { return DispatchQueue.global(qos: .background) }\n\n    func after(_ delay: TimeInterval, execute closure: @escaping () -> Void) {\n        asyncAfter(deadline: .now() + delay, execute: closure)\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/MultipartFormData.swift",
    "content": "//\n//  MultipartFormData.swift\n//\n//  Copyright (c) 2014-2017 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n#if os(iOS) || os(watchOS) || os(tvOS)\nimport MobileCoreServices\n#elseif os(macOS)\nimport CoreServices\n#endif\n\n/// Constructs `multipart/form-data` for uploads within an HTTP or HTTPS body. There are currently two ways to encode\n/// multipart form data. The first way is to encode the data directly in memory. This is very efficient, but can lead\n/// to memory issues if the dataset is too large. The second way is designed for larger datasets and will write all the\n/// data to a single file on disk with all the proper boundary segmentation. The second approach MUST be used for\n/// larger datasets such as video content, otherwise your app may run out of memory when trying to encode the dataset.\n///\n/// For more information on `multipart/form-data` in general, please refer to the RFC-2388 and RFC-2045 specs as well\n/// and the w3 form documentation.\n///\n/// - https://www.ietf.org/rfc/rfc2388.txt\n/// - https://www.ietf.org/rfc/rfc2045.txt\n/// - https://www.w3.org/TR/html401/interact/forms.html#h-17.13\nopen class MultipartFormData {\n\n    // MARK: - Helper Types\n\n    struct EncodingCharacters {\n        static let crlf = \"\\r\\n\"\n    }\n\n    struct BoundaryGenerator {\n        enum BoundaryType {\n            case initial, encapsulated, final\n        }\n\n        static func randomBoundary() -> String {\n            return String(format: \"alamofire.boundary.%08x%08x\", arc4random(), arc4random())\n        }\n\n        static func boundaryData(forBoundaryType boundaryType: BoundaryType, boundary: String) -> Data {\n            let boundaryText: String\n\n            switch boundaryType {\n            case .initial:\n                boundaryText = \"--\\(boundary)\\(EncodingCharacters.crlf)\"\n            case .encapsulated:\n                boundaryText = \"\\(EncodingCharacters.crlf)--\\(boundary)\\(EncodingCharacters.crlf)\"\n            case .final:\n                boundaryText = \"\\(EncodingCharacters.crlf)--\\(boundary)--\\(EncodingCharacters.crlf)\"\n            }\n\n            return boundaryText.data(using: String.Encoding.utf8, allowLossyConversion: false)!\n        }\n    }\n\n    class BodyPart {\n        let headers: HTTPHeaders\n        let bodyStream: InputStream\n        let bodyContentLength: UInt64\n        var hasInitialBoundary = false\n        var hasFinalBoundary = false\n\n        init(headers: HTTPHeaders, bodyStream: InputStream, bodyContentLength: UInt64) {\n            self.headers = headers\n            self.bodyStream = bodyStream\n            self.bodyContentLength = bodyContentLength\n        }\n    }\n\n    // MARK: - Properties\n\n    /// The `Content-Type` header value containing the boundary used to generate the `multipart/form-data`.\n    open lazy var contentType: String = \"multipart/form-data; boundary=\\(self.boundary)\"\n\n    /// The content length of all body parts used to generate the `multipart/form-data` not including the boundaries.\n    public var contentLength: UInt64 { return bodyParts.reduce(0) { $0 + $1.bodyContentLength } }\n\n    /// The boundary used to separate the body parts in the encoded form data.\n    public let boundary: String\n\n    private var bodyParts: [BodyPart]\n    private var bodyPartError: AFError?\n    private let streamBufferSize: Int\n\n    // MARK: - Lifecycle\n\n    /// Creates a multipart form data object.\n    ///\n    /// - returns: The multipart form data object.\n    public init() {\n        self.boundary = BoundaryGenerator.randomBoundary()\n        self.bodyParts = []\n\n        ///\n        /// The optimal read/write buffer size in bytes for input and output streams is 1024 (1KB). For more\n        /// information, please refer to the following article:\n        ///   - https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Streams/Articles/ReadingInputStreams.html\n        ///\n\n        self.streamBufferSize = 1024\n    }\n\n    // MARK: - Body Parts\n\n    /// Creates a body part from the data and appends it to the multipart form data object.\n    ///\n    /// The body part data will be encoded using the following format:\n    ///\n    /// - `Content-Disposition: form-data; name=#{name}` (HTTP Header)\n    /// - Encoded data\n    /// - Multipart form boundary\n    ///\n    /// - parameter data: The data to encode into the multipart form data.\n    /// - parameter name: The name to associate with the data in the `Content-Disposition` HTTP header.\n    public func append(_ data: Data, withName name: String) {\n        let headers = contentHeaders(withName: name)\n        let stream = InputStream(data: data)\n        let length = UInt64(data.count)\n\n        append(stream, withLength: length, headers: headers)\n    }\n\n    /// Creates a body part from the data and appends it to the multipart form data object.\n    ///\n    /// The body part data will be encoded using the following format:\n    ///\n    /// - `Content-Disposition: form-data; name=#{name}` (HTTP Header)\n    /// - `Content-Type: #{generated mimeType}` (HTTP Header)\n    /// - Encoded data\n    /// - Multipart form boundary\n    ///\n    /// - parameter data:     The data to encode into the multipart form data.\n    /// - parameter name:     The name to associate with the data in the `Content-Disposition` HTTP header.\n    /// - parameter mimeType: The MIME type to associate with the data content type in the `Content-Type` HTTP header.\n    public func append(_ data: Data, withName name: String, mimeType: String) {\n        let headers = contentHeaders(withName: name, mimeType: mimeType)\n        let stream = InputStream(data: data)\n        let length = UInt64(data.count)\n\n        append(stream, withLength: length, headers: headers)\n    }\n\n    /// Creates a body part from the data and appends it to the multipart form data object.\n    ///\n    /// The body part data will be encoded using the following format:\n    ///\n    /// - `Content-Disposition: form-data; name=#{name}; filename=#{filename}` (HTTP Header)\n    /// - `Content-Type: #{mimeType}` (HTTP Header)\n    /// - Encoded file data\n    /// - Multipart form boundary\n    ///\n    /// - parameter data:     The data to encode into the multipart form data.\n    /// - parameter name:     The name to associate with the data in the `Content-Disposition` HTTP header.\n    /// - parameter fileName: The filename to associate with the data in the `Content-Disposition` HTTP header.\n    /// - parameter mimeType: The MIME type to associate with the data in the `Content-Type` HTTP header.\n    public func append(_ data: Data, withName name: String, fileName: String, mimeType: String) {\n        let headers = contentHeaders(withName: name, fileName: fileName, mimeType: mimeType)\n        let stream = InputStream(data: data)\n        let length = UInt64(data.count)\n\n        append(stream, withLength: length, headers: headers)\n    }\n\n    /// Creates a body part from the file and appends it to the multipart form data object.\n    ///\n    /// The body part data will be encoded using the following format:\n    ///\n    /// - `Content-Disposition: form-data; name=#{name}; filename=#{generated filename}` (HTTP Header)\n    /// - `Content-Type: #{generated mimeType}` (HTTP Header)\n    /// - Encoded file data\n    /// - Multipart form boundary\n    ///\n    /// The filename in the `Content-Disposition` HTTP header is generated from the last path component of the\n    /// `fileURL`. The `Content-Type` HTTP header MIME type is generated by mapping the `fileURL` extension to the\n    /// system associated MIME type.\n    ///\n    /// - parameter fileURL: The URL of the file whose content will be encoded into the multipart form data.\n    /// - parameter name:    The name to associate with the file content in the `Content-Disposition` HTTP header.\n    public func append(_ fileURL: URL, withName name: String) {\n        let fileName = fileURL.lastPathComponent\n        let pathExtension = fileURL.pathExtension\n\n        if !fileName.isEmpty && !pathExtension.isEmpty {\n            let mime = mimeType(forPathExtension: pathExtension)\n            append(fileURL, withName: name, fileName: fileName, mimeType: mime)\n        } else {\n            setBodyPartError(withReason: .bodyPartFilenameInvalid(in: fileURL))\n        }\n    }\n\n    /// Creates a body part from the file and appends it to the multipart form data object.\n    ///\n    /// The body part data will be encoded using the following format:\n    ///\n    /// - Content-Disposition: form-data; name=#{name}; filename=#{filename} (HTTP Header)\n    /// - Content-Type: #{mimeType} (HTTP Header)\n    /// - Encoded file data\n    /// - Multipart form boundary\n    ///\n    /// - parameter fileURL:  The URL of the file whose content will be encoded into the multipart form data.\n    /// - parameter name:     The name to associate with the file content in the `Content-Disposition` HTTP header.\n    /// - parameter fileName: The filename to associate with the file content in the `Content-Disposition` HTTP header.\n    /// - parameter mimeType: The MIME type to associate with the file content in the `Content-Type` HTTP header.\n    public func append(_ fileURL: URL, withName name: String, fileName: String, mimeType: String) {\n        let headers = contentHeaders(withName: name, fileName: fileName, mimeType: mimeType)\n\n        //============================================================\n        //                 Check 1 - is file URL?\n        //============================================================\n\n        guard fileURL.isFileURL else {\n            setBodyPartError(withReason: .bodyPartURLInvalid(url: fileURL))\n            return\n        }\n\n        //============================================================\n        //              Check 2 - is file URL reachable?\n        //============================================================\n\n        do {\n            let isReachable = try fileURL.checkPromisedItemIsReachable()\n            guard isReachable else {\n                setBodyPartError(withReason: .bodyPartFileNotReachable(at: fileURL))\n                return\n            }\n        } catch {\n            setBodyPartError(withReason: .bodyPartFileNotReachableWithError(atURL: fileURL, error: error))\n            return\n        }\n\n        //============================================================\n        //            Check 3 - is file URL a directory?\n        //============================================================\n\n        var isDirectory: ObjCBool = false\n        let path = fileURL.path\n\n        guard FileManager.default.fileExists(atPath: path, isDirectory: &isDirectory) && !isDirectory.boolValue else {\n            setBodyPartError(withReason: .bodyPartFileIsDirectory(at: fileURL))\n            return\n        }\n\n        //============================================================\n        //          Check 4 - can the file size be extracted?\n        //============================================================\n\n        let bodyContentLength: UInt64\n\n        do {\n            guard let fileSize = try FileManager.default.attributesOfItem(atPath: path)[.size] as? NSNumber else {\n                setBodyPartError(withReason: .bodyPartFileSizeNotAvailable(at: fileURL))\n                return\n            }\n\n            bodyContentLength = fileSize.uint64Value\n        }\n        catch {\n            setBodyPartError(withReason: .bodyPartFileSizeQueryFailedWithError(forURL: fileURL, error: error))\n            return\n        }\n\n        //============================================================\n        //       Check 5 - can a stream be created from file URL?\n        //============================================================\n\n        guard let stream = InputStream(url: fileURL) else {\n            setBodyPartError(withReason: .bodyPartInputStreamCreationFailed(for: fileURL))\n            return\n        }\n\n        append(stream, withLength: bodyContentLength, headers: headers)\n    }\n\n    /// Creates a body part from the stream and appends it to the multipart form data object.\n    ///\n    /// The body part data will be encoded using the following format:\n    ///\n    /// - `Content-Disposition: form-data; name=#{name}; filename=#{filename}` (HTTP Header)\n    /// - `Content-Type: #{mimeType}` (HTTP Header)\n    /// - Encoded stream data\n    /// - Multipart form boundary\n    ///\n    /// - parameter stream:   The input stream to encode in the multipart form data.\n    /// - parameter length:   The content length of the stream.\n    /// - parameter name:     The name to associate with the stream content in the `Content-Disposition` HTTP header.\n    /// - parameter fileName: The filename to associate with the stream content in the `Content-Disposition` HTTP header.\n    /// - parameter mimeType: The MIME type to associate with the stream content in the `Content-Type` HTTP header.\n    public func append(\n        _ stream: InputStream,\n        withLength length: UInt64,\n        name: String,\n        fileName: String,\n        mimeType: String)\n    {\n        let headers = contentHeaders(withName: name, fileName: fileName, mimeType: mimeType)\n        append(stream, withLength: length, headers: headers)\n    }\n\n    /// Creates a body part with the headers, stream and length and appends it to the multipart form data object.\n    ///\n    /// The body part data will be encoded using the following format:\n    ///\n    /// - HTTP headers\n    /// - Encoded stream data\n    /// - Multipart form boundary\n    ///\n    /// - parameter stream:  The input stream to encode in the multipart form data.\n    /// - parameter length:  The content length of the stream.\n    /// - parameter headers: The HTTP headers for the body part.\n    public func append(_ stream: InputStream, withLength length: UInt64, headers: HTTPHeaders) {\n        let bodyPart = BodyPart(headers: headers, bodyStream: stream, bodyContentLength: length)\n        bodyParts.append(bodyPart)\n    }\n\n    // MARK: - Data Encoding\n\n    /// Encodes all the appended body parts into a single `Data` value.\n    ///\n    /// It is important to note that this method will load all the appended body parts into memory all at the same\n    /// time. This method should only be used when the encoded data will have a small memory footprint. For large data\n    /// cases, please use the `writeEncodedDataToDisk(fileURL:completionHandler:)` method.\n    ///\n    /// - throws: An `AFError` if encoding encounters an error.\n    ///\n    /// - returns: The encoded `Data` if encoding is successful.\n    public func encode() throws -> Data {\n        if let bodyPartError = bodyPartError {\n            throw bodyPartError\n        }\n\n        var encoded = Data()\n\n        bodyParts.first?.hasInitialBoundary = true\n        bodyParts.last?.hasFinalBoundary = true\n\n        for bodyPart in bodyParts {\n            let encodedData = try encode(bodyPart)\n            encoded.append(encodedData)\n        }\n\n        return encoded\n    }\n\n    /// Writes the appended body parts into the given file URL.\n    ///\n    /// This process is facilitated by reading and writing with input and output streams, respectively. Thus,\n    /// this approach is very memory efficient and should be used for large body part data.\n    ///\n    /// - parameter fileURL: The file URL to write the multipart form data into.\n    ///\n    /// - throws: An `AFError` if encoding encounters an error.\n    public func writeEncodedData(to fileURL: URL) throws {\n        if let bodyPartError = bodyPartError {\n            throw bodyPartError\n        }\n\n        if FileManager.default.fileExists(atPath: fileURL.path) {\n            throw AFError.multipartEncodingFailed(reason: .outputStreamFileAlreadyExists(at: fileURL))\n        } else if !fileURL.isFileURL {\n            throw AFError.multipartEncodingFailed(reason: .outputStreamURLInvalid(url: fileURL))\n        }\n\n        guard let outputStream = OutputStream(url: fileURL, append: false) else {\n            throw AFError.multipartEncodingFailed(reason: .outputStreamCreationFailed(for: fileURL))\n        }\n\n        outputStream.open()\n        defer { outputStream.close() }\n\n        self.bodyParts.first?.hasInitialBoundary = true\n        self.bodyParts.last?.hasFinalBoundary = true\n\n        for bodyPart in self.bodyParts {\n            try write(bodyPart, to: outputStream)\n        }\n    }\n\n    // MARK: - Private - Body Part Encoding\n\n    private func encode(_ bodyPart: BodyPart) throws -> Data {\n        var encoded = Data()\n\n        let initialData = bodyPart.hasInitialBoundary ? initialBoundaryData() : encapsulatedBoundaryData()\n        encoded.append(initialData)\n\n        let headerData = encodeHeaders(for: bodyPart)\n        encoded.append(headerData)\n\n        let bodyStreamData = try encodeBodyStream(for: bodyPart)\n        encoded.append(bodyStreamData)\n\n        if bodyPart.hasFinalBoundary {\n            encoded.append(finalBoundaryData())\n        }\n\n        return encoded\n    }\n\n    private func encodeHeaders(for bodyPart: BodyPart) -> Data {\n        var headerText = \"\"\n\n        for (key, value) in bodyPart.headers {\n            headerText += \"\\(key): \\(value)\\(EncodingCharacters.crlf)\"\n        }\n        headerText += EncodingCharacters.crlf\n\n        return headerText.data(using: String.Encoding.utf8, allowLossyConversion: false)!\n    }\n\n    private func encodeBodyStream(for bodyPart: BodyPart) throws -> Data {\n        let inputStream = bodyPart.bodyStream\n        inputStream.open()\n        defer { inputStream.close() }\n\n        var encoded = Data()\n\n        while inputStream.hasBytesAvailable {\n            var buffer = [UInt8](repeating: 0, count: streamBufferSize)\n            let bytesRead = inputStream.read(&buffer, maxLength: streamBufferSize)\n\n            if let error = inputStream.streamError {\n                throw AFError.multipartEncodingFailed(reason: .inputStreamReadFailed(error: error))\n            }\n\n            if bytesRead > 0 {\n                encoded.append(buffer, count: bytesRead)\n            } else {\n                break\n            }\n        }\n\n        return encoded\n    }\n\n    // MARK: - Private - Writing Body Part to Output Stream\n\n    private func write(_ bodyPart: BodyPart, to outputStream: OutputStream) throws {\n        try writeInitialBoundaryData(for: bodyPart, to: outputStream)\n        try writeHeaderData(for: bodyPart, to: outputStream)\n        try writeBodyStream(for: bodyPart, to: outputStream)\n        try writeFinalBoundaryData(for: bodyPart, to: outputStream)\n    }\n\n    private func writeInitialBoundaryData(for bodyPart: BodyPart, to outputStream: OutputStream) throws {\n        let initialData = bodyPart.hasInitialBoundary ? initialBoundaryData() : encapsulatedBoundaryData()\n        return try write(initialData, to: outputStream)\n    }\n\n    private func writeHeaderData(for bodyPart: BodyPart, to outputStream: OutputStream) throws {\n        let headerData = encodeHeaders(for: bodyPart)\n        return try write(headerData, to: outputStream)\n    }\n\n    private func writeBodyStream(for bodyPart: BodyPart, to outputStream: OutputStream) throws {\n        let inputStream = bodyPart.bodyStream\n\n        inputStream.open()\n        defer { inputStream.close() }\n\n        while inputStream.hasBytesAvailable {\n            var buffer = [UInt8](repeating: 0, count: streamBufferSize)\n            let bytesRead = inputStream.read(&buffer, maxLength: streamBufferSize)\n\n            if let streamError = inputStream.streamError {\n                throw AFError.multipartEncodingFailed(reason: .inputStreamReadFailed(error: streamError))\n            }\n\n            if bytesRead > 0 {\n                if buffer.count != bytesRead {\n                    buffer = Array(buffer[0..<bytesRead])\n                }\n\n                try write(&buffer, to: outputStream)\n            } else {\n                break\n            }\n        }\n    }\n\n    private func writeFinalBoundaryData(for bodyPart: BodyPart, to outputStream: OutputStream) throws {\n        if bodyPart.hasFinalBoundary {\n            return try write(finalBoundaryData(), to: outputStream)\n        }\n    }\n\n    // MARK: - Private - Writing Buffered Data to Output Stream\n\n    private func write(_ data: Data, to outputStream: OutputStream) throws {\n        var buffer = [UInt8](repeating: 0, count: data.count)\n        data.copyBytes(to: &buffer, count: data.count)\n\n        return try write(&buffer, to: outputStream)\n    }\n\n    private func write(_ buffer: inout [UInt8], to outputStream: OutputStream) throws {\n        var bytesToWrite = buffer.count\n\n        while bytesToWrite > 0, outputStream.hasSpaceAvailable {\n            let bytesWritten = outputStream.write(buffer, maxLength: bytesToWrite)\n\n            if let error = outputStream.streamError {\n                throw AFError.multipartEncodingFailed(reason: .outputStreamWriteFailed(error: error))\n            }\n\n            bytesToWrite -= bytesWritten\n\n            if bytesToWrite > 0 {\n                buffer = Array(buffer[bytesWritten..<buffer.count])\n            }\n        }\n    }\n\n    // MARK: - Private - Mime Type\n\n    private func mimeType(forPathExtension pathExtension: String) -> String {\n        if\n            let id = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension as CFString, nil)?.takeRetainedValue(),\n            let contentType = UTTypeCopyPreferredTagWithClass(id, kUTTagClassMIMEType)?.takeRetainedValue()\n        {\n            return contentType as String\n        }\n\n        return \"application/octet-stream\"\n    }\n\n    // MARK: - Private - Content Headers\n\n    private func contentHeaders(withName name: String, fileName: String? = nil, mimeType: String? = nil) -> [String: String] {\n        var disposition = \"form-data; name=\\\"\\(name)\\\"\"\n        if let fileName = fileName { disposition += \"; filename=\\\"\\(fileName)\\\"\" }\n\n        var headers = [\"Content-Disposition\": disposition]\n        if let mimeType = mimeType { headers[\"Content-Type\"] = mimeType }\n\n        return headers\n    }\n\n    // MARK: - Private - Boundary Encoding\n\n    private func initialBoundaryData() -> Data {\n        return BoundaryGenerator.boundaryData(forBoundaryType: .initial, boundary: boundary)\n    }\n\n    private func encapsulatedBoundaryData() -> Data {\n        return BoundaryGenerator.boundaryData(forBoundaryType: .encapsulated, boundary: boundary)\n    }\n\n    private func finalBoundaryData() -> Data {\n        return BoundaryGenerator.boundaryData(forBoundaryType: .final, boundary: boundary)\n    }\n\n    // MARK: - Private - Errors\n\n    private func setBodyPartError(withReason reason: AFError.MultipartEncodingFailureReason) {\n        guard bodyPartError == nil else { return }\n        bodyPartError = AFError.multipartEncodingFailed(reason: reason)\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/NetworkReachabilityManager.swift",
    "content": "//\n//  NetworkReachabilityManager.swift\n//\n//  Copyright (c) 2014-2017 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\n#if !os(watchOS)\n\nimport Foundation\nimport SystemConfiguration\n\n/// The `NetworkReachabilityManager` class listens for reachability changes of hosts and addresses for both WWAN and\n/// WiFi network interfaces.\n///\n/// Reachability can be used to determine background information about why a network operation failed, or to retry\n/// network requests when a connection is established. It should not be used to prevent a user from initiating a network\n/// request, as it's possible that an initial request may be required to establish reachability.\npublic class NetworkReachabilityManager {\n    /// Defines the various states of network reachability.\n    ///\n    /// - unknown:      It is unknown whether the network is reachable.\n    /// - notReachable: The network is not reachable.\n    /// - reachable:    The network is reachable.\n    public enum NetworkReachabilityStatus {\n        case unknown\n        case notReachable\n        case reachable(ConnectionType)\n    }\n\n    /// Defines the various connection types detected by reachability flags.\n    ///\n    /// - ethernetOrWiFi: The connection type is either over Ethernet or WiFi.\n    /// - wwan:           The connection type is a WWAN connection.\n    public enum ConnectionType {\n        case ethernetOrWiFi\n        case wwan\n    }\n\n    /// A closure executed when the network reachability status changes. The closure takes a single argument: the\n    /// network reachability status.\n    public typealias Listener = (NetworkReachabilityStatus) -> Void\n\n    // MARK: - Properties\n\n    /// Whether the network is currently reachable.\n    public var isReachable: Bool { return isReachableOnWWAN || isReachableOnEthernetOrWiFi }\n\n    /// Whether the network is currently reachable over the WWAN interface.\n    public var isReachableOnWWAN: Bool { return networkReachabilityStatus == .reachable(.wwan) }\n\n    /// Whether the network is currently reachable over Ethernet or WiFi interface.\n    public var isReachableOnEthernetOrWiFi: Bool { return networkReachabilityStatus == .reachable(.ethernetOrWiFi) }\n\n    /// The current network reachability status.\n    public var networkReachabilityStatus: NetworkReachabilityStatus {\n        guard let flags = self.flags else { return .unknown }\n        return networkReachabilityStatusForFlags(flags)\n    }\n\n    /// The dispatch queue to execute the `listener` closure on.\n    public var listenerQueue: DispatchQueue = DispatchQueue.main\n\n    /// A closure executed when the network reachability status changes.\n    public var listener: Listener?\n\n    private var flags: SCNetworkReachabilityFlags? {\n        var flags = SCNetworkReachabilityFlags()\n\n        if SCNetworkReachabilityGetFlags(reachability, &flags) {\n            return flags\n        }\n\n        return nil\n    }\n\n    private let reachability: SCNetworkReachability\n    private var previousFlags: SCNetworkReachabilityFlags\n\n    // MARK: - Initialization\n\n    /// Creates a `NetworkReachabilityManager` instance with the specified host.\n    ///\n    /// - parameter host: The host used to evaluate network reachability.\n    ///\n    /// - returns: The new `NetworkReachabilityManager` instance.\n    public convenience init?(host: String) {\n        guard let reachability = SCNetworkReachabilityCreateWithName(nil, host) else { return nil }\n        self.init(reachability: reachability)\n    }\n\n    /// Creates a `NetworkReachabilityManager` instance that monitors the address 0.0.0.0.\n    ///\n    /// Reachability treats the 0.0.0.0 address as a special token that causes it to monitor the general routing\n    /// status of the device, both IPv4 and IPv6.\n    ///\n    /// - returns: The new `NetworkReachabilityManager` instance.\n    public convenience init?() {\n        var address = sockaddr_in()\n        address.sin_len = UInt8(MemoryLayout<sockaddr_in>.size)\n        address.sin_family = sa_family_t(AF_INET)\n\n        guard let reachability = withUnsafePointer(to: &address, { pointer in\n            return pointer.withMemoryRebound(to: sockaddr.self, capacity: MemoryLayout<sockaddr>.size) {\n                return SCNetworkReachabilityCreateWithAddress(nil, $0)\n            }\n        }) else { return nil }\n\n        self.init(reachability: reachability)\n    }\n\n    private init(reachability: SCNetworkReachability) {\n        self.reachability = reachability\n        self.previousFlags = SCNetworkReachabilityFlags()\n    }\n\n    deinit {\n        stopListening()\n    }\n\n    // MARK: - Listening\n\n    /// Starts listening for changes in network reachability status.\n    ///\n    /// - returns: `true` if listening was started successfully, `false` otherwise.\n    @discardableResult\n    public func startListening() -> Bool {\n        var context = SCNetworkReachabilityContext(version: 0, info: nil, retain: nil, release: nil, copyDescription: nil)\n        context.info = Unmanaged.passUnretained(self).toOpaque()\n\n        let callbackEnabled = SCNetworkReachabilitySetCallback(\n            reachability,\n            { (_, flags, info) in\n                let reachability = Unmanaged<NetworkReachabilityManager>.fromOpaque(info!).takeUnretainedValue()\n                reachability.notifyListener(flags)\n            },\n            &context\n        )\n\n        let queueEnabled = SCNetworkReachabilitySetDispatchQueue(reachability, listenerQueue)\n\n        listenerQueue.async {\n            self.previousFlags = SCNetworkReachabilityFlags()\n            self.notifyListener(self.flags ?? SCNetworkReachabilityFlags())\n        }\n\n        return callbackEnabled && queueEnabled\n    }\n\n    /// Stops listening for changes in network reachability status.\n    public func stopListening() {\n        SCNetworkReachabilitySetCallback(reachability, nil, nil)\n        SCNetworkReachabilitySetDispatchQueue(reachability, nil)\n    }\n\n    // MARK: - Internal - Listener Notification\n\n    func notifyListener(_ flags: SCNetworkReachabilityFlags) {\n        guard previousFlags != flags else { return }\n        previousFlags = flags\n\n        listener?(networkReachabilityStatusForFlags(flags))\n    }\n\n    // MARK: - Internal - Network Reachability Status\n\n    func networkReachabilityStatusForFlags(_ flags: SCNetworkReachabilityFlags) -> NetworkReachabilityStatus {\n        guard isNetworkReachable(with: flags) else { return .notReachable }\n\n        var networkStatus: NetworkReachabilityStatus = .reachable(.ethernetOrWiFi)\n\n    #if os(iOS)\n        if flags.contains(.isWWAN) { networkStatus = .reachable(.wwan) }\n    #endif\n\n        return networkStatus\n    }\n\n    func isNetworkReachable(with flags: SCNetworkReachabilityFlags) -> Bool {\n        let isReachable = flags.contains(.reachable)\n        let needsConnection = flags.contains(.connectionRequired)\n        let canConnectAutomatically = flags.contains(.connectionOnDemand) || flags.contains(.connectionOnTraffic)\n        let canConnectWithoutUserInteraction = canConnectAutomatically && !flags.contains(.interventionRequired)\n\n        return isReachable && (!needsConnection || canConnectWithoutUserInteraction)\n    }\n}\n\n// MARK: -\n\nextension NetworkReachabilityManager.NetworkReachabilityStatus: Equatable {}\n\n/// Returns whether the two network reachability status values are equal.\n///\n/// - parameter lhs: The left-hand side value to compare.\n/// - parameter rhs: The right-hand side value to compare.\n///\n/// - returns: `true` if the two values are equal, `false` otherwise.\npublic func ==(\n    lhs: NetworkReachabilityManager.NetworkReachabilityStatus,\n    rhs: NetworkReachabilityManager.NetworkReachabilityStatus)\n    -> Bool\n{\n    switch (lhs, rhs) {\n    case (.unknown, .unknown):\n        return true\n    case (.notReachable, .notReachable):\n        return true\n    case let (.reachable(lhsConnectionType), .reachable(rhsConnectionType)):\n        return lhsConnectionType == rhsConnectionType\n    default:\n        return false\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/Alamofire/Source/Notifications.swift",
    "content": "//\n//  Notifications.swift\n//\n//  Copyright (c) 2014-2017 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\nextension Notification.Name {\n    /// Used as a namespace for all `URLSessionTask` related notifications.\n    public struct Task {\n        /// Posted when a `URLSessionTask` is resumed. The notification `object` contains the resumed `URLSessionTask`.\n        public static let DidResume = Notification.Name(rawValue: \"org.alamofire.notification.name.task.didResume\")\n\n        /// Posted when a `URLSessionTask` is suspended. The notification `object` contains the suspended `URLSessionTask`.\n        public static let DidSuspend = Notification.Name(rawValue: \"org.alamofire.notification.name.task.didSuspend\")\n\n        /// Posted when a `URLSessionTask` is cancelled. The notification `object` contains the cancelled `URLSessionTask`.\n        public static let DidCancel = Notification.Name(rawValue: \"org.alamofire.notification.name.task.didCancel\")\n\n        /// Posted when a `URLSessionTask` is completed. The notification `object` contains the completed `URLSessionTask`.\n        public static let DidComplete = Notification.Name(rawValue: \"org.alamofire.notification.name.task.didComplete\")\n    }\n}\n\n// MARK: -\n\nextension Notification {\n    /// Used as a namespace for all `Notification` user info dictionary keys.\n    public struct Key {\n        /// User info dictionary key representing the `URLSessionTask` associated with the notification.\n        public static let Task = \"org.alamofire.notification.key.task\"\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/ParameterEncoding.swift",
    "content": "//\n//  ParameterEncoding.swift\n//\n//  Copyright (c) 2014-2017 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// HTTP method definitions.\n///\n/// See https://tools.ietf.org/html/rfc7231#section-4.3\npublic enum HTTPMethod: String {\n    case options = \"OPTIONS\"\n    case get     = \"GET\"\n    case head    = \"HEAD\"\n    case post    = \"POST\"\n    case put     = \"PUT\"\n    case patch   = \"PATCH\"\n    case delete  = \"DELETE\"\n    case trace   = \"TRACE\"\n    case connect = \"CONNECT\"\n}\n\n// MARK: -\n\n/// A dictionary of parameters to apply to a `URLRequest`.\npublic typealias Parameters = [String: Any]\n\n/// A type used to define how a set of parameters are applied to a `URLRequest`.\npublic protocol ParameterEncoding {\n    /// Creates a URL request by encoding parameters and applying them onto an existing request.\n    ///\n    /// - parameter urlRequest: The request to have parameters applied.\n    /// - parameter parameters: The parameters to apply.\n    ///\n    /// - throws: An `AFError.parameterEncodingFailed` error if encoding fails.\n    ///\n    /// - returns: The encoded request.\n    func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest\n}\n\n// MARK: -\n\n/// Creates a url-encoded query string to be set as or appended to any existing URL query string or set as the HTTP\n/// body of the URL request. Whether the query string is set or appended to any existing URL query string or set as\n/// the HTTP body depends on the destination of the encoding.\n///\n/// The `Content-Type` HTTP header field of an encoded request with HTTP body is set to\n/// `application/x-www-form-urlencoded; charset=utf-8`. Since there is no published specification for how to encode\n/// collection types, the convention of appending `[]` to the key for array values (`foo[]=1&foo[]=2`), and appending\n/// the key surrounded by square brackets for nested dictionary values (`foo[bar]=baz`).\npublic struct URLEncoding: ParameterEncoding {\n\n    // MARK: Helper Types\n\n    /// Defines whether the url-encoded query string is applied to the existing query string or HTTP body of the\n    /// resulting URL request.\n    ///\n    /// - methodDependent: Applies encoded query string result to existing query string for `GET`, `HEAD` and `DELETE`\n    ///                    requests and sets as the HTTP body for requests with any other HTTP method.\n    /// - queryString:     Sets or appends encoded query string result to existing query string.\n    /// - httpBody:        Sets encoded query string result as the HTTP body of the URL request.\n    public enum Destination {\n        case methodDependent, queryString, httpBody\n    }\n\n    // MARK: Properties\n\n    /// Returns a default `URLEncoding` instance.\n    public static var `default`: URLEncoding { return URLEncoding() }\n\n    /// Returns a `URLEncoding` instance with a `.methodDependent` destination.\n    public static var methodDependent: URLEncoding { return URLEncoding() }\n\n    /// Returns a `URLEncoding` instance with a `.queryString` destination.\n    public static var queryString: URLEncoding { return URLEncoding(destination: .queryString) }\n\n    /// Returns a `URLEncoding` instance with an `.httpBody` destination.\n    public static var httpBody: URLEncoding { return URLEncoding(destination: .httpBody) }\n\n    /// The destination defining where the encoded query string is to be applied to the URL request.\n    public let destination: Destination\n\n    // MARK: Initialization\n\n    /// Creates a `URLEncoding` instance using the specified destination.\n    ///\n    /// - parameter destination: The destination defining where the encoded query string is to be applied.\n    ///\n    /// - returns: The new `URLEncoding` instance.\n    public init(destination: Destination = .methodDependent) {\n        self.destination = destination\n    }\n\n    // MARK: Encoding\n\n    /// Creates a URL request by encoding parameters and applying them onto an existing request.\n    ///\n    /// - parameter urlRequest: The request to have parameters applied.\n    /// - parameter parameters: The parameters to apply.\n    ///\n    /// - throws: An `Error` if the encoding process encounters an error.\n    ///\n    /// - returns: The encoded request.\n    public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {\n        var urlRequest = try urlRequest.asURLRequest()\n\n        guard let parameters = parameters else { return urlRequest }\n\n        if let method = HTTPMethod(rawValue: urlRequest.httpMethod ?? \"GET\"), encodesParametersInURL(with: method) {\n            guard let url = urlRequest.url else {\n                throw AFError.parameterEncodingFailed(reason: .missingURL)\n            }\n\n            if var urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false), !parameters.isEmpty {\n                let percentEncodedQuery = (urlComponents.percentEncodedQuery.map { $0 + \"&\" } ?? \"\") + query(parameters)\n                urlComponents.percentEncodedQuery = percentEncodedQuery\n                urlRequest.url = urlComponents.url\n            }\n        } else {\n            if urlRequest.value(forHTTPHeaderField: \"Content-Type\") == nil {\n                urlRequest.setValue(\"application/x-www-form-urlencoded; charset=utf-8\", forHTTPHeaderField: \"Content-Type\")\n            }\n\n            urlRequest.httpBody = query(parameters).data(using: .utf8, allowLossyConversion: false)\n        }\n\n        return urlRequest\n    }\n\n    /// Creates percent-escaped, URL encoded query string components from the given key-value pair using recursion.\n    ///\n    /// - parameter key:   The key of the query component.\n    /// - parameter value: The value of the query component.\n    ///\n    /// - returns: The percent-escaped, URL encoded query string components.\n    public func queryComponents(fromKey key: String, value: Any) -> [(String, String)] {\n        var components: [(String, String)] = []\n\n        if let dictionary = value as? [String: Any] {\n            for (nestedKey, value) in dictionary {\n                components += queryComponents(fromKey: \"\\(key)[\\(nestedKey)]\", value: value)\n            }\n        } else if let array = value as? [Any] {\n            for value in array {\n                components += queryComponents(fromKey: \"\\(key)[]\", value: value)\n            }\n        } else if let value = value as? NSNumber {\n            if value.isBool {\n                components.append((escape(key), escape((value.boolValue ? \"1\" : \"0\"))))\n            } else {\n                components.append((escape(key), escape(\"\\(value)\")))\n            }\n        } else if let bool = value as? Bool {\n            components.append((escape(key), escape((bool ? \"1\" : \"0\"))))\n        } else {\n            components.append((escape(key), escape(\"\\(value)\")))\n        }\n\n        return components\n    }\n\n    /// Returns a percent-escaped string following RFC 3986 for a query string key or value.\n    ///\n    /// RFC 3986 states that the following characters are \"reserved\" characters.\n    ///\n    /// - General Delimiters: \":\", \"#\", \"[\", \"]\", \"@\", \"?\", \"/\"\n    /// - Sub-Delimiters: \"!\", \"$\", \"&\", \"'\", \"(\", \")\", \"*\", \"+\", \",\", \";\", \"=\"\n    ///\n    /// In RFC 3986 - Section 3.4, it states that the \"?\" and \"/\" characters should not be escaped to allow\n    /// query strings to include a URL. Therefore, all \"reserved\" characters with the exception of \"?\" and \"/\"\n    /// should be percent-escaped in the query string.\n    ///\n    /// - parameter string: The string to be percent-escaped.\n    ///\n    /// - returns: The percent-escaped string.\n    public func escape(_ string: String) -> String {\n        let generalDelimitersToEncode = \":#[]@\" // does not include \"?\" or \"/\" due to RFC 3986 - Section 3.4\n        let subDelimitersToEncode = \"!$&'()*+,;=\"\n\n        var allowedCharacterSet = CharacterSet.urlQueryAllowed\n        allowedCharacterSet.remove(charactersIn: \"\\(generalDelimitersToEncode)\\(subDelimitersToEncode)\")\n\n        var escaped = \"\"\n\n        //==========================================================================================================\n        //\n        //  Batching is required for escaping due to an internal bug in iOS 8.1 and 8.2. Encoding more than a few\n        //  hundred Chinese characters causes various malloc error crashes. To avoid this issue until iOS 8 is no\n        //  longer supported, batching MUST be used for encoding. This introduces roughly a 20% overhead. For more\n        //  info, please refer to:\n        //\n        //      - https://github.com/Alamofire/Alamofire/issues/206\n        //\n        //==========================================================================================================\n\n        if #available(iOS 8.3, *) {\n            escaped = string.addingPercentEncoding(withAllowedCharacters: allowedCharacterSet) ?? string\n        } else {\n            let batchSize = 50\n            var index = string.startIndex\n\n            while index != string.endIndex {\n                let startIndex = index\n                let endIndex = string.index(index, offsetBy: batchSize, limitedBy: string.endIndex) ?? string.endIndex\n                let range = startIndex..<endIndex\n\n                let substring = string[range]\n\n                escaped += substring.addingPercentEncoding(withAllowedCharacters: allowedCharacterSet) ?? String(substring)\n\n                index = endIndex\n            }\n        }\n\n        return escaped\n    }\n\n    private func query(_ parameters: [String: Any]) -> String {\n        var components: [(String, String)] = []\n\n        for key in parameters.keys.sorted(by: <) {\n            let value = parameters[key]!\n            components += queryComponents(fromKey: key, value: value)\n        }\n        return components.map { \"\\($0)=\\($1)\" }.joined(separator: \"&\")\n    }\n\n    private func encodesParametersInURL(with method: HTTPMethod) -> Bool {\n        switch destination {\n        case .queryString:\n            return true\n        case .httpBody:\n            return false\n        default:\n            break\n        }\n\n        switch method {\n        case .get, .head, .delete:\n            return true\n        default:\n            return false\n        }\n    }\n}\n\n// MARK: -\n\n/// Uses `JSONSerialization` to create a JSON representation of the parameters object, which is set as the body of the\n/// request. The `Content-Type` HTTP header field of an encoded request is set to `application/json`.\npublic struct JSONEncoding: ParameterEncoding {\n\n    // MARK: Properties\n\n    /// Returns a `JSONEncoding` instance with default writing options.\n    public static var `default`: JSONEncoding { return JSONEncoding() }\n\n    /// Returns a `JSONEncoding` instance with `.prettyPrinted` writing options.\n    public static var prettyPrinted: JSONEncoding { return JSONEncoding(options: .prettyPrinted) }\n\n    /// The options for writing the parameters as JSON data.\n    public let options: JSONSerialization.WritingOptions\n\n    // MARK: Initialization\n\n    /// Creates a `JSONEncoding` instance using the specified options.\n    ///\n    /// - parameter options: The options for writing the parameters as JSON data.\n    ///\n    /// - returns: The new `JSONEncoding` instance.\n    public init(options: JSONSerialization.WritingOptions = []) {\n        self.options = options\n    }\n\n    // MARK: Encoding\n\n    /// Creates a URL request by encoding parameters and applying them onto an existing request.\n    ///\n    /// - parameter urlRequest: The request to have parameters applied.\n    /// - parameter parameters: The parameters to apply.\n    ///\n    /// - throws: An `Error` if the encoding process encounters an error.\n    ///\n    /// - returns: The encoded request.\n    public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {\n        var urlRequest = try urlRequest.asURLRequest()\n\n        guard let parameters = parameters else { return urlRequest }\n\n        do {\n            let data = try JSONSerialization.data(withJSONObject: parameters, options: options)\n\n            if urlRequest.value(forHTTPHeaderField: \"Content-Type\") == nil {\n                urlRequest.setValue(\"application/json\", forHTTPHeaderField: \"Content-Type\")\n            }\n\n            urlRequest.httpBody = data\n        } catch {\n            throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error))\n        }\n\n        return urlRequest\n    }\n\n    /// Creates a URL request by encoding the JSON object and setting the resulting data on the HTTP body.\n    ///\n    /// - parameter urlRequest: The request to apply the JSON object to.\n    /// - parameter jsonObject: The JSON object to apply to the request.\n    ///\n    /// - throws: An `Error` if the encoding process encounters an error.\n    ///\n    /// - returns: The encoded request.\n    public func encode(_ urlRequest: URLRequestConvertible, withJSONObject jsonObject: Any? = nil) throws -> URLRequest {\n        var urlRequest = try urlRequest.asURLRequest()\n\n        guard let jsonObject = jsonObject else { return urlRequest }\n\n        do {\n            let data = try JSONSerialization.data(withJSONObject: jsonObject, options: options)\n\n            if urlRequest.value(forHTTPHeaderField: \"Content-Type\") == nil {\n                urlRequest.setValue(\"application/json\", forHTTPHeaderField: \"Content-Type\")\n            }\n\n            urlRequest.httpBody = data\n        } catch {\n            throw AFError.parameterEncodingFailed(reason: .jsonEncodingFailed(error: error))\n        }\n\n        return urlRequest\n    }\n}\n\n// MARK: -\n\n/// Uses `PropertyListSerialization` to create a plist representation of the parameters object, according to the\n/// associated format and write options values, which is set as the body of the request. The `Content-Type` HTTP header\n/// field of an encoded request is set to `application/x-plist`.\npublic struct PropertyListEncoding: ParameterEncoding {\n\n    // MARK: Properties\n\n    /// Returns a default `PropertyListEncoding` instance.\n    public static var `default`: PropertyListEncoding { return PropertyListEncoding() }\n\n    /// Returns a `PropertyListEncoding` instance with xml formatting and default writing options.\n    public static var xml: PropertyListEncoding { return PropertyListEncoding(format: .xml) }\n\n    /// Returns a `PropertyListEncoding` instance with binary formatting and default writing options.\n    public static var binary: PropertyListEncoding { return PropertyListEncoding(format: .binary) }\n\n    /// The property list serialization format.\n    public let format: PropertyListSerialization.PropertyListFormat\n\n    /// The options for writing the parameters as plist data.\n    public let options: PropertyListSerialization.WriteOptions\n\n    // MARK: Initialization\n\n    /// Creates a `PropertyListEncoding` instance using the specified format and options.\n    ///\n    /// - parameter format:  The property list serialization format.\n    /// - parameter options: The options for writing the parameters as plist data.\n    ///\n    /// - returns: The new `PropertyListEncoding` instance.\n    public init(\n        format: PropertyListSerialization.PropertyListFormat = .xml,\n        options: PropertyListSerialization.WriteOptions = 0)\n    {\n        self.format = format\n        self.options = options\n    }\n\n    // MARK: Encoding\n\n    /// Creates a URL request by encoding parameters and applying them onto an existing request.\n    ///\n    /// - parameter urlRequest: The request to have parameters applied.\n    /// - parameter parameters: The parameters to apply.\n    ///\n    /// - throws: An `Error` if the encoding process encounters an error.\n    ///\n    /// - returns: The encoded request.\n    public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {\n        var urlRequest = try urlRequest.asURLRequest()\n\n        guard let parameters = parameters else { return urlRequest }\n\n        do {\n            let data = try PropertyListSerialization.data(\n                fromPropertyList: parameters,\n                format: format,\n                options: options\n            )\n\n            if urlRequest.value(forHTTPHeaderField: \"Content-Type\") == nil {\n                urlRequest.setValue(\"application/x-plist\", forHTTPHeaderField: \"Content-Type\")\n            }\n\n            urlRequest.httpBody = data\n        } catch {\n            throw AFError.parameterEncodingFailed(reason: .propertyListEncodingFailed(error: error))\n        }\n\n        return urlRequest\n    }\n}\n\n// MARK: -\n\nextension NSNumber {\n    fileprivate var isBool: Bool { return CFBooleanGetTypeID() == CFGetTypeID(self) }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/Request.swift",
    "content": "//\n//  Request.swift\n//\n//  Copyright (c) 2014-2017 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// A type that can inspect and optionally adapt a `URLRequest` in some manner if necessary.\npublic protocol RequestAdapter {\n    /// Inspects and adapts the specified `URLRequest` in some manner if necessary and returns the result.\n    ///\n    /// - parameter urlRequest: The URL request to adapt.\n    ///\n    /// - throws: An `Error` if the adaptation encounters an error.\n    ///\n    /// - returns: The adapted `URLRequest`.\n    func adapt(_ urlRequest: URLRequest) throws -> URLRequest\n}\n\n// MARK: -\n\n/// A closure executed when the `RequestRetrier` determines whether a `Request` should be retried or not.\npublic typealias RequestRetryCompletion = (_ shouldRetry: Bool, _ timeDelay: TimeInterval) -> Void\n\n/// A type that determines whether a request should be retried after being executed by the specified session manager\n/// and encountering an error.\npublic protocol RequestRetrier {\n    /// Determines whether the `Request` should be retried by calling the `completion` closure.\n    ///\n    /// This operation is fully asynchronous. Any amount of time can be taken to determine whether the request needs\n    /// to be retried. The one requirement is that the completion closure is called to ensure the request is properly\n    /// cleaned up after.\n    ///\n    /// - parameter manager:    The session manager the request was executed on.\n    /// - parameter request:    The request that failed due to the encountered error.\n    /// - parameter error:      The error encountered when executing the request.\n    /// - parameter completion: The completion closure to be executed when retry decision has been determined.\n    func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion)\n}\n\n// MARK: -\n\nprotocol TaskConvertible {\n    func task(session: URLSession, adapter: RequestAdapter?, queue: DispatchQueue) throws -> URLSessionTask\n}\n\n/// A dictionary of headers to apply to a `URLRequest`.\npublic typealias HTTPHeaders = [String: String]\n\n// MARK: -\n\n/// Responsible for sending a request and receiving the response and associated data from the server, as well as\n/// managing its underlying `URLSessionTask`.\nopen class Request {\n\n    // MARK: Helper Types\n\n    /// A closure executed when monitoring upload or download progress of a request.\n    public typealias ProgressHandler = (Progress) -> Void\n\n    enum RequestTask {\n        case data(TaskConvertible?, URLSessionTask?)\n        case download(TaskConvertible?, URLSessionTask?)\n        case upload(TaskConvertible?, URLSessionTask?)\n        case stream(TaskConvertible?, URLSessionTask?)\n    }\n\n    // MARK: Properties\n\n    /// The delegate for the underlying task.\n    open internal(set) var delegate: TaskDelegate {\n        get {\n            taskDelegateLock.lock() ; defer { taskDelegateLock.unlock() }\n            return taskDelegate\n        }\n        set {\n            taskDelegateLock.lock() ; defer { taskDelegateLock.unlock() }\n            taskDelegate = newValue\n        }\n    }\n\n    /// The underlying task.\n    open var task: URLSessionTask? { return delegate.task }\n\n    /// The session belonging to the underlying task.\n    open let session: URLSession\n\n    /// The request sent or to be sent to the server.\n    open var request: URLRequest? { return task?.originalRequest }\n\n    /// The response received from the server, if any.\n    open var response: HTTPURLResponse? { return task?.response as? HTTPURLResponse }\n\n    /// The number of times the request has been retried.\n    open internal(set) var retryCount: UInt = 0\n\n    let originalTask: TaskConvertible?\n\n    var startTime: CFAbsoluteTime?\n    var endTime: CFAbsoluteTime?\n\n    var validations: [() -> Void] = []\n\n    private var taskDelegate: TaskDelegate\n    private var taskDelegateLock = NSLock()\n\n    // MARK: Lifecycle\n\n    init(session: URLSession, requestTask: RequestTask, error: Error? = nil) {\n        self.session = session\n\n        switch requestTask {\n        case .data(let originalTask, let task):\n            taskDelegate = DataTaskDelegate(task: task)\n            self.originalTask = originalTask\n        case .download(let originalTask, let task):\n            taskDelegate = DownloadTaskDelegate(task: task)\n            self.originalTask = originalTask\n        case .upload(let originalTask, let task):\n            taskDelegate = UploadTaskDelegate(task: task)\n            self.originalTask = originalTask\n        case .stream(let originalTask, let task):\n            taskDelegate = TaskDelegate(task: task)\n            self.originalTask = originalTask\n        }\n\n        delegate.error = error\n        delegate.queue.addOperation { self.endTime = CFAbsoluteTimeGetCurrent() }\n    }\n\n    // MARK: Authentication\n\n    /// Associates an HTTP Basic credential with the request.\n    ///\n    /// - parameter user:        The user.\n    /// - parameter password:    The password.\n    /// - parameter persistence: The URL credential persistence. `.ForSession` by default.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    open func authenticate(\n        user: String,\n        password: String,\n        persistence: URLCredential.Persistence = .forSession)\n        -> Self\n    {\n        let credential = URLCredential(user: user, password: password, persistence: persistence)\n        return authenticate(usingCredential: credential)\n    }\n\n    /// Associates a specified credential with the request.\n    ///\n    /// - parameter credential: The credential.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    open func authenticate(usingCredential credential: URLCredential) -> Self {\n        delegate.credential = credential\n        return self\n    }\n\n    /// Returns a base64 encoded basic authentication credential as an authorization header tuple.\n    ///\n    /// - parameter user:     The user.\n    /// - parameter password: The password.\n    ///\n    /// - returns: A tuple with Authorization header and credential value if encoding succeeds, `nil` otherwise.\n    open static func authorizationHeader(user: String, password: String) -> (key: String, value: String)? {\n        guard let data = \"\\(user):\\(password)\".data(using: .utf8) else { return nil }\n\n        let credential = data.base64EncodedString(options: [])\n\n        return (key: \"Authorization\", value: \"Basic \\(credential)\")\n    }\n\n    // MARK: State\n\n    /// Resumes the request.\n    open func resume() {\n        guard let task = task else { delegate.queue.isSuspended = false ; return }\n\n        if startTime == nil { startTime = CFAbsoluteTimeGetCurrent() }\n\n        task.resume()\n\n        NotificationCenter.default.post(\n            name: Notification.Name.Task.DidResume,\n            object: self,\n            userInfo: [Notification.Key.Task: task]\n        )\n    }\n\n    /// Suspends the request.\n    open func suspend() {\n        guard let task = task else { return }\n\n        task.suspend()\n\n        NotificationCenter.default.post(\n            name: Notification.Name.Task.DidSuspend,\n            object: self,\n            userInfo: [Notification.Key.Task: task]\n        )\n    }\n\n    /// Cancels the request.\n    open func cancel() {\n        guard let task = task else { return }\n\n        task.cancel()\n\n        NotificationCenter.default.post(\n            name: Notification.Name.Task.DidCancel,\n            object: self,\n            userInfo: [Notification.Key.Task: task]\n        )\n    }\n}\n\n// MARK: - CustomStringConvertible\n\nextension Request: CustomStringConvertible {\n    /// The textual representation used when written to an output stream, which includes the HTTP method and URL, as\n    /// well as the response status code if a response has been received.\n    open var description: String {\n        var components: [String] = []\n\n        if let HTTPMethod = request?.httpMethod {\n            components.append(HTTPMethod)\n        }\n\n        if let urlString = request?.url?.absoluteString {\n            components.append(urlString)\n        }\n\n        if let response = response {\n            components.append(\"(\\(response.statusCode))\")\n        }\n\n        return components.joined(separator: \" \")\n    }\n}\n\n// MARK: - CustomDebugStringConvertible\n\nextension Request: CustomDebugStringConvertible {\n    /// The textual representation used when written to an output stream, in the form of a cURL command.\n    open var debugDescription: String {\n        return cURLRepresentation()\n    }\n\n    func cURLRepresentation() -> String {\n        var components = [\"$ curl -v\"]\n\n        guard let request = self.request,\n              let url = request.url,\n              let host = url.host\n        else {\n            return \"$ curl command could not be created\"\n        }\n\n        if let httpMethod = request.httpMethod, httpMethod != \"GET\" {\n            components.append(\"-X \\(httpMethod)\")\n        }\n\n        if let credentialStorage = self.session.configuration.urlCredentialStorage {\n            let protectionSpace = URLProtectionSpace(\n                host: host,\n                port: url.port ?? 0,\n                protocol: url.scheme,\n                realm: host,\n                authenticationMethod: NSURLAuthenticationMethodHTTPBasic\n            )\n\n            if let credentials = credentialStorage.credentials(for: protectionSpace)?.values {\n                for credential in credentials {\n                    guard let user = credential.user, let password = credential.password else { continue }\n                    components.append(\"-u \\(user):\\(password)\")\n                }\n            } else {\n                if let credential = delegate.credential, let user = credential.user, let password = credential.password {\n                    components.append(\"-u \\(user):\\(password)\")\n                }\n            }\n        }\n\n        if session.configuration.httpShouldSetCookies {\n            if\n                let cookieStorage = session.configuration.httpCookieStorage,\n                let cookies = cookieStorage.cookies(for: url), !cookies.isEmpty\n            {\n                let string = cookies.reduce(\"\") { $0 + \"\\($1.name)=\\($1.value);\" }\n\n            #if swift(>=3.2)\n                components.append(\"-b \\\"\\(string[..<string.index(before: string.endIndex)])\\\"\")\n            #else\n                components.append(\"-b \\\"\\(string.substring(to: string.characters.index(before: string.endIndex)))\\\"\")\n            #endif\n            }\n        }\n\n        var headers: [AnyHashable: Any] = [:]\n\n        if let additionalHeaders = session.configuration.httpAdditionalHeaders {\n            for (field, value) in additionalHeaders where field != AnyHashable(\"Cookie\") {\n                headers[field] = value\n            }\n        }\n\n        if let headerFields = request.allHTTPHeaderFields {\n            for (field, value) in headerFields where field != \"Cookie\" {\n                headers[field] = value\n            }\n        }\n\n        for (field, value) in headers {\n            components.append(\"-H \\\"\\(field): \\(value)\\\"\")\n        }\n\n        if let httpBodyData = request.httpBody, let httpBody = String(data: httpBodyData, encoding: .utf8) {\n            var escapedBody = httpBody.replacingOccurrences(of: \"\\\\\\\"\", with: \"\\\\\\\\\\\"\")\n            escapedBody = escapedBody.replacingOccurrences(of: \"\\\"\", with: \"\\\\\\\"\")\n\n            components.append(\"-d \\\"\\(escapedBody)\\\"\")\n        }\n\n        components.append(\"\\\"\\(url.absoluteString)\\\"\")\n\n        return components.joined(separator: \" \\\\\\n\\t\")\n    }\n}\n\n// MARK: -\n\n/// Specific type of `Request` that manages an underlying `URLSessionDataTask`.\nopen class DataRequest: Request {\n\n    // MARK: Helper Types\n\n    struct Requestable: TaskConvertible {\n        let urlRequest: URLRequest\n\n        func task(session: URLSession, adapter: RequestAdapter?, queue: DispatchQueue) throws -> URLSessionTask {\n            do {\n                let urlRequest = try self.urlRequest.adapt(using: adapter)\n                return queue.sync { session.dataTask(with: urlRequest) }\n            } catch {\n                throw AdaptError(error: error)\n            }\n        }\n    }\n\n    // MARK: Properties\n\n    /// The request sent or to be sent to the server.\n    open override var request: URLRequest? {\n        if let request = super.request { return request }\n        if let requestable = originalTask as? Requestable { return requestable.urlRequest }\n\n        return nil\n    }\n\n    /// The progress of fetching the response data from the server for the request.\n    open var progress: Progress { return dataDelegate.progress }\n\n    var dataDelegate: DataTaskDelegate { return delegate as! DataTaskDelegate }\n\n    // MARK: Stream\n\n    /// Sets a closure to be called periodically during the lifecycle of the request as data is read from the server.\n    ///\n    /// This closure returns the bytes most recently received from the server, not including data from previous calls.\n    /// If this closure is set, data will only be available within this closure, and will not be saved elsewhere. It is\n    /// also important to note that the server data in any `Response` object will be `nil`.\n    ///\n    /// - parameter closure: The code to be executed periodically during the lifecycle of the request.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    open func stream(closure: ((Data) -> Void)? = nil) -> Self {\n        dataDelegate.dataStream = closure\n        return self\n    }\n\n    // MARK: Progress\n\n    /// Sets a closure to be called periodically during the lifecycle of the `Request` as data is read from the server.\n    ///\n    /// - parameter queue:   The dispatch queue to execute the closure on.\n    /// - parameter closure: The code to be executed periodically as data is read from the server.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    open func downloadProgress(queue: DispatchQueue = DispatchQueue.main, closure: @escaping ProgressHandler) -> Self {\n        dataDelegate.progressHandler = (closure, queue)\n        return self\n    }\n}\n\n// MARK: -\n\n/// Specific type of `Request` that manages an underlying `URLSessionDownloadTask`.\nopen class DownloadRequest: Request {\n\n    // MARK: Helper Types\n\n    /// A collection of options to be executed prior to moving a downloaded file from the temporary URL to the\n    /// destination URL.\n    public struct DownloadOptions: OptionSet {\n        /// Returns the raw bitmask value of the option and satisfies the `RawRepresentable` protocol.\n        public let rawValue: UInt\n\n        /// A `DownloadOptions` flag that creates intermediate directories for the destination URL if specified.\n        public static let createIntermediateDirectories = DownloadOptions(rawValue: 1 << 0)\n\n        /// A `DownloadOptions` flag that removes a previous file from the destination URL if specified.\n        public static let removePreviousFile = DownloadOptions(rawValue: 1 << 1)\n\n        /// Creates a `DownloadFileDestinationOptions` instance with the specified raw value.\n        ///\n        /// - parameter rawValue: The raw bitmask value for the option.\n        ///\n        /// - returns: A new log level instance.\n        public init(rawValue: UInt) {\n            self.rawValue = rawValue\n        }\n    }\n\n    /// A closure executed once a download request has successfully completed in order to determine where to move the\n    /// temporary file written to during the download process. The closure takes two arguments: the temporary file URL\n    /// and the URL response, and returns a two arguments: the file URL where the temporary file should be moved and\n    /// the options defining how the file should be moved.\n    public typealias DownloadFileDestination = (\n        _ temporaryURL: URL,\n        _ response: HTTPURLResponse)\n        -> (destinationURL: URL, options: DownloadOptions)\n\n    enum Downloadable: TaskConvertible {\n        case request(URLRequest)\n        case resumeData(Data)\n\n        func task(session: URLSession, adapter: RequestAdapter?, queue: DispatchQueue) throws -> URLSessionTask {\n            do {\n                let task: URLSessionTask\n\n                switch self {\n                case let .request(urlRequest):\n                    let urlRequest = try urlRequest.adapt(using: adapter)\n                    task = queue.sync { session.downloadTask(with: urlRequest) }\n                case let .resumeData(resumeData):\n                    task = queue.sync { session.downloadTask(withResumeData: resumeData) }\n                }\n\n                return task\n            } catch {\n                throw AdaptError(error: error)\n            }\n        }\n    }\n\n    // MARK: Properties\n\n    /// The request sent or to be sent to the server.\n    open override var request: URLRequest? {\n        if let request = super.request { return request }\n\n        if let downloadable = originalTask as? Downloadable, case let .request(urlRequest) = downloadable {\n            return urlRequest\n        }\n\n        return nil\n    }\n\n    /// The resume data of the underlying download task if available after a failure.\n    open var resumeData: Data? { return downloadDelegate.resumeData }\n\n    /// The progress of downloading the response data from the server for the request.\n    open var progress: Progress { return downloadDelegate.progress }\n\n    var downloadDelegate: DownloadTaskDelegate { return delegate as! DownloadTaskDelegate }\n\n    // MARK: State\n\n    /// Cancels the request.\n    open override func cancel() {\n        downloadDelegate.downloadTask.cancel { self.downloadDelegate.resumeData = $0 }\n\n        NotificationCenter.default.post(\n            name: Notification.Name.Task.DidCancel,\n            object: self,\n            userInfo: [Notification.Key.Task: task as Any]\n        )\n    }\n\n    // MARK: Progress\n\n    /// Sets a closure to be called periodically during the lifecycle of the `Request` as data is read from the server.\n    ///\n    /// - parameter queue:   The dispatch queue to execute the closure on.\n    /// - parameter closure: The code to be executed periodically as data is read from the server.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    open func downloadProgress(queue: DispatchQueue = DispatchQueue.main, closure: @escaping ProgressHandler) -> Self {\n        downloadDelegate.progressHandler = (closure, queue)\n        return self\n    }\n\n    // MARK: Destination\n\n    /// Creates a download file destination closure which uses the default file manager to move the temporary file to a\n    /// file URL in the first available directory with the specified search path directory and search path domain mask.\n    ///\n    /// - parameter directory: The search path directory. `.DocumentDirectory` by default.\n    /// - parameter domain:    The search path domain mask. `.UserDomainMask` by default.\n    ///\n    /// - returns: A download file destination closure.\n    open class func suggestedDownloadDestination(\n        for directory: FileManager.SearchPathDirectory = .documentDirectory,\n        in domain: FileManager.SearchPathDomainMask = .userDomainMask)\n        -> DownloadFileDestination\n    {\n        return { temporaryURL, response in\n            let directoryURLs = FileManager.default.urls(for: directory, in: domain)\n\n            if !directoryURLs.isEmpty {\n                return (directoryURLs[0].appendingPathComponent(response.suggestedFilename!), [])\n            }\n\n            return (temporaryURL, [])\n        }\n    }\n}\n\n// MARK: -\n\n/// Specific type of `Request` that manages an underlying `URLSessionUploadTask`.\nopen class UploadRequest: DataRequest {\n\n    // MARK: Helper Types\n\n    enum Uploadable: TaskConvertible {\n        case data(Data, URLRequest)\n        case file(URL, URLRequest)\n        case stream(InputStream, URLRequest)\n\n        func task(session: URLSession, adapter: RequestAdapter?, queue: DispatchQueue) throws -> URLSessionTask {\n            do {\n                let task: URLSessionTask\n\n                switch self {\n                case let .data(data, urlRequest):\n                    let urlRequest = try urlRequest.adapt(using: adapter)\n                    task = queue.sync { session.uploadTask(with: urlRequest, from: data) }\n                case let .file(url, urlRequest):\n                    let urlRequest = try urlRequest.adapt(using: adapter)\n                    task = queue.sync { session.uploadTask(with: urlRequest, fromFile: url) }\n                case let .stream(_, urlRequest):\n                    let urlRequest = try urlRequest.adapt(using: adapter)\n                    task = queue.sync { session.uploadTask(withStreamedRequest: urlRequest) }\n                }\n\n                return task\n            } catch {\n                throw AdaptError(error: error)\n            }\n        }\n    }\n\n    // MARK: Properties\n\n    /// The request sent or to be sent to the server.\n    open override var request: URLRequest? {\n        if let request = super.request { return request }\n\n        guard let uploadable = originalTask as? Uploadable else { return nil }\n\n        switch uploadable {\n        case .data(_, let urlRequest), .file(_, let urlRequest), .stream(_, let urlRequest):\n            return urlRequest\n        }\n    }\n\n    /// The progress of uploading the payload to the server for the upload request.\n    open var uploadProgress: Progress { return uploadDelegate.uploadProgress }\n\n    var uploadDelegate: UploadTaskDelegate { return delegate as! UploadTaskDelegate }\n\n    // MARK: Upload Progress\n\n    /// Sets a closure to be called periodically during the lifecycle of the `UploadRequest` as data is sent to\n    /// the server.\n    ///\n    /// After the data is sent to the server, the `progress(queue:closure:)` APIs can be used to monitor the progress\n    /// of data being read from the server.\n    ///\n    /// - parameter queue:   The dispatch queue to execute the closure on.\n    /// - parameter closure: The code to be executed periodically as data is sent to the server.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    open func uploadProgress(queue: DispatchQueue = DispatchQueue.main, closure: @escaping ProgressHandler) -> Self {\n        uploadDelegate.uploadProgressHandler = (closure, queue)\n        return self\n    }\n}\n\n// MARK: -\n\n#if !os(watchOS)\n\n/// Specific type of `Request` that manages an underlying `URLSessionStreamTask`.\n@available(iOS 9.0, macOS 10.11, tvOS 9.0, *)\nopen class StreamRequest: Request {\n    enum Streamable: TaskConvertible {\n        case stream(hostName: String, port: Int)\n        case netService(NetService)\n\n        func task(session: URLSession, adapter: RequestAdapter?, queue: DispatchQueue) throws -> URLSessionTask {\n            let task: URLSessionTask\n\n            switch self {\n            case let .stream(hostName, port):\n                task = queue.sync { session.streamTask(withHostName: hostName, port: port) }\n            case let .netService(netService):\n                task = queue.sync { session.streamTask(with: netService) }\n            }\n\n            return task\n        }\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/Alamofire/Source/Response.swift",
    "content": "//\n//  Response.swift\n//\n//  Copyright (c) 2014-2017 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// Used to store all data associated with an non-serialized response of a data or upload request.\npublic struct DefaultDataResponse {\n    /// The URL request sent to the server.\n    public let request: URLRequest?\n\n    /// The server's response to the URL request.\n    public let response: HTTPURLResponse?\n\n    /// The data returned by the server.\n    public let data: Data?\n\n    /// The error encountered while executing or validating the request.\n    public let error: Error?\n\n    /// The timeline of the complete lifecycle of the request.\n    public let timeline: Timeline\n\n    var _metrics: AnyObject?\n\n    /// Creates a `DefaultDataResponse` instance from the specified parameters.\n    ///\n    /// - Parameters:\n    ///   - request:  The URL request sent to the server.\n    ///   - response: The server's response to the URL request.\n    ///   - data:     The data returned by the server.\n    ///   - error:    The error encountered while executing or validating the request.\n    ///   - timeline: The timeline of the complete lifecycle of the request. `Timeline()` by default.\n    ///   - metrics:  The task metrics containing the request / response statistics. `nil` by default.\n    public init(\n        request: URLRequest?,\n        response: HTTPURLResponse?,\n        data: Data?,\n        error: Error?,\n        timeline: Timeline = Timeline(),\n        metrics: AnyObject? = nil)\n    {\n        self.request = request\n        self.response = response\n        self.data = data\n        self.error = error\n        self.timeline = timeline\n    }\n}\n\n// MARK: -\n\n/// Used to store all data associated with a serialized response of a data or upload request.\npublic struct DataResponse<Value> {\n    /// The URL request sent to the server.\n    public let request: URLRequest?\n\n    /// The server's response to the URL request.\n    public let response: HTTPURLResponse?\n\n    /// The data returned by the server.\n    public let data: Data?\n\n    /// The result of response serialization.\n    public let result: Result<Value>\n\n    /// The timeline of the complete lifecycle of the request.\n    public let timeline: Timeline\n\n    /// Returns the associated value of the result if it is a success, `nil` otherwise.\n    public var value: Value? { return result.value }\n\n    /// Returns the associated error value if the result if it is a failure, `nil` otherwise.\n    public var error: Error? { return result.error }\n\n    var _metrics: AnyObject?\n\n    /// Creates a `DataResponse` instance with the specified parameters derived from response serialization.\n    ///\n    /// - parameter request:  The URL request sent to the server.\n    /// - parameter response: The server's response to the URL request.\n    /// - parameter data:     The data returned by the server.\n    /// - parameter result:   The result of response serialization.\n    /// - parameter timeline: The timeline of the complete lifecycle of the `Request`. Defaults to `Timeline()`.\n    ///\n    /// - returns: The new `DataResponse` instance.\n    public init(\n        request: URLRequest?,\n        response: HTTPURLResponse?,\n        data: Data?,\n        result: Result<Value>,\n        timeline: Timeline = Timeline())\n    {\n        self.request = request\n        self.response = response\n        self.data = data\n        self.result = result\n        self.timeline = timeline\n    }\n}\n\n// MARK: -\n\nextension DataResponse: CustomStringConvertible, CustomDebugStringConvertible {\n    /// The textual representation used when written to an output stream, which includes whether the result was a\n    /// success or failure.\n    public var description: String {\n        return result.debugDescription\n    }\n\n    /// The debug textual representation used when written to an output stream, which includes the URL request, the URL\n    /// response, the server data, the response serialization result and the timeline.\n    public var debugDescription: String {\n        var output: [String] = []\n\n        output.append(request != nil ? \"[Request]: \\(request!.httpMethod ?? \"GET\") \\(request!)\" : \"[Request]: nil\")\n        output.append(response != nil ? \"[Response]: \\(response!)\" : \"[Response]: nil\")\n        output.append(\"[Data]: \\(data?.count ?? 0) bytes\")\n        output.append(\"[Result]: \\(result.debugDescription)\")\n        output.append(\"[Timeline]: \\(timeline.debugDescription)\")\n\n        return output.joined(separator: \"\\n\")\n    }\n}\n\n// MARK: -\n\nextension DataResponse {\n    /// Evaluates the specified closure when the result of this `DataResponse` is a success, passing the unwrapped\n    /// result value as a parameter.\n    ///\n    /// Use the `map` method with a closure that does not throw. For example:\n    ///\n    ///     let possibleData: DataResponse<Data> = ...\n    ///     let possibleInt = possibleData.map { $0.count }\n    ///\n    /// - parameter transform: A closure that takes the success value of the instance's result.\n    ///\n    /// - returns: A `DataResponse` whose result wraps the value returned by the given closure. If this instance's\n    ///            result is a failure, returns a response wrapping the same failure.\n    public func map<T>(_ transform: (Value) -> T) -> DataResponse<T> {\n        var response = DataResponse<T>(\n            request: request,\n            response: self.response,\n            data: data,\n            result: result.map(transform),\n            timeline: timeline\n        )\n\n        response._metrics = _metrics\n\n        return response\n    }\n\n    /// Evaluates the given closure when the result of this `DataResponse` is a success, passing the unwrapped result\n    /// value as a parameter.\n    ///\n    /// Use the `flatMap` method with a closure that may throw an error. For example:\n    ///\n    ///     let possibleData: DataResponse<Data> = ...\n    ///     let possibleObject = possibleData.flatMap {\n    ///         try JSONSerialization.jsonObject(with: $0)\n    ///     }\n    ///\n    /// - parameter transform: A closure that takes the success value of the instance's result.\n    ///\n    /// - returns: A success or failure `DataResponse` depending on the result of the given closure. If this instance's\n    ///            result is a failure, returns the same failure.\n    public func flatMap<T>(_ transform: (Value) throws -> T) -> DataResponse<T> {\n        var response = DataResponse<T>(\n            request: request,\n            response: self.response,\n            data: data,\n            result: result.flatMap(transform),\n            timeline: timeline\n        )\n\n        response._metrics = _metrics\n\n        return response\n    }\n}\n\n// MARK: -\n\n/// Used to store all data associated with an non-serialized response of a download request.\npublic struct DefaultDownloadResponse {\n    /// The URL request sent to the server.\n    public let request: URLRequest?\n\n    /// The server's response to the URL request.\n    public let response: HTTPURLResponse?\n\n    /// The temporary destination URL of the data returned from the server.\n    public let temporaryURL: URL?\n\n    /// The final destination URL of the data returned from the server if it was moved.\n    public let destinationURL: URL?\n\n    /// The resume data generated if the request was cancelled.\n    public let resumeData: Data?\n\n    /// The error encountered while executing or validating the request.\n    public let error: Error?\n\n    /// The timeline of the complete lifecycle of the request.\n    public let timeline: Timeline\n\n    var _metrics: AnyObject?\n\n    /// Creates a `DefaultDownloadResponse` instance from the specified parameters.\n    ///\n    /// - Parameters:\n    ///   - request:        The URL request sent to the server.\n    ///   - response:       The server's response to the URL request.\n    ///   - temporaryURL:   The temporary destination URL of the data returned from the server.\n    ///   - destinationURL: The final destination URL of the data returned from the server if it was moved.\n    ///   - resumeData:     The resume data generated if the request was cancelled.\n    ///   - error:          The error encountered while executing or validating the request.\n    ///   - timeline:       The timeline of the complete lifecycle of the request. `Timeline()` by default.\n    ///   - metrics:        The task metrics containing the request / response statistics. `nil` by default.\n    public init(\n        request: URLRequest?,\n        response: HTTPURLResponse?,\n        temporaryURL: URL?,\n        destinationURL: URL?,\n        resumeData: Data?,\n        error: Error?,\n        timeline: Timeline = Timeline(),\n        metrics: AnyObject? = nil)\n    {\n        self.request = request\n        self.response = response\n        self.temporaryURL = temporaryURL\n        self.destinationURL = destinationURL\n        self.resumeData = resumeData\n        self.error = error\n        self.timeline = timeline\n    }\n}\n\n// MARK: -\n\n/// Used to store all data associated with a serialized response of a download request.\npublic struct DownloadResponse<Value> {\n    /// The URL request sent to the server.\n    public let request: URLRequest?\n\n    /// The server's response to the URL request.\n    public let response: HTTPURLResponse?\n\n    /// The temporary destination URL of the data returned from the server.\n    public let temporaryURL: URL?\n\n    /// The final destination URL of the data returned from the server if it was moved.\n    public let destinationURL: URL?\n\n    /// The resume data generated if the request was cancelled.\n    public let resumeData: Data?\n\n    /// The result of response serialization.\n    public let result: Result<Value>\n\n    /// The timeline of the complete lifecycle of the request.\n    public let timeline: Timeline\n\n    /// Returns the associated value of the result if it is a success, `nil` otherwise.\n    public var value: Value? { return result.value }\n\n    /// Returns the associated error value if the result if it is a failure, `nil` otherwise.\n    public var error: Error? { return result.error }\n\n    var _metrics: AnyObject?\n\n    /// Creates a `DownloadResponse` instance with the specified parameters derived from response serialization.\n    ///\n    /// - parameter request:        The URL request sent to the server.\n    /// - parameter response:       The server's response to the URL request.\n    /// - parameter temporaryURL:   The temporary destination URL of the data returned from the server.\n    /// - parameter destinationURL: The final destination URL of the data returned from the server if it was moved.\n    /// - parameter resumeData:     The resume data generated if the request was cancelled.\n    /// - parameter result:         The result of response serialization.\n    /// - parameter timeline:       The timeline of the complete lifecycle of the `Request`. Defaults to `Timeline()`.\n    ///\n    /// - returns: The new `DownloadResponse` instance.\n    public init(\n        request: URLRequest?,\n        response: HTTPURLResponse?,\n        temporaryURL: URL?,\n        destinationURL: URL?,\n        resumeData: Data?,\n        result: Result<Value>,\n        timeline: Timeline = Timeline())\n    {\n        self.request = request\n        self.response = response\n        self.temporaryURL = temporaryURL\n        self.destinationURL = destinationURL\n        self.resumeData = resumeData\n        self.result = result\n        self.timeline = timeline\n    }\n}\n\n// MARK: -\n\nextension DownloadResponse: CustomStringConvertible, CustomDebugStringConvertible {\n    /// The textual representation used when written to an output stream, which includes whether the result was a\n    /// success or failure.\n    public var description: String {\n        return result.debugDescription\n    }\n\n    /// The debug textual representation used when written to an output stream, which includes the URL request, the URL\n    /// response, the temporary and destination URLs, the resume data, the response serialization result and the\n    /// timeline.\n    public var debugDescription: String {\n        var output: [String] = []\n\n        output.append(request != nil ? \"[Request]: \\(request!.httpMethod ?? \"GET\") \\(request!)\" : \"[Request]: nil\")\n        output.append(response != nil ? \"[Response]: \\(response!)\" : \"[Response]: nil\")\n        output.append(\"[TemporaryURL]: \\(temporaryURL?.path ?? \"nil\")\")\n        output.append(\"[DestinationURL]: \\(destinationURL?.path ?? \"nil\")\")\n        output.append(\"[ResumeData]: \\(resumeData?.count ?? 0) bytes\")\n        output.append(\"[Result]: \\(result.debugDescription)\")\n        output.append(\"[Timeline]: \\(timeline.debugDescription)\")\n\n        return output.joined(separator: \"\\n\")\n    }\n}\n\n// MARK: -\n\nextension DownloadResponse {\n    /// Evaluates the given closure when the result of this `DownloadResponse` is a success, passing the unwrapped\n    /// result value as a parameter.\n    ///\n    /// Use the `map` method with a closure that does not throw. For example:\n    ///\n    ///     let possibleData: DownloadResponse<Data> = ...\n    ///     let possibleInt = possibleData.map { $0.count }\n    ///\n    /// - parameter transform: A closure that takes the success value of the instance's result.\n    ///\n    /// - returns: A `DownloadResponse` whose result wraps the value returned by the given closure. If this instance's\n    ///            result is a failure, returns a response wrapping the same failure.\n    public func map<T>(_ transform: (Value) -> T) -> DownloadResponse<T> {\n        var response = DownloadResponse<T>(\n            request: request,\n            response: self.response,\n            temporaryURL: temporaryURL,\n            destinationURL: destinationURL,\n            resumeData: resumeData,\n            result: result.map(transform),\n            timeline: timeline\n        )\n\n        response._metrics = _metrics\n\n        return response\n    }\n\n    /// Evaluates the given closure when the result of this `DownloadResponse` is a success, passing the unwrapped\n    /// result value as a parameter.\n    ///\n    /// Use the `flatMap` method with a closure that may throw an error. For example:\n    ///\n    ///     let possibleData: DownloadResponse<Data> = ...\n    ///     let possibleObject = possibleData.flatMap {\n    ///         try JSONSerialization.jsonObject(with: $0)\n    ///     }\n    ///\n    /// - parameter transform: A closure that takes the success value of the instance's result.\n    ///\n    /// - returns: A success or failure `DownloadResponse` depending on the result of the given closure. If this\n    /// instance's result is a failure, returns the same failure.\n    public func flatMap<T>(_ transform: (Value) throws -> T) -> DownloadResponse<T> {\n        var response = DownloadResponse<T>(\n            request: request,\n            response: self.response,\n            temporaryURL: temporaryURL,\n            destinationURL: destinationURL,\n            resumeData: resumeData,\n            result: result.flatMap(transform),\n            timeline: timeline\n        )\n\n        response._metrics = _metrics\n\n        return response\n    }\n}\n\n// MARK: -\n\nprotocol Response {\n    /// The task metrics containing the request / response statistics.\n    var _metrics: AnyObject? { get set }\n    mutating func add(_ metrics: AnyObject?)\n}\n\nextension Response {\n    mutating func add(_ metrics: AnyObject?) {\n        #if !os(watchOS)\n            guard #available(iOS 10.0, macOS 10.12, tvOS 10.0, *) else { return }\n            guard let metrics = metrics as? URLSessionTaskMetrics else { return }\n\n            _metrics = metrics\n        #endif\n    }\n}\n\n// MARK: -\n\n@available(iOS 10.0, macOS 10.12, tvOS 10.0, *)\nextension DefaultDataResponse: Response {\n#if !os(watchOS)\n    /// The task metrics containing the request / response statistics.\n    public var metrics: URLSessionTaskMetrics? { return _metrics as? URLSessionTaskMetrics }\n#endif\n}\n\n@available(iOS 10.0, macOS 10.12, tvOS 10.0, *)\nextension DataResponse: Response {\n#if !os(watchOS)\n    /// The task metrics containing the request / response statistics.\n    public var metrics: URLSessionTaskMetrics? { return _metrics as? URLSessionTaskMetrics }\n#endif\n}\n\n@available(iOS 10.0, macOS 10.12, tvOS 10.0, *)\nextension DefaultDownloadResponse: Response {\n#if !os(watchOS)\n    /// The task metrics containing the request / response statistics.\n    public var metrics: URLSessionTaskMetrics? { return _metrics as? URLSessionTaskMetrics }\n#endif\n}\n\n@available(iOS 10.0, macOS 10.12, tvOS 10.0, *)\nextension DownloadResponse: Response {\n#if !os(watchOS)\n    /// The task metrics containing the request / response statistics.\n    public var metrics: URLSessionTaskMetrics? { return _metrics as? URLSessionTaskMetrics }\n#endif\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/ResponseSerialization.swift",
    "content": "//\n//  ResponseSerialization.swift\n//\n//  Copyright (c) 2014-2017 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// The type in which all data response serializers must conform to in order to serialize a response.\npublic protocol DataResponseSerializerProtocol {\n    /// The type of serialized object to be created by this `DataResponseSerializerType`.\n    associatedtype SerializedObject\n\n    /// A closure used by response handlers that takes a request, response, data and error and returns a result.\n    var serializeResponse: (URLRequest?, HTTPURLResponse?, Data?, Error?) -> Result<SerializedObject> { get }\n}\n\n// MARK: -\n\n/// A generic `DataResponseSerializerType` used to serialize a request, response, and data into a serialized object.\npublic struct DataResponseSerializer<Value>: DataResponseSerializerProtocol {\n    /// The type of serialized object to be created by this `DataResponseSerializer`.\n    public typealias SerializedObject = Value\n\n    /// A closure used by response handlers that takes a request, response, data and error and returns a result.\n    public var serializeResponse: (URLRequest?, HTTPURLResponse?, Data?, Error?) -> Result<Value>\n\n    /// Initializes the `ResponseSerializer` instance with the given serialize response closure.\n    ///\n    /// - parameter serializeResponse: The closure used to serialize the response.\n    ///\n    /// - returns: The new generic response serializer instance.\n    public init(serializeResponse: @escaping (URLRequest?, HTTPURLResponse?, Data?, Error?) -> Result<Value>) {\n        self.serializeResponse = serializeResponse\n    }\n}\n\n// MARK: -\n\n/// The type in which all download response serializers must conform to in order to serialize a response.\npublic protocol DownloadResponseSerializerProtocol {\n    /// The type of serialized object to be created by this `DownloadResponseSerializerType`.\n    associatedtype SerializedObject\n\n    /// A closure used by response handlers that takes a request, response, url and error and returns a result.\n    var serializeResponse: (URLRequest?, HTTPURLResponse?, URL?, Error?) -> Result<SerializedObject> { get }\n}\n\n// MARK: -\n\n/// A generic `DownloadResponseSerializerType` used to serialize a request, response, and data into a serialized object.\npublic struct DownloadResponseSerializer<Value>: DownloadResponseSerializerProtocol {\n    /// The type of serialized object to be created by this `DownloadResponseSerializer`.\n    public typealias SerializedObject = Value\n\n    /// A closure used by response handlers that takes a request, response, url and error and returns a result.\n    public var serializeResponse: (URLRequest?, HTTPURLResponse?, URL?, Error?) -> Result<Value>\n\n    /// Initializes the `ResponseSerializer` instance with the given serialize response closure.\n    ///\n    /// - parameter serializeResponse: The closure used to serialize the response.\n    ///\n    /// - returns: The new generic response serializer instance.\n    public init(serializeResponse: @escaping (URLRequest?, HTTPURLResponse?, URL?, Error?) -> Result<Value>) {\n        self.serializeResponse = serializeResponse\n    }\n}\n\n// MARK: - Timeline\n\nextension Request {\n    var timeline: Timeline {\n        let requestStartTime = self.startTime ?? CFAbsoluteTimeGetCurrent()\n        let requestCompletedTime = self.endTime ?? CFAbsoluteTimeGetCurrent()\n        let initialResponseTime = self.delegate.initialResponseTime ?? requestCompletedTime\n\n        return Timeline(\n            requestStartTime: requestStartTime,\n            initialResponseTime: initialResponseTime,\n            requestCompletedTime: requestCompletedTime,\n            serializationCompletedTime: CFAbsoluteTimeGetCurrent()\n        )\n    }\n}\n\n// MARK: - Default\n\nextension DataRequest {\n    /// Adds a handler to be called once the request has finished.\n    ///\n    /// - parameter queue:             The queue on which the completion handler is dispatched.\n    /// - parameter completionHandler: The code to be executed once the request has finished.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    public func response(queue: DispatchQueue? = nil, completionHandler: @escaping (DefaultDataResponse) -> Void) -> Self {\n        delegate.queue.addOperation {\n            (queue ?? DispatchQueue.main).async {\n                var dataResponse = DefaultDataResponse(\n                    request: self.request,\n                    response: self.response,\n                    data: self.delegate.data,\n                    error: self.delegate.error,\n                    timeline: self.timeline\n                )\n\n                dataResponse.add(self.delegate.metrics)\n\n                completionHandler(dataResponse)\n            }\n        }\n\n        return self\n    }\n\n    /// Adds a handler to be called once the request has finished.\n    ///\n    /// - parameter queue:              The queue on which the completion handler is dispatched.\n    /// - parameter responseSerializer: The response serializer responsible for serializing the request, response,\n    ///                                 and data.\n    /// - parameter completionHandler:  The code to be executed once the request has finished.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    public func response<T: DataResponseSerializerProtocol>(\n        queue: DispatchQueue? = nil,\n        responseSerializer: T,\n        completionHandler: @escaping (DataResponse<T.SerializedObject>) -> Void)\n        -> Self\n    {\n        delegate.queue.addOperation {\n            let result = responseSerializer.serializeResponse(\n                self.request,\n                self.response,\n                self.delegate.data,\n                self.delegate.error\n            )\n\n            var dataResponse = DataResponse<T.SerializedObject>(\n                request: self.request,\n                response: self.response,\n                data: self.delegate.data,\n                result: result,\n                timeline: self.timeline\n            )\n\n            dataResponse.add(self.delegate.metrics)\n\n            (queue ?? DispatchQueue.main).async { completionHandler(dataResponse) }\n        }\n\n        return self\n    }\n}\n\nextension DownloadRequest {\n    /// Adds a handler to be called once the request has finished.\n    ///\n    /// - parameter queue:             The queue on which the completion handler is dispatched.\n    /// - parameter completionHandler: The code to be executed once the request has finished.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    public func response(\n        queue: DispatchQueue? = nil,\n        completionHandler: @escaping (DefaultDownloadResponse) -> Void)\n        -> Self\n    {\n        delegate.queue.addOperation {\n            (queue ?? DispatchQueue.main).async {\n                var downloadResponse = DefaultDownloadResponse(\n                    request: self.request,\n                    response: self.response,\n                    temporaryURL: self.downloadDelegate.temporaryURL,\n                    destinationURL: self.downloadDelegate.destinationURL,\n                    resumeData: self.downloadDelegate.resumeData,\n                    error: self.downloadDelegate.error,\n                    timeline: self.timeline\n                )\n\n                downloadResponse.add(self.delegate.metrics)\n\n                completionHandler(downloadResponse)\n            }\n        }\n\n        return self\n    }\n\n    /// Adds a handler to be called once the request has finished.\n    ///\n    /// - parameter queue:              The queue on which the completion handler is dispatched.\n    /// - parameter responseSerializer: The response serializer responsible for serializing the request, response,\n    ///                                 and data contained in the destination url.\n    /// - parameter completionHandler:  The code to be executed once the request has finished.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    public func response<T: DownloadResponseSerializerProtocol>(\n        queue: DispatchQueue? = nil,\n        responseSerializer: T,\n        completionHandler: @escaping (DownloadResponse<T.SerializedObject>) -> Void)\n        -> Self\n    {\n        delegate.queue.addOperation {\n            let result = responseSerializer.serializeResponse(\n                self.request,\n                self.response,\n                self.downloadDelegate.fileURL,\n                self.downloadDelegate.error\n            )\n\n            var downloadResponse = DownloadResponse<T.SerializedObject>(\n                request: self.request,\n                response: self.response,\n                temporaryURL: self.downloadDelegate.temporaryURL,\n                destinationURL: self.downloadDelegate.destinationURL,\n                resumeData: self.downloadDelegate.resumeData,\n                result: result,\n                timeline: self.timeline\n            )\n\n            downloadResponse.add(self.delegate.metrics)\n\n            (queue ?? DispatchQueue.main).async { completionHandler(downloadResponse) }\n        }\n\n        return self\n    }\n}\n\n// MARK: - Data\n\nextension Request {\n    /// Returns a result data type that contains the response data as-is.\n    ///\n    /// - parameter response: The response from the server.\n    /// - parameter data:     The data returned from the server.\n    /// - parameter error:    The error already encountered if it exists.\n    ///\n    /// - returns: The result data type.\n    public static func serializeResponseData(response: HTTPURLResponse?, data: Data?, error: Error?) -> Result<Data> {\n        guard error == nil else { return .failure(error!) }\n\n        if let response = response, emptyDataStatusCodes.contains(response.statusCode) { return .success(Data()) }\n\n        guard let validData = data else {\n            return .failure(AFError.responseSerializationFailed(reason: .inputDataNil))\n        }\n\n        return .success(validData)\n    }\n}\n\nextension DataRequest {\n    /// Creates a response serializer that returns the associated data as-is.\n    ///\n    /// - returns: A data response serializer.\n    public static func dataResponseSerializer() -> DataResponseSerializer<Data> {\n        return DataResponseSerializer { _, response, data, error in\n            return Request.serializeResponseData(response: response, data: data, error: error)\n        }\n    }\n\n    /// Adds a handler to be called once the request has finished.\n    ///\n    /// - parameter completionHandler: The code to be executed once the request has finished.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    public func responseData(\n        queue: DispatchQueue? = nil,\n        completionHandler: @escaping (DataResponse<Data>) -> Void)\n        -> Self\n    {\n        return response(\n            queue: queue,\n            responseSerializer: DataRequest.dataResponseSerializer(),\n            completionHandler: completionHandler\n        )\n    }\n}\n\nextension DownloadRequest {\n    /// Creates a response serializer that returns the associated data as-is.\n    ///\n    /// - returns: A data response serializer.\n    public static func dataResponseSerializer() -> DownloadResponseSerializer<Data> {\n        return DownloadResponseSerializer { _, response, fileURL, error in\n            guard error == nil else { return .failure(error!) }\n\n            guard let fileURL = fileURL else {\n                return .failure(AFError.responseSerializationFailed(reason: .inputFileNil))\n            }\n\n            do {\n                let data = try Data(contentsOf: fileURL)\n                return Request.serializeResponseData(response: response, data: data, error: error)\n            } catch {\n                return .failure(AFError.responseSerializationFailed(reason: .inputFileReadFailed(at: fileURL)))\n            }\n        }\n    }\n\n    /// Adds a handler to be called once the request has finished.\n    ///\n    /// - parameter completionHandler: The code to be executed once the request has finished.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    public func responseData(\n        queue: DispatchQueue? = nil,\n        completionHandler: @escaping (DownloadResponse<Data>) -> Void)\n        -> Self\n    {\n        return response(\n            queue: queue,\n            responseSerializer: DownloadRequest.dataResponseSerializer(),\n            completionHandler: completionHandler\n        )\n    }\n}\n\n// MARK: - String\n\nextension Request {\n    /// Returns a result string type initialized from the response data with the specified string encoding.\n    ///\n    /// - parameter encoding: The string encoding. If `nil`, the string encoding will be determined from the server\n    ///                       response, falling back to the default HTTP default character set, ISO-8859-1.\n    /// - parameter response: The response from the server.\n    /// - parameter data:     The data returned from the server.\n    /// - parameter error:    The error already encountered if it exists.\n    ///\n    /// - returns: The result data type.\n    public static func serializeResponseString(\n        encoding: String.Encoding?,\n        response: HTTPURLResponse?,\n        data: Data?,\n        error: Error?)\n        -> Result<String>\n    {\n        guard error == nil else { return .failure(error!) }\n\n        if let response = response, emptyDataStatusCodes.contains(response.statusCode) { return .success(\"\") }\n\n        guard let validData = data else {\n            return .failure(AFError.responseSerializationFailed(reason: .inputDataNil))\n        }\n\n        var convertedEncoding = encoding\n\n        if let encodingName = response?.textEncodingName as CFString!, convertedEncoding == nil {\n            convertedEncoding = String.Encoding(rawValue: CFStringConvertEncodingToNSStringEncoding(\n                CFStringConvertIANACharSetNameToEncoding(encodingName))\n            )\n        }\n\n        let actualEncoding = convertedEncoding ?? String.Encoding.isoLatin1\n\n        if let string = String(data: validData, encoding: actualEncoding) {\n            return .success(string)\n        } else {\n            return .failure(AFError.responseSerializationFailed(reason: .stringSerializationFailed(encoding: actualEncoding)))\n        }\n    }\n}\n\nextension DataRequest {\n    /// Creates a response serializer that returns a result string type initialized from the response data with\n    /// the specified string encoding.\n    ///\n    /// - parameter encoding: The string encoding. If `nil`, the string encoding will be determined from the server\n    ///                       response, falling back to the default HTTP default character set, ISO-8859-1.\n    ///\n    /// - returns: A string response serializer.\n    public static func stringResponseSerializer(encoding: String.Encoding? = nil) -> DataResponseSerializer<String> {\n        return DataResponseSerializer { _, response, data, error in\n            return Request.serializeResponseString(encoding: encoding, response: response, data: data, error: error)\n        }\n    }\n\n    /// Adds a handler to be called once the request has finished.\n    ///\n    /// - parameter encoding:          The string encoding. If `nil`, the string encoding will be determined from the\n    ///                                server response, falling back to the default HTTP default character set,\n    ///                                ISO-8859-1.\n    /// - parameter completionHandler: A closure to be executed once the request has finished.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    public func responseString(\n        queue: DispatchQueue? = nil,\n        encoding: String.Encoding? = nil,\n        completionHandler: @escaping (DataResponse<String>) -> Void)\n        -> Self\n    {\n        return response(\n            queue: queue,\n            responseSerializer: DataRequest.stringResponseSerializer(encoding: encoding),\n            completionHandler: completionHandler\n        )\n    }\n}\n\nextension DownloadRequest {\n    /// Creates a response serializer that returns a result string type initialized from the response data with\n    /// the specified string encoding.\n    ///\n    /// - parameter encoding: The string encoding. If `nil`, the string encoding will be determined from the server\n    ///                       response, falling back to the default HTTP default character set, ISO-8859-1.\n    ///\n    /// - returns: A string response serializer.\n    public static func stringResponseSerializer(encoding: String.Encoding? = nil) -> DownloadResponseSerializer<String> {\n        return DownloadResponseSerializer { _, response, fileURL, error in\n            guard error == nil else { return .failure(error!) }\n\n            guard let fileURL = fileURL else {\n                return .failure(AFError.responseSerializationFailed(reason: .inputFileNil))\n            }\n\n            do {\n                let data = try Data(contentsOf: fileURL)\n                return Request.serializeResponseString(encoding: encoding, response: response, data: data, error: error)\n            } catch {\n                return .failure(AFError.responseSerializationFailed(reason: .inputFileReadFailed(at: fileURL)))\n            }\n        }\n    }\n\n    /// Adds a handler to be called once the request has finished.\n    ///\n    /// - parameter encoding:          The string encoding. If `nil`, the string encoding will be determined from the\n    ///                                server response, falling back to the default HTTP default character set,\n    ///                                ISO-8859-1.\n    /// - parameter completionHandler: A closure to be executed once the request has finished.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    public func responseString(\n        queue: DispatchQueue? = nil,\n        encoding: String.Encoding? = nil,\n        completionHandler: @escaping (DownloadResponse<String>) -> Void)\n        -> Self\n    {\n        return response(\n            queue: queue,\n            responseSerializer: DownloadRequest.stringResponseSerializer(encoding: encoding),\n            completionHandler: completionHandler\n        )\n    }\n}\n\n// MARK: - JSON\n\nextension Request {\n    /// Returns a JSON object contained in a result type constructed from the response data using `JSONSerialization`\n    /// with the specified reading options.\n    ///\n    /// - parameter options:  The JSON serialization reading options. Defaults to `.allowFragments`.\n    /// - parameter response: The response from the server.\n    /// - parameter data:     The data returned from the server.\n    /// - parameter error:    The error already encountered if it exists.\n    ///\n    /// - returns: The result data type.\n    public static func serializeResponseJSON(\n        options: JSONSerialization.ReadingOptions,\n        response: HTTPURLResponse?,\n        data: Data?,\n        error: Error?)\n        -> Result<Any>\n    {\n        guard error == nil else { return .failure(error!) }\n\n        if let response = response, emptyDataStatusCodes.contains(response.statusCode) { return .success(NSNull()) }\n\n        guard let validData = data, validData.count > 0 else {\n            return .failure(AFError.responseSerializationFailed(reason: .inputDataNilOrZeroLength))\n        }\n\n        do {\n            let json = try JSONSerialization.jsonObject(with: validData, options: options)\n            return .success(json)\n        } catch {\n            return .failure(AFError.responseSerializationFailed(reason: .jsonSerializationFailed(error: error)))\n        }\n    }\n}\n\nextension DataRequest {\n    /// Creates a response serializer that returns a JSON object result type constructed from the response data using\n    /// `JSONSerialization` with the specified reading options.\n    ///\n    /// - parameter options: The JSON serialization reading options. Defaults to `.allowFragments`.\n    ///\n    /// - returns: A JSON object response serializer.\n    public static func jsonResponseSerializer(\n        options: JSONSerialization.ReadingOptions = .allowFragments)\n        -> DataResponseSerializer<Any>\n    {\n        return DataResponseSerializer { _, response, data, error in\n            return Request.serializeResponseJSON(options: options, response: response, data: data, error: error)\n        }\n    }\n\n    /// Adds a handler to be called once the request has finished.\n    ///\n    /// - parameter options:           The JSON serialization reading options. Defaults to `.allowFragments`.\n    /// - parameter completionHandler: A closure to be executed once the request has finished.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    public func responseJSON(\n        queue: DispatchQueue? = nil,\n        options: JSONSerialization.ReadingOptions = .allowFragments,\n        completionHandler: @escaping (DataResponse<Any>) -> Void)\n        -> Self\n    {\n        return response(\n            queue: queue,\n            responseSerializer: DataRequest.jsonResponseSerializer(options: options),\n            completionHandler: completionHandler\n        )\n    }\n}\n\nextension DownloadRequest {\n    /// Creates a response serializer that returns a JSON object result type constructed from the response data using\n    /// `JSONSerialization` with the specified reading options.\n    ///\n    /// - parameter options: The JSON serialization reading options. Defaults to `.allowFragments`.\n    ///\n    /// - returns: A JSON object response serializer.\n    public static func jsonResponseSerializer(\n        options: JSONSerialization.ReadingOptions = .allowFragments)\n        -> DownloadResponseSerializer<Any>\n    {\n        return DownloadResponseSerializer { _, response, fileURL, error in\n            guard error == nil else { return .failure(error!) }\n\n            guard let fileURL = fileURL else {\n                return .failure(AFError.responseSerializationFailed(reason: .inputFileNil))\n            }\n\n            do {\n                let data = try Data(contentsOf: fileURL)\n                return Request.serializeResponseJSON(options: options, response: response, data: data, error: error)\n            } catch {\n                return .failure(AFError.responseSerializationFailed(reason: .inputFileReadFailed(at: fileURL)))\n            }\n        }\n    }\n\n    /// Adds a handler to be called once the request has finished.\n    ///\n    /// - parameter options:           The JSON serialization reading options. Defaults to `.allowFragments`.\n    /// - parameter completionHandler: A closure to be executed once the request has finished.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    public func responseJSON(\n        queue: DispatchQueue? = nil,\n        options: JSONSerialization.ReadingOptions = .allowFragments,\n        completionHandler: @escaping (DownloadResponse<Any>) -> Void)\n        -> Self\n    {\n        return response(\n            queue: queue,\n            responseSerializer: DownloadRequest.jsonResponseSerializer(options: options),\n            completionHandler: completionHandler\n        )\n    }\n}\n\n// MARK: - Property List\n\nextension Request {\n    /// Returns a plist object contained in a result type constructed from the response data using\n    /// `PropertyListSerialization` with the specified reading options.\n    ///\n    /// - parameter options:  The property list reading options. Defaults to `[]`.\n    /// - parameter response: The response from the server.\n    /// - parameter data:     The data returned from the server.\n    /// - parameter error:    The error already encountered if it exists.\n    ///\n    /// - returns: The result data type.\n    public static func serializeResponsePropertyList(\n        options: PropertyListSerialization.ReadOptions,\n        response: HTTPURLResponse?,\n        data: Data?,\n        error: Error?)\n        -> Result<Any>\n    {\n        guard error == nil else { return .failure(error!) }\n\n        if let response = response, emptyDataStatusCodes.contains(response.statusCode) { return .success(NSNull()) }\n\n        guard let validData = data, validData.count > 0 else {\n            return .failure(AFError.responseSerializationFailed(reason: .inputDataNilOrZeroLength))\n        }\n\n        do {\n            let plist = try PropertyListSerialization.propertyList(from: validData, options: options, format: nil)\n            return .success(plist)\n        } catch {\n            return .failure(AFError.responseSerializationFailed(reason: .propertyListSerializationFailed(error: error)))\n        }\n    }\n}\n\nextension DataRequest {\n    /// Creates a response serializer that returns an object constructed from the response data using\n    /// `PropertyListSerialization` with the specified reading options.\n    ///\n    /// - parameter options: The property list reading options. Defaults to `[]`.\n    ///\n    /// - returns: A property list object response serializer.\n    public static func propertyListResponseSerializer(\n        options: PropertyListSerialization.ReadOptions = [])\n        -> DataResponseSerializer<Any>\n    {\n        return DataResponseSerializer { _, response, data, error in\n            return Request.serializeResponsePropertyList(options: options, response: response, data: data, error: error)\n        }\n    }\n\n    /// Adds a handler to be called once the request has finished.\n    ///\n    /// - parameter options:           The property list reading options. Defaults to `[]`.\n    /// - parameter completionHandler: A closure to be executed once the request has finished.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    public func responsePropertyList(\n        queue: DispatchQueue? = nil,\n        options: PropertyListSerialization.ReadOptions = [],\n        completionHandler: @escaping (DataResponse<Any>) -> Void)\n        -> Self\n    {\n        return response(\n            queue: queue,\n            responseSerializer: DataRequest.propertyListResponseSerializer(options: options),\n            completionHandler: completionHandler\n        )\n    }\n}\n\nextension DownloadRequest {\n    /// Creates a response serializer that returns an object constructed from the response data using\n    /// `PropertyListSerialization` with the specified reading options.\n    ///\n    /// - parameter options: The property list reading options. Defaults to `[]`.\n    ///\n    /// - returns: A property list object response serializer.\n    public static func propertyListResponseSerializer(\n        options: PropertyListSerialization.ReadOptions = [])\n        -> DownloadResponseSerializer<Any>\n    {\n        return DownloadResponseSerializer { _, response, fileURL, error in\n            guard error == nil else { return .failure(error!) }\n\n            guard let fileURL = fileURL else {\n                return .failure(AFError.responseSerializationFailed(reason: .inputFileNil))\n            }\n\n            do {\n                let data = try Data(contentsOf: fileURL)\n                return Request.serializeResponsePropertyList(options: options, response: response, data: data, error: error)\n            } catch {\n                return .failure(AFError.responseSerializationFailed(reason: .inputFileReadFailed(at: fileURL)))\n            }\n        }\n    }\n\n    /// Adds a handler to be called once the request has finished.\n    ///\n    /// - parameter options:           The property list reading options. Defaults to `[]`.\n    /// - parameter completionHandler: A closure to be executed once the request has finished.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    public func responsePropertyList(\n        queue: DispatchQueue? = nil,\n        options: PropertyListSerialization.ReadOptions = [],\n        completionHandler: @escaping (DownloadResponse<Any>) -> Void)\n        -> Self\n    {\n        return response(\n            queue: queue,\n            responseSerializer: DownloadRequest.propertyListResponseSerializer(options: options),\n            completionHandler: completionHandler\n        )\n    }\n}\n\n/// A set of HTTP response status code that do not contain response data.\nprivate let emptyDataStatusCodes: Set<Int> = [204, 205]\n"
  },
  {
    "path": "Pods/Alamofire/Source/Result.swift",
    "content": "//\n//  Result.swift\n//\n//  Copyright (c) 2014-2017 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// Used to represent whether a request was successful or encountered an error.\n///\n/// - success: The request and all post processing operations were successful resulting in the serialization of the\n///            provided associated value.\n///\n/// - failure: The request encountered an error resulting in a failure. The associated values are the original data\n///            provided by the server as well as the error that caused the failure.\npublic enum Result<Value> {\n    case success(Value)\n    case failure(Error)\n\n    /// Returns `true` if the result is a success, `false` otherwise.\n    public var isSuccess: Bool {\n        switch self {\n        case .success:\n            return true\n        case .failure:\n            return false\n        }\n    }\n\n    /// Returns `true` if the result is a failure, `false` otherwise.\n    public var isFailure: Bool {\n        return !isSuccess\n    }\n\n    /// Returns the associated value if the result is a success, `nil` otherwise.\n    public var value: Value? {\n        switch self {\n        case .success(let value):\n            return value\n        case .failure:\n            return nil\n        }\n    }\n\n    /// Returns the associated error value if the result is a failure, `nil` otherwise.\n    public var error: Error? {\n        switch self {\n        case .success:\n            return nil\n        case .failure(let error):\n            return error\n        }\n    }\n}\n\n// MARK: - CustomStringConvertible\n\nextension Result: CustomStringConvertible {\n    /// The textual representation used when written to an output stream, which includes whether the result was a\n    /// success or failure.\n    public var description: String {\n        switch self {\n        case .success:\n            return \"SUCCESS\"\n        case .failure:\n            return \"FAILURE\"\n        }\n    }\n}\n\n// MARK: - CustomDebugStringConvertible\n\nextension Result: CustomDebugStringConvertible {\n    /// The debug textual representation used when written to an output stream, which includes whether the result was a\n    /// success or failure in addition to the value or error.\n    public var debugDescription: String {\n        switch self {\n        case .success(let value):\n            return \"SUCCESS: \\(value)\"\n        case .failure(let error):\n            return \"FAILURE: \\(error)\"\n        }\n    }\n}\n\n// MARK: - Functional APIs\n\nextension Result {\n    /// Creates a `Result` instance from the result of a closure.\n    ///\n    /// A failure result is created when the closure throws, and a success result is created when the closure\n    /// succeeds without throwing an error.\n    ///\n    ///     func someString() throws -> String { ... }\n    ///\n    ///     let result = Result(value: {\n    ///         return try someString()\n    ///     })\n    ///\n    ///     // The type of result is Result<String>\n    ///\n    /// The trailing closure syntax is also supported:\n    ///\n    ///     let result = Result { try someString() }\n    ///\n    /// - parameter value: The closure to execute and create the result for.\n    public init(value: () throws -> Value) {\n        do {\n            self = try .success(value())\n        } catch {\n            self = .failure(error)\n        }\n    }\n\n    /// Returns the success value, or throws the failure error.\n    ///\n    ///     let possibleString: Result<String> = .success(\"success\")\n    ///     try print(possibleString.unwrap())\n    ///     // Prints \"success\"\n    ///\n    ///     let noString: Result<String> = .failure(error)\n    ///     try print(noString.unwrap())\n    ///     // Throws error\n    public func unwrap() throws -> Value {\n        switch self {\n        case .success(let value):\n            return value\n        case .failure(let error):\n            throw error\n        }\n    }\n\n    /// Evaluates the specified closure when the `Result` is a success, passing the unwrapped value as a parameter.\n    ///\n    /// Use the `map` method with a closure that does not throw. For example:\n    ///\n    ///     let possibleData: Result<Data> = .success(Data())\n    ///     let possibleInt = possibleData.map { $0.count }\n    ///     try print(possibleInt.unwrap())\n    ///     // Prints \"0\"\n    ///\n    ///     let noData: Result<Data> = .failure(error)\n    ///     let noInt = noData.map { $0.count }\n    ///     try print(noInt.unwrap())\n    ///     // Throws error\n    ///\n    /// - parameter transform: A closure that takes the success value of the `Result` instance.\n    ///\n    /// - returns: A `Result` containing the result of the given closure. If this instance is a failure, returns the\n    ///            same failure.\n    public func map<T>(_ transform: (Value) -> T) -> Result<T> {\n        switch self {\n        case .success(let value):\n            return .success(transform(value))\n        case .failure(let error):\n            return .failure(error)\n        }\n    }\n\n    /// Evaluates the specified closure when the `Result` is a success, passing the unwrapped value as a parameter.\n    ///\n    /// Use the `flatMap` method with a closure that may throw an error. For example:\n    ///\n    ///     let possibleData: Result<Data> = .success(Data(...))\n    ///     let possibleObject = possibleData.flatMap {\n    ///         try JSONSerialization.jsonObject(with: $0)\n    ///     }\n    ///\n    /// - parameter transform: A closure that takes the success value of the instance.\n    ///\n    /// - returns: A `Result` containing the result of the given closure. If this instance is a failure, returns the\n    ///            same failure.\n    public func flatMap<T>(_ transform: (Value) throws -> T) -> Result<T> {\n        switch self {\n        case .success(let value):\n            do {\n                return try .success(transform(value))\n            } catch {\n                return .failure(error)\n            }\n        case .failure(let error):\n            return .failure(error)\n        }\n    }\n\n    /// Evaluates the specified closure when the `Result` is a failure, passing the unwrapped error as a parameter.\n    ///\n    /// Use the `mapError` function with a closure that does not throw. For example:\n    ///\n    ///     let possibleData: Result<Data> = .failure(someError)\n    ///     let withMyError: Result<Data> = possibleData.mapError { MyError.error($0) }\n    ///\n    /// - Parameter transform: A closure that takes the error of the instance.\n    /// - Returns: A `Result` instance containing the result of the transform. If this instance is a success, returns\n    ///            the same instance.\n    public func mapError<T: Error>(_ transform: (Error) -> T) -> Result {\n        switch self {\n        case .failure(let error):\n            return .failure(transform(error))\n        case .success:\n            return self\n        }\n    }\n\n    /// Evaluates the specified closure when the `Result` is a failure, passing the unwrapped error as a parameter.\n    ///\n    /// Use the `flatMapError` function with a closure that may throw an error. For example:\n    ///\n    ///     let possibleData: Result<Data> = .success(Data(...))\n    ///     let possibleObject = possibleData.flatMapError {\n    ///         try someFailableFunction(taking: $0)\n    ///     }\n    ///\n    /// - Parameter transform: A throwing closure that takes the error of the instance.\n    ///\n    /// - Returns: A `Result` instance containing the result of the transform. If this instance is a success, returns\n    ///            the same instance.\n    public func flatMapError<T: Error>(_ transform: (Error) throws -> T) -> Result {\n        switch self {\n        case .failure(let error):\n            do {\n                return try .failure(transform(error))\n            } catch {\n                return .failure(error)\n            }\n        case .success:\n            return self\n        }\n    }\n\n    /// Evaluates the specified closure when the `Result` is a success, passing the unwrapped value as a parameter.\n    ///\n    /// Use the `withValue` function to evaluate the passed closure without modifying the `Result` instance.\n    ///\n    /// - Parameter closure: A closure that takes the success value of this instance.\n    /// - Returns: This `Result` instance, unmodified.\n    @discardableResult\n    public func withValue(_ closure: (Value) -> Void) -> Result {\n        if case let .success(value) = self { closure(value) }\n\n        return self\n    }\n\n    /// Evaluates the specified closure when the `Result` is a failure, passing the unwrapped error as a parameter.\n    ///\n    /// Use the `withError` function to evaluate the passed closure without modifying the `Result` instance.\n    ///\n    /// - Parameter closure: A closure that takes the success value of this instance.\n    /// - Returns: This `Result` instance, unmodified.\n    @discardableResult\n    public func withError(_ closure: (Error) -> Void) -> Result {\n        if case let .failure(error) = self { closure(error) }\n\n        return self\n    }\n\n    /// Evaluates the specified closure when the `Result` is a success.\n    ///\n    /// Use the `ifSuccess` function to evaluate the passed closure without modifying the `Result` instance.\n    ///\n    /// - Parameter closure: A `Void` closure.\n    /// - Returns: This `Result` instance, unmodified.\n    @discardableResult\n    public func ifSuccess(_ closure: () -> Void) -> Result {\n        if isSuccess { closure() }\n\n        return self\n    }\n\n    /// Evaluates the specified closure when the `Result` is a failure.\n    ///\n    /// Use the `ifFailure` function to evaluate the passed closure without modifying the `Result` instance.\n    ///\n    /// - Parameter closure: A `Void` closure.\n    /// - Returns: This `Result` instance, unmodified.\n    @discardableResult\n    public func ifFailure(_ closure: () -> Void) -> Result {\n        if isFailure { closure() }\n\n        return self\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/ServerTrustPolicy.swift",
    "content": "//\n//  ServerTrustPolicy.swift\n//\n//  Copyright (c) 2014-2017 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// Responsible for managing the mapping of `ServerTrustPolicy` objects to a given host.\nopen class ServerTrustPolicyManager {\n    /// The dictionary of policies mapped to a particular host.\n    open let policies: [String: ServerTrustPolicy]\n\n    /// Initializes the `ServerTrustPolicyManager` instance with the given policies.\n    ///\n    /// Since different servers and web services can have different leaf certificates, intermediate and even root\n    /// certficates, it is important to have the flexibility to specify evaluation policies on a per host basis. This\n    /// allows for scenarios such as using default evaluation for host1, certificate pinning for host2, public key\n    /// pinning for host3 and disabling evaluation for host4.\n    ///\n    /// - parameter policies: A dictionary of all policies mapped to a particular host.\n    ///\n    /// - returns: The new `ServerTrustPolicyManager` instance.\n    public init(policies: [String: ServerTrustPolicy]) {\n        self.policies = policies\n    }\n\n    /// Returns the `ServerTrustPolicy` for the given host if applicable.\n    ///\n    /// By default, this method will return the policy that perfectly matches the given host. Subclasses could override\n    /// this method and implement more complex mapping implementations such as wildcards.\n    ///\n    /// - parameter host: The host to use when searching for a matching policy.\n    ///\n    /// - returns: The server trust policy for the given host if found.\n    open func serverTrustPolicy(forHost host: String) -> ServerTrustPolicy? {\n        return policies[host]\n    }\n}\n\n// MARK: -\n\nextension URLSession {\n    private struct AssociatedKeys {\n        static var managerKey = \"URLSession.ServerTrustPolicyManager\"\n    }\n\n    var serverTrustPolicyManager: ServerTrustPolicyManager? {\n        get {\n            return objc_getAssociatedObject(self, &AssociatedKeys.managerKey) as? ServerTrustPolicyManager\n        }\n        set (manager) {\n            objc_setAssociatedObject(self, &AssociatedKeys.managerKey, manager, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n        }\n    }\n}\n\n// MARK: - ServerTrustPolicy\n\n/// The `ServerTrustPolicy` evaluates the server trust generally provided by an `NSURLAuthenticationChallenge` when\n/// connecting to a server over a secure HTTPS connection. The policy configuration then evaluates the server trust\n/// with a given set of criteria to determine whether the server trust is valid and the connection should be made.\n///\n/// Using pinned certificates or public keys for evaluation helps prevent man-in-the-middle (MITM) attacks and other\n/// vulnerabilities. Applications dealing with sensitive customer data or financial information are strongly encouraged\n/// to route all communication over an HTTPS connection with pinning enabled.\n///\n/// - performDefaultEvaluation: Uses the default server trust evaluation while allowing you to control whether to\n///                             validate the host provided by the challenge. Applications are encouraged to always\n///                             validate the host in production environments to guarantee the validity of the server's\n///                             certificate chain.\n///\n/// - performRevokedEvaluation: Uses the default and revoked server trust evaluations allowing you to control whether to\n///                             validate the host provided by the challenge as well as specify the revocation flags for\n///                             testing for revoked certificates. Apple platforms did not start testing for revoked\n///                             certificates automatically until iOS 10.1, macOS 10.12 and tvOS 10.1 which is\n///                             demonstrated in our TLS tests. Applications are encouraged to always validate the host\n///                             in production environments to guarantee the validity of the server's certificate chain.\n///\n/// - pinCertificates:          Uses the pinned certificates to validate the server trust. The server trust is\n///                             considered valid if one of the pinned certificates match one of the server certificates.\n///                             By validating both the certificate chain and host, certificate pinning provides a very\n///                             secure form of server trust validation mitigating most, if not all, MITM attacks.\n///                             Applications are encouraged to always validate the host and require a valid certificate\n///                             chain in production environments.\n///\n/// - pinPublicKeys:            Uses the pinned public keys to validate the server trust. The server trust is considered\n///                             valid if one of the pinned public keys match one of the server certificate public keys.\n///                             By validating both the certificate chain and host, public key pinning provides a very\n///                             secure form of server trust validation mitigating most, if not all, MITM attacks.\n///                             Applications are encouraged to always validate the host and require a valid certificate\n///                             chain in production environments.\n///\n/// - disableEvaluation:        Disables all evaluation which in turn will always consider any server trust as valid.\n///\n/// - customEvaluation:         Uses the associated closure to evaluate the validity of the server trust.\npublic enum ServerTrustPolicy {\n    case performDefaultEvaluation(validateHost: Bool)\n    case performRevokedEvaluation(validateHost: Bool, revocationFlags: CFOptionFlags)\n    case pinCertificates(certificates: [SecCertificate], validateCertificateChain: Bool, validateHost: Bool)\n    case pinPublicKeys(publicKeys: [SecKey], validateCertificateChain: Bool, validateHost: Bool)\n    case disableEvaluation\n    case customEvaluation((_ serverTrust: SecTrust, _ host: String) -> Bool)\n\n    // MARK: - Bundle Location\n\n    /// Returns all certificates within the given bundle with a `.cer` file extension.\n    ///\n    /// - parameter bundle: The bundle to search for all `.cer` files.\n    ///\n    /// - returns: All certificates within the given bundle.\n    public static func certificates(in bundle: Bundle = Bundle.main) -> [SecCertificate] {\n        var certificates: [SecCertificate] = []\n\n        let paths = Set([\".cer\", \".CER\", \".crt\", \".CRT\", \".der\", \".DER\"].map { fileExtension in\n            bundle.paths(forResourcesOfType: fileExtension, inDirectory: nil)\n        }.joined())\n\n        for path in paths {\n            if\n                let certificateData = try? Data(contentsOf: URL(fileURLWithPath: path)) as CFData,\n                let certificate = SecCertificateCreateWithData(nil, certificateData)\n            {\n                certificates.append(certificate)\n            }\n        }\n\n        return certificates\n    }\n\n    /// Returns all public keys within the given bundle with a `.cer` file extension.\n    ///\n    /// - parameter bundle: The bundle to search for all `*.cer` files.\n    ///\n    /// - returns: All public keys within the given bundle.\n    public static func publicKeys(in bundle: Bundle = Bundle.main) -> [SecKey] {\n        var publicKeys: [SecKey] = []\n\n        for certificate in certificates(in: bundle) {\n            if let publicKey = publicKey(for: certificate) {\n                publicKeys.append(publicKey)\n            }\n        }\n\n        return publicKeys\n    }\n\n    // MARK: - Evaluation\n\n    /// Evaluates whether the server trust is valid for the given host.\n    ///\n    /// - parameter serverTrust: The server trust to evaluate.\n    /// - parameter host:        The host of the challenge protection space.\n    ///\n    /// - returns: Whether the server trust is valid.\n    public func evaluate(_ serverTrust: SecTrust, forHost host: String) -> Bool {\n        var serverTrustIsValid = false\n\n        switch self {\n        case let .performDefaultEvaluation(validateHost):\n            let policy = SecPolicyCreateSSL(true, validateHost ? host as CFString : nil)\n            SecTrustSetPolicies(serverTrust, policy)\n\n            serverTrustIsValid = trustIsValid(serverTrust)\n        case let .performRevokedEvaluation(validateHost, revocationFlags):\n            let defaultPolicy = SecPolicyCreateSSL(true, validateHost ? host as CFString : nil)\n            let revokedPolicy = SecPolicyCreateRevocation(revocationFlags)\n            SecTrustSetPolicies(serverTrust, [defaultPolicy, revokedPolicy] as CFTypeRef)\n\n            serverTrustIsValid = trustIsValid(serverTrust)\n        case let .pinCertificates(pinnedCertificates, validateCertificateChain, validateHost):\n            if validateCertificateChain {\n                let policy = SecPolicyCreateSSL(true, validateHost ? host as CFString : nil)\n                SecTrustSetPolicies(serverTrust, policy)\n\n                SecTrustSetAnchorCertificates(serverTrust, pinnedCertificates as CFArray)\n                SecTrustSetAnchorCertificatesOnly(serverTrust, true)\n\n                serverTrustIsValid = trustIsValid(serverTrust)\n            } else {\n                let serverCertificatesDataArray = certificateData(for: serverTrust)\n                let pinnedCertificatesDataArray = certificateData(for: pinnedCertificates)\n\n                outerLoop: for serverCertificateData in serverCertificatesDataArray {\n                    for pinnedCertificateData in pinnedCertificatesDataArray {\n                        if serverCertificateData == pinnedCertificateData {\n                            serverTrustIsValid = true\n                            break outerLoop\n                        }\n                    }\n                }\n            }\n        case let .pinPublicKeys(pinnedPublicKeys, validateCertificateChain, validateHost):\n            var certificateChainEvaluationPassed = true\n\n            if validateCertificateChain {\n                let policy = SecPolicyCreateSSL(true, validateHost ? host as CFString : nil)\n                SecTrustSetPolicies(serverTrust, policy)\n\n                certificateChainEvaluationPassed = trustIsValid(serverTrust)\n            }\n\n            if certificateChainEvaluationPassed {\n                outerLoop: for serverPublicKey in ServerTrustPolicy.publicKeys(for: serverTrust) as [AnyObject] {\n                    for pinnedPublicKey in pinnedPublicKeys as [AnyObject] {\n                        if serverPublicKey.isEqual(pinnedPublicKey) {\n                            serverTrustIsValid = true\n                            break outerLoop\n                        }\n                    }\n                }\n            }\n        case .disableEvaluation:\n            serverTrustIsValid = true\n        case let .customEvaluation(closure):\n            serverTrustIsValid = closure(serverTrust, host)\n        }\n\n        return serverTrustIsValid\n    }\n\n    // MARK: - Private - Trust Validation\n\n    private func trustIsValid(_ trust: SecTrust) -> Bool {\n        var isValid = false\n\n        var result = SecTrustResultType.invalid\n        let status = SecTrustEvaluate(trust, &result)\n\n        if status == errSecSuccess {\n            let unspecified = SecTrustResultType.unspecified\n            let proceed = SecTrustResultType.proceed\n\n\n            isValid = result == unspecified || result == proceed\n        }\n\n        return isValid\n    }\n\n    // MARK: - Private - Certificate Data\n\n    private func certificateData(for trust: SecTrust) -> [Data] {\n        var certificates: [SecCertificate] = []\n\n        for index in 0..<SecTrustGetCertificateCount(trust) {\n            if let certificate = SecTrustGetCertificateAtIndex(trust, index) {\n                certificates.append(certificate)\n            }\n        }\n\n        return certificateData(for: certificates)\n    }\n\n    private func certificateData(for certificates: [SecCertificate]) -> [Data] {\n        return certificates.map { SecCertificateCopyData($0) as Data }\n    }\n\n    // MARK: - Private - Public Key Extraction\n\n    private static func publicKeys(for trust: SecTrust) -> [SecKey] {\n        var publicKeys: [SecKey] = []\n\n        for index in 0..<SecTrustGetCertificateCount(trust) {\n            if\n                let certificate = SecTrustGetCertificateAtIndex(trust, index),\n                let publicKey = publicKey(for: certificate)\n            {\n                publicKeys.append(publicKey)\n            }\n        }\n\n        return publicKeys\n    }\n\n    private static func publicKey(for certificate: SecCertificate) -> SecKey? {\n        var publicKey: SecKey?\n\n        let policy = SecPolicyCreateBasicX509()\n        var trust: SecTrust?\n        let trustCreationStatus = SecTrustCreateWithCertificates(certificate, policy, &trust)\n\n        if let trust = trust, trustCreationStatus == errSecSuccess {\n            publicKey = SecTrustCopyPublicKey(trust)\n        }\n\n        return publicKey\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/SessionDelegate.swift",
    "content": "//\n//  SessionDelegate.swift\n//\n//  Copyright (c) 2014-2017 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// Responsible for handling all delegate callbacks for the underlying session.\nopen class SessionDelegate: NSObject {\n\n    // MARK: URLSessionDelegate Overrides\n\n    /// Overrides default behavior for URLSessionDelegate method `urlSession(_:didBecomeInvalidWithError:)`.\n    open var sessionDidBecomeInvalidWithError: ((URLSession, Error?) -> Void)?\n\n    /// Overrides default behavior for URLSessionDelegate method `urlSession(_:didReceive:completionHandler:)`.\n    open var sessionDidReceiveChallenge: ((URLSession, URLAuthenticationChallenge) -> (URLSession.AuthChallengeDisposition, URLCredential?))?\n\n    /// Overrides all behavior for URLSessionDelegate method `urlSession(_:didReceive:completionHandler:)` and requires the caller to call the `completionHandler`.\n    open var sessionDidReceiveChallengeWithCompletion: ((URLSession, URLAuthenticationChallenge, @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) -> Void)?\n\n    /// Overrides default behavior for URLSessionDelegate method `urlSessionDidFinishEvents(forBackgroundURLSession:)`.\n    open var sessionDidFinishEventsForBackgroundURLSession: ((URLSession) -> Void)?\n\n    // MARK: URLSessionTaskDelegate Overrides\n\n    /// Overrides default behavior for URLSessionTaskDelegate method `urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)`.\n    open var taskWillPerformHTTPRedirection: ((URLSession, URLSessionTask, HTTPURLResponse, URLRequest) -> URLRequest?)?\n\n    /// Overrides all behavior for URLSessionTaskDelegate method `urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)` and\n    /// requires the caller to call the `completionHandler`.\n    open var taskWillPerformHTTPRedirectionWithCompletion: ((URLSession, URLSessionTask, HTTPURLResponse, URLRequest, @escaping (URLRequest?) -> Void) -> Void)?\n\n    /// Overrides default behavior for URLSessionTaskDelegate method `urlSession(_:task:didReceive:completionHandler:)`.\n    open var taskDidReceiveChallenge: ((URLSession, URLSessionTask, URLAuthenticationChallenge) -> (URLSession.AuthChallengeDisposition, URLCredential?))?\n\n    /// Overrides all behavior for URLSessionTaskDelegate method `urlSession(_:task:didReceive:completionHandler:)` and\n    /// requires the caller to call the `completionHandler`.\n    open var taskDidReceiveChallengeWithCompletion: ((URLSession, URLSessionTask, URLAuthenticationChallenge, @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) -> Void)?\n\n    /// Overrides default behavior for URLSessionTaskDelegate method `urlSession(_:task:needNewBodyStream:)`.\n    open var taskNeedNewBodyStream: ((URLSession, URLSessionTask) -> InputStream?)?\n\n    /// Overrides all behavior for URLSessionTaskDelegate method `urlSession(_:task:needNewBodyStream:)` and\n    /// requires the caller to call the `completionHandler`.\n    open var taskNeedNewBodyStreamWithCompletion: ((URLSession, URLSessionTask, @escaping (InputStream?) -> Void) -> Void)?\n\n    /// Overrides default behavior for URLSessionTaskDelegate method `urlSession(_:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:)`.\n    open var taskDidSendBodyData: ((URLSession, URLSessionTask, Int64, Int64, Int64) -> Void)?\n\n    /// Overrides default behavior for URLSessionTaskDelegate method `urlSession(_:task:didCompleteWithError:)`.\n    open var taskDidComplete: ((URLSession, URLSessionTask, Error?) -> Void)?\n\n    // MARK: URLSessionDataDelegate Overrides\n\n    /// Overrides default behavior for URLSessionDataDelegate method `urlSession(_:dataTask:didReceive:completionHandler:)`.\n    open var dataTaskDidReceiveResponse: ((URLSession, URLSessionDataTask, URLResponse) -> URLSession.ResponseDisposition)?\n\n    /// Overrides all behavior for URLSessionDataDelegate method `urlSession(_:dataTask:didReceive:completionHandler:)` and\n    /// requires caller to call the `completionHandler`.\n    open var dataTaskDidReceiveResponseWithCompletion: ((URLSession, URLSessionDataTask, URLResponse, @escaping (URLSession.ResponseDisposition) -> Void) -> Void)?\n\n    /// Overrides default behavior for URLSessionDataDelegate method `urlSession(_:dataTask:didBecome:)`.\n    open var dataTaskDidBecomeDownloadTask: ((URLSession, URLSessionDataTask, URLSessionDownloadTask) -> Void)?\n\n    /// Overrides default behavior for URLSessionDataDelegate method `urlSession(_:dataTask:didReceive:)`.\n    open var dataTaskDidReceiveData: ((URLSession, URLSessionDataTask, Data) -> Void)?\n\n    /// Overrides default behavior for URLSessionDataDelegate method `urlSession(_:dataTask:willCacheResponse:completionHandler:)`.\n    open var dataTaskWillCacheResponse: ((URLSession, URLSessionDataTask, CachedURLResponse) -> CachedURLResponse?)?\n\n    /// Overrides all behavior for URLSessionDataDelegate method `urlSession(_:dataTask:willCacheResponse:completionHandler:)` and\n    /// requires caller to call the `completionHandler`.\n    open var dataTaskWillCacheResponseWithCompletion: ((URLSession, URLSessionDataTask, CachedURLResponse, @escaping (CachedURLResponse?) -> Void) -> Void)?\n\n    // MARK: URLSessionDownloadDelegate Overrides\n\n    /// Overrides default behavior for URLSessionDownloadDelegate method `urlSession(_:downloadTask:didFinishDownloadingTo:)`.\n    open var downloadTaskDidFinishDownloadingToURL: ((URLSession, URLSessionDownloadTask, URL) -> Void)?\n\n    /// Overrides default behavior for URLSessionDownloadDelegate method `urlSession(_:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:)`.\n    open var downloadTaskDidWriteData: ((URLSession, URLSessionDownloadTask, Int64, Int64, Int64) -> Void)?\n\n    /// Overrides default behavior for URLSessionDownloadDelegate method `urlSession(_:downloadTask:didResumeAtOffset:expectedTotalBytes:)`.\n    open var downloadTaskDidResumeAtOffset: ((URLSession, URLSessionDownloadTask, Int64, Int64) -> Void)?\n\n    // MARK: URLSessionStreamDelegate Overrides\n\n#if !os(watchOS)\n\n    /// Overrides default behavior for URLSessionStreamDelegate method `urlSession(_:readClosedFor:)`.\n    @available(iOS 9.0, macOS 10.11, tvOS 9.0, *)\n    open var streamTaskReadClosed: ((URLSession, URLSessionStreamTask) -> Void)? {\n        get {\n            return _streamTaskReadClosed as? (URLSession, URLSessionStreamTask) -> Void\n        }\n        set {\n            _streamTaskReadClosed = newValue\n        }\n    }\n\n    /// Overrides default behavior for URLSessionStreamDelegate method `urlSession(_:writeClosedFor:)`.\n    @available(iOS 9.0, macOS 10.11, tvOS 9.0, *)\n    open var streamTaskWriteClosed: ((URLSession, URLSessionStreamTask) -> Void)? {\n        get {\n            return _streamTaskWriteClosed as? (URLSession, URLSessionStreamTask) -> Void\n        }\n        set {\n            _streamTaskWriteClosed = newValue\n        }\n    }\n\n    /// Overrides default behavior for URLSessionStreamDelegate method `urlSession(_:betterRouteDiscoveredFor:)`.\n    @available(iOS 9.0, macOS 10.11, tvOS 9.0, *)\n    open var streamTaskBetterRouteDiscovered: ((URLSession, URLSessionStreamTask) -> Void)? {\n        get {\n            return _streamTaskBetterRouteDiscovered as? (URLSession, URLSessionStreamTask) -> Void\n        }\n        set {\n            _streamTaskBetterRouteDiscovered = newValue\n        }\n    }\n\n    /// Overrides default behavior for URLSessionStreamDelegate method `urlSession(_:streamTask:didBecome:outputStream:)`.\n    @available(iOS 9.0, macOS 10.11, tvOS 9.0, *)\n    open var streamTaskDidBecomeInputAndOutputStreams: ((URLSession, URLSessionStreamTask, InputStream, OutputStream) -> Void)? {\n        get {\n            return _streamTaskDidBecomeInputStream as? (URLSession, URLSessionStreamTask, InputStream, OutputStream) -> Void\n        }\n        set {\n            _streamTaskDidBecomeInputStream = newValue\n        }\n    }\n\n    var _streamTaskReadClosed: Any?\n    var _streamTaskWriteClosed: Any?\n    var _streamTaskBetterRouteDiscovered: Any?\n    var _streamTaskDidBecomeInputStream: Any?\n\n#endif\n\n    // MARK: Properties\n\n    var retrier: RequestRetrier?\n    weak var sessionManager: SessionManager?\n\n    private var requests: [Int: Request] = [:]\n    private let lock = NSLock()\n\n    /// Access the task delegate for the specified task in a thread-safe manner.\n    open subscript(task: URLSessionTask) -> Request? {\n        get {\n            lock.lock() ; defer { lock.unlock() }\n            return requests[task.taskIdentifier]\n        }\n        set {\n            lock.lock() ; defer { lock.unlock() }\n            requests[task.taskIdentifier] = newValue\n        }\n    }\n\n    // MARK: Lifecycle\n\n    /// Initializes the `SessionDelegate` instance.\n    ///\n    /// - returns: The new `SessionDelegate` instance.\n    public override init() {\n        super.init()\n    }\n\n    // MARK: NSObject Overrides\n\n    /// Returns a `Bool` indicating whether the `SessionDelegate` implements or inherits a method that can respond\n    /// to a specified message.\n    ///\n    /// - parameter selector: A selector that identifies a message.\n    ///\n    /// - returns: `true` if the receiver implements or inherits a method that can respond to selector, otherwise `false`.\n    open override func responds(to selector: Selector) -> Bool {\n        #if !os(macOS)\n            if selector == #selector(URLSessionDelegate.urlSessionDidFinishEvents(forBackgroundURLSession:)) {\n                return sessionDidFinishEventsForBackgroundURLSession != nil\n            }\n        #endif\n\n        #if !os(watchOS)\n            if #available(iOS 9.0, macOS 10.11, tvOS 9.0, *) {\n                switch selector {\n                case #selector(URLSessionStreamDelegate.urlSession(_:readClosedFor:)):\n                    return streamTaskReadClosed != nil\n                case #selector(URLSessionStreamDelegate.urlSession(_:writeClosedFor:)):\n                    return streamTaskWriteClosed != nil\n                case #selector(URLSessionStreamDelegate.urlSession(_:betterRouteDiscoveredFor:)):\n                    return streamTaskBetterRouteDiscovered != nil\n                case #selector(URLSessionStreamDelegate.urlSession(_:streamTask:didBecome:outputStream:)):\n                    return streamTaskDidBecomeInputAndOutputStreams != nil\n                default:\n                    break\n                }\n            }\n        #endif\n\n        switch selector {\n        case #selector(URLSessionDelegate.urlSession(_:didBecomeInvalidWithError:)):\n            return sessionDidBecomeInvalidWithError != nil\n        case #selector(URLSessionDelegate.urlSession(_:didReceive:completionHandler:)):\n            return (sessionDidReceiveChallenge != nil  || sessionDidReceiveChallengeWithCompletion != nil)\n        case #selector(URLSessionTaskDelegate.urlSession(_:task:willPerformHTTPRedirection:newRequest:completionHandler:)):\n            return (taskWillPerformHTTPRedirection != nil || taskWillPerformHTTPRedirectionWithCompletion != nil)\n        case #selector(URLSessionDataDelegate.urlSession(_:dataTask:didReceive:completionHandler:)):\n            return (dataTaskDidReceiveResponse != nil || dataTaskDidReceiveResponseWithCompletion != nil)\n        default:\n            return type(of: self).instancesRespond(to: selector)\n        }\n    }\n}\n\n// MARK: - URLSessionDelegate\n\nextension SessionDelegate: URLSessionDelegate {\n    /// Tells the delegate that the session has been invalidated.\n    ///\n    /// - parameter session: The session object that was invalidated.\n    /// - parameter error:   The error that caused invalidation, or nil if the invalidation was explicit.\n    open func urlSession(_ session: URLSession, didBecomeInvalidWithError error: Error?) {\n        sessionDidBecomeInvalidWithError?(session, error)\n    }\n\n    /// Requests credentials from the delegate in response to a session-level authentication request from the\n    /// remote server.\n    ///\n    /// - parameter session:           The session containing the task that requested authentication.\n    /// - parameter challenge:         An object that contains the request for authentication.\n    /// - parameter completionHandler: A handler that your delegate method must call providing the disposition\n    ///                                and credential.\n    open func urlSession(\n        _ session: URLSession,\n        didReceive challenge: URLAuthenticationChallenge,\n        completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void)\n    {\n        guard sessionDidReceiveChallengeWithCompletion == nil else {\n            sessionDidReceiveChallengeWithCompletion?(session, challenge, completionHandler)\n            return\n        }\n\n        var disposition: URLSession.AuthChallengeDisposition = .performDefaultHandling\n        var credential: URLCredential?\n\n        if let sessionDidReceiveChallenge = sessionDidReceiveChallenge {\n            (disposition, credential) = sessionDidReceiveChallenge(session, challenge)\n        } else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {\n            let host = challenge.protectionSpace.host\n\n            if\n                let serverTrustPolicy = session.serverTrustPolicyManager?.serverTrustPolicy(forHost: host),\n                let serverTrust = challenge.protectionSpace.serverTrust\n            {\n                if serverTrustPolicy.evaluate(serverTrust, forHost: host) {\n                    disposition = .useCredential\n                    credential = URLCredential(trust: serverTrust)\n                } else {\n                    disposition = .cancelAuthenticationChallenge\n                }\n            }\n        }\n\n        completionHandler(disposition, credential)\n    }\n\n#if !os(macOS)\n\n    /// Tells the delegate that all messages enqueued for a session have been delivered.\n    ///\n    /// - parameter session: The session that no longer has any outstanding requests.\n    open func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) {\n        sessionDidFinishEventsForBackgroundURLSession?(session)\n    }\n\n#endif\n}\n\n// MARK: - URLSessionTaskDelegate\n\nextension SessionDelegate: URLSessionTaskDelegate {\n    /// Tells the delegate that the remote server requested an HTTP redirect.\n    ///\n    /// - parameter session:           The session containing the task whose request resulted in a redirect.\n    /// - parameter task:              The task whose request resulted in a redirect.\n    /// - parameter response:          An object containing the server’s response to the original request.\n    /// - parameter request:           A URL request object filled out with the new location.\n    /// - parameter completionHandler: A closure that your handler should call with either the value of the request\n    ///                                parameter, a modified URL request object, or NULL to refuse the redirect and\n    ///                                return the body of the redirect response.\n    open func urlSession(\n        _ session: URLSession,\n        task: URLSessionTask,\n        willPerformHTTPRedirection response: HTTPURLResponse,\n        newRequest request: URLRequest,\n        completionHandler: @escaping (URLRequest?) -> Void)\n    {\n        guard taskWillPerformHTTPRedirectionWithCompletion == nil else {\n            taskWillPerformHTTPRedirectionWithCompletion?(session, task, response, request, completionHandler)\n            return\n        }\n\n        var redirectRequest: URLRequest? = request\n\n        if let taskWillPerformHTTPRedirection = taskWillPerformHTTPRedirection {\n            redirectRequest = taskWillPerformHTTPRedirection(session, task, response, request)\n        }\n\n        completionHandler(redirectRequest)\n    }\n\n    /// Requests credentials from the delegate in response to an authentication request from the remote server.\n    ///\n    /// - parameter session:           The session containing the task whose request requires authentication.\n    /// - parameter task:              The task whose request requires authentication.\n    /// - parameter challenge:         An object that contains the request for authentication.\n    /// - parameter completionHandler: A handler that your delegate method must call providing the disposition\n    ///                                and credential.\n    open func urlSession(\n        _ session: URLSession,\n        task: URLSessionTask,\n        didReceive challenge: URLAuthenticationChallenge,\n        completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void)\n    {\n        guard taskDidReceiveChallengeWithCompletion == nil else {\n            taskDidReceiveChallengeWithCompletion?(session, task, challenge, completionHandler)\n            return\n        }\n\n        if let taskDidReceiveChallenge = taskDidReceiveChallenge {\n            let result = taskDidReceiveChallenge(session, task, challenge)\n            completionHandler(result.0, result.1)\n        } else if let delegate = self[task]?.delegate {\n            delegate.urlSession(\n                session,\n                task: task,\n                didReceive: challenge,\n                completionHandler: completionHandler\n            )\n        } else {\n            urlSession(session, didReceive: challenge, completionHandler: completionHandler)\n        }\n    }\n\n    /// Tells the delegate when a task requires a new request body stream to send to the remote server.\n    ///\n    /// - parameter session:           The session containing the task that needs a new body stream.\n    /// - parameter task:              The task that needs a new body stream.\n    /// - parameter completionHandler: A completion handler that your delegate method should call with the new body stream.\n    open func urlSession(\n        _ session: URLSession,\n        task: URLSessionTask,\n        needNewBodyStream completionHandler: @escaping (InputStream?) -> Void)\n    {\n        guard taskNeedNewBodyStreamWithCompletion == nil else {\n            taskNeedNewBodyStreamWithCompletion?(session, task, completionHandler)\n            return\n        }\n\n        if let taskNeedNewBodyStream = taskNeedNewBodyStream {\n            completionHandler(taskNeedNewBodyStream(session, task))\n        } else if let delegate = self[task]?.delegate {\n            delegate.urlSession(session, task: task, needNewBodyStream: completionHandler)\n        }\n    }\n\n    /// Periodically informs the delegate of the progress of sending body content to the server.\n    ///\n    /// - parameter session:                  The session containing the data task.\n    /// - parameter task:                     The data task.\n    /// - parameter bytesSent:                The number of bytes sent since the last time this delegate method was called.\n    /// - parameter totalBytesSent:           The total number of bytes sent so far.\n    /// - parameter totalBytesExpectedToSend: The expected length of the body data.\n    open func urlSession(\n        _ session: URLSession,\n        task: URLSessionTask,\n        didSendBodyData bytesSent: Int64,\n        totalBytesSent: Int64,\n        totalBytesExpectedToSend: Int64)\n    {\n        if let taskDidSendBodyData = taskDidSendBodyData {\n            taskDidSendBodyData(session, task, bytesSent, totalBytesSent, totalBytesExpectedToSend)\n        } else if let delegate = self[task]?.delegate as? UploadTaskDelegate {\n            delegate.URLSession(\n                session,\n                task: task,\n                didSendBodyData: bytesSent,\n                totalBytesSent: totalBytesSent,\n                totalBytesExpectedToSend: totalBytesExpectedToSend\n            )\n        }\n    }\n\n#if !os(watchOS)\n\n    /// Tells the delegate that the session finished collecting metrics for the task.\n    ///\n    /// - parameter session: The session collecting the metrics.\n    /// - parameter task:    The task whose metrics have been collected.\n    /// - parameter metrics: The collected metrics.\n    @available(iOS 10.0, macOS 10.12, tvOS 10.0, *)\n    @objc(URLSession:task:didFinishCollectingMetrics:)\n    open func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics) {\n        self[task]?.delegate.metrics = metrics\n    }\n\n#endif\n\n    /// Tells the delegate that the task finished transferring data.\n    ///\n    /// - parameter session: The session containing the task whose request finished transferring data.\n    /// - parameter task:    The task whose request finished transferring data.\n    /// - parameter error:   If an error occurred, an error object indicating how the transfer failed, otherwise nil.\n    open func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {\n        /// Executed after it is determined that the request is not going to be retried\n        let completeTask: (URLSession, URLSessionTask, Error?) -> Void = { [weak self] session, task, error in\n            guard let strongSelf = self else { return }\n\n            strongSelf.taskDidComplete?(session, task, error)\n\n            strongSelf[task]?.delegate.urlSession(session, task: task, didCompleteWithError: error)\n\n            NotificationCenter.default.post(\n                name: Notification.Name.Task.DidComplete,\n                object: strongSelf,\n                userInfo: [Notification.Key.Task: task]\n            )\n\n            strongSelf[task] = nil\n        }\n\n        guard let request = self[task], let sessionManager = sessionManager else {\n            completeTask(session, task, error)\n            return\n        }\n\n        // Run all validations on the request before checking if an error occurred\n        request.validations.forEach { $0() }\n\n        // Determine whether an error has occurred\n        var error: Error? = error\n\n        if request.delegate.error != nil {\n            error = request.delegate.error\n        }\n\n        /// If an error occurred and the retrier is set, asynchronously ask the retrier if the request\n        /// should be retried. Otherwise, complete the task by notifying the task delegate.\n        if let retrier = retrier, let error = error {\n            retrier.should(sessionManager, retry: request, with: error) { [weak self] shouldRetry, timeDelay in\n                guard shouldRetry else { completeTask(session, task, error) ; return }\n\n                DispatchQueue.utility.after(timeDelay) { [weak self] in\n                    guard let strongSelf = self else { return }\n\n                    let retrySucceeded = strongSelf.sessionManager?.retry(request) ?? false\n\n                    if retrySucceeded, let task = request.task {\n                        strongSelf[task] = request\n                        return\n                    } else {\n                        completeTask(session, task, error)\n                    }\n                }\n            }\n        } else {\n            completeTask(session, task, error)\n        }\n    }\n}\n\n// MARK: - URLSessionDataDelegate\n\nextension SessionDelegate: URLSessionDataDelegate {\n    /// Tells the delegate that the data task received the initial reply (headers) from the server.\n    ///\n    /// - parameter session:           The session containing the data task that received an initial reply.\n    /// - parameter dataTask:          The data task that received an initial reply.\n    /// - parameter response:          A URL response object populated with headers.\n    /// - parameter completionHandler: A completion handler that your code calls to continue the transfer, passing a\n    ///                                constant to indicate whether the transfer should continue as a data task or\n    ///                                should become a download task.\n    open func urlSession(\n        _ session: URLSession,\n        dataTask: URLSessionDataTask,\n        didReceive response: URLResponse,\n        completionHandler: @escaping (URLSession.ResponseDisposition) -> Void)\n    {\n        guard dataTaskDidReceiveResponseWithCompletion == nil else {\n            dataTaskDidReceiveResponseWithCompletion?(session, dataTask, response, completionHandler)\n            return\n        }\n\n        var disposition: URLSession.ResponseDisposition = .allow\n\n        if let dataTaskDidReceiveResponse = dataTaskDidReceiveResponse {\n            disposition = dataTaskDidReceiveResponse(session, dataTask, response)\n        }\n\n        completionHandler(disposition)\n    }\n\n    /// Tells the delegate that the data task was changed to a download task.\n    ///\n    /// - parameter session:      The session containing the task that was replaced by a download task.\n    /// - parameter dataTask:     The data task that was replaced by a download task.\n    /// - parameter downloadTask: The new download task that replaced the data task.\n    open func urlSession(\n        _ session: URLSession,\n        dataTask: URLSessionDataTask,\n        didBecome downloadTask: URLSessionDownloadTask)\n    {\n        if let dataTaskDidBecomeDownloadTask = dataTaskDidBecomeDownloadTask {\n            dataTaskDidBecomeDownloadTask(session, dataTask, downloadTask)\n        } else {\n            self[downloadTask]?.delegate = DownloadTaskDelegate(task: downloadTask)\n        }\n    }\n\n    /// Tells the delegate that the data task has received some of the expected data.\n    ///\n    /// - parameter session:  The session containing the data task that provided data.\n    /// - parameter dataTask: The data task that provided data.\n    /// - parameter data:     A data object containing the transferred data.\n    open func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {\n        if let dataTaskDidReceiveData = dataTaskDidReceiveData {\n            dataTaskDidReceiveData(session, dataTask, data)\n        } else if let delegate = self[dataTask]?.delegate as? DataTaskDelegate {\n            delegate.urlSession(session, dataTask: dataTask, didReceive: data)\n        }\n    }\n\n    /// Asks the delegate whether the data (or upload) task should store the response in the cache.\n    ///\n    /// - parameter session:           The session containing the data (or upload) task.\n    /// - parameter dataTask:          The data (or upload) task.\n    /// - parameter proposedResponse:  The default caching behavior. This behavior is determined based on the current\n    ///                                caching policy and the values of certain received headers, such as the Pragma\n    ///                                and Cache-Control headers.\n    /// - parameter completionHandler: A block that your handler must call, providing either the original proposed\n    ///                                response, a modified version of that response, or NULL to prevent caching the\n    ///                                response. If your delegate implements this method, it must call this completion\n    ///                                handler; otherwise, your app leaks memory.\n    open func urlSession(\n        _ session: URLSession,\n        dataTask: URLSessionDataTask,\n        willCacheResponse proposedResponse: CachedURLResponse,\n        completionHandler: @escaping (CachedURLResponse?) -> Void)\n    {\n        guard dataTaskWillCacheResponseWithCompletion == nil else {\n            dataTaskWillCacheResponseWithCompletion?(session, dataTask, proposedResponse, completionHandler)\n            return\n        }\n\n        if let dataTaskWillCacheResponse = dataTaskWillCacheResponse {\n            completionHandler(dataTaskWillCacheResponse(session, dataTask, proposedResponse))\n        } else if let delegate = self[dataTask]?.delegate as? DataTaskDelegate {\n            delegate.urlSession(\n                session,\n                dataTask: dataTask,\n                willCacheResponse: proposedResponse,\n                completionHandler: completionHandler\n            )\n        } else {\n            completionHandler(proposedResponse)\n        }\n    }\n}\n\n// MARK: - URLSessionDownloadDelegate\n\nextension SessionDelegate: URLSessionDownloadDelegate {\n    /// Tells the delegate that a download task has finished downloading.\n    ///\n    /// - parameter session:      The session containing the download task that finished.\n    /// - parameter downloadTask: The download task that finished.\n    /// - parameter location:     A file URL for the temporary file. Because the file is temporary, you must either\n    ///                           open the file for reading or move it to a permanent location in your app’s sandbox\n    ///                           container directory before returning from this delegate method.\n    open func urlSession(\n        _ session: URLSession,\n        downloadTask: URLSessionDownloadTask,\n        didFinishDownloadingTo location: URL)\n    {\n        if let downloadTaskDidFinishDownloadingToURL = downloadTaskDidFinishDownloadingToURL {\n            downloadTaskDidFinishDownloadingToURL(session, downloadTask, location)\n        } else if let delegate = self[downloadTask]?.delegate as? DownloadTaskDelegate {\n            delegate.urlSession(session, downloadTask: downloadTask, didFinishDownloadingTo: location)\n        }\n    }\n\n    /// Periodically informs the delegate about the download’s progress.\n    ///\n    /// - parameter session:                   The session containing the download task.\n    /// - parameter downloadTask:              The download task.\n    /// - parameter bytesWritten:              The number of bytes transferred since the last time this delegate\n    ///                                        method was called.\n    /// - parameter totalBytesWritten:         The total number of bytes transferred so far.\n    /// - parameter totalBytesExpectedToWrite: The expected length of the file, as provided by the Content-Length\n    ///                                        header. If this header was not provided, the value is\n    ///                                        `NSURLSessionTransferSizeUnknown`.\n    open func urlSession(\n        _ session: URLSession,\n        downloadTask: URLSessionDownloadTask,\n        didWriteData bytesWritten: Int64,\n        totalBytesWritten: Int64,\n        totalBytesExpectedToWrite: Int64)\n    {\n        if let downloadTaskDidWriteData = downloadTaskDidWriteData {\n            downloadTaskDidWriteData(session, downloadTask, bytesWritten, totalBytesWritten, totalBytesExpectedToWrite)\n        } else if let delegate = self[downloadTask]?.delegate as? DownloadTaskDelegate {\n            delegate.urlSession(\n                session,\n                downloadTask: downloadTask,\n                didWriteData: bytesWritten,\n                totalBytesWritten: totalBytesWritten,\n                totalBytesExpectedToWrite: totalBytesExpectedToWrite\n            )\n        }\n    }\n\n    /// Tells the delegate that the download task has resumed downloading.\n    ///\n    /// - parameter session:            The session containing the download task that finished.\n    /// - parameter downloadTask:       The download task that resumed. See explanation in the discussion.\n    /// - parameter fileOffset:         If the file's cache policy or last modified date prevents reuse of the\n    ///                                 existing content, then this value is zero. Otherwise, this value is an\n    ///                                 integer representing the number of bytes on disk that do not need to be\n    ///                                 retrieved again.\n    /// - parameter expectedTotalBytes: The expected length of the file, as provided by the Content-Length header.\n    ///                                 If this header was not provided, the value is NSURLSessionTransferSizeUnknown.\n    open func urlSession(\n        _ session: URLSession,\n        downloadTask: URLSessionDownloadTask,\n        didResumeAtOffset fileOffset: Int64,\n        expectedTotalBytes: Int64)\n    {\n        if let downloadTaskDidResumeAtOffset = downloadTaskDidResumeAtOffset {\n            downloadTaskDidResumeAtOffset(session, downloadTask, fileOffset, expectedTotalBytes)\n        } else if let delegate = self[downloadTask]?.delegate as? DownloadTaskDelegate {\n            delegate.urlSession(\n                session,\n                downloadTask: downloadTask,\n                didResumeAtOffset: fileOffset,\n                expectedTotalBytes: expectedTotalBytes\n            )\n        }\n    }\n}\n\n// MARK: - URLSessionStreamDelegate\n\n#if !os(watchOS)\n\n@available(iOS 9.0, macOS 10.11, tvOS 9.0, *)\nextension SessionDelegate: URLSessionStreamDelegate {\n    /// Tells the delegate that the read side of the connection has been closed.\n    ///\n    /// - parameter session:    The session.\n    /// - parameter streamTask: The stream task.\n    open func urlSession(_ session: URLSession, readClosedFor streamTask: URLSessionStreamTask) {\n        streamTaskReadClosed?(session, streamTask)\n    }\n\n    /// Tells the delegate that the write side of the connection has been closed.\n    ///\n    /// - parameter session:    The session.\n    /// - parameter streamTask: The stream task.\n    open func urlSession(_ session: URLSession, writeClosedFor streamTask: URLSessionStreamTask) {\n        streamTaskWriteClosed?(session, streamTask)\n    }\n\n    /// Tells the delegate that the system has determined that a better route to the host is available.\n    ///\n    /// - parameter session:    The session.\n    /// - parameter streamTask: The stream task.\n    open func urlSession(_ session: URLSession, betterRouteDiscoveredFor streamTask: URLSessionStreamTask) {\n        streamTaskBetterRouteDiscovered?(session, streamTask)\n    }\n\n    /// Tells the delegate that the stream task has been completed and provides the unopened stream objects.\n    ///\n    /// - parameter session:      The session.\n    /// - parameter streamTask:   The stream task.\n    /// - parameter inputStream:  The new input stream.\n    /// - parameter outputStream: The new output stream.\n    open func urlSession(\n        _ session: URLSession,\n        streamTask: URLSessionStreamTask,\n        didBecome inputStream: InputStream,\n        outputStream: OutputStream)\n    {\n        streamTaskDidBecomeInputAndOutputStreams?(session, streamTask, inputStream, outputStream)\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/Alamofire/Source/SessionManager.swift",
    "content": "//\n//  SessionManager.swift\n//\n//  Copyright (c) 2014-2017 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// Responsible for creating and managing `Request` objects, as well as their underlying `NSURLSession`.\nopen class SessionManager {\n\n    // MARK: - Helper Types\n\n    /// Defines whether the `MultipartFormData` encoding was successful and contains result of the encoding as\n    /// associated values.\n    ///\n    /// - Success: Represents a successful `MultipartFormData` encoding and contains the new `UploadRequest` along with\n    ///            streaming information.\n    /// - Failure: Used to represent a failure in the `MultipartFormData` encoding and also contains the encoding\n    ///            error.\n    public enum MultipartFormDataEncodingResult {\n        case success(request: UploadRequest, streamingFromDisk: Bool, streamFileURL: URL?)\n        case failure(Error)\n    }\n\n    // MARK: - Properties\n\n    /// A default instance of `SessionManager`, used by top-level Alamofire request methods, and suitable for use\n    /// directly for any ad hoc requests.\n    open static let `default`: SessionManager = {\n        let configuration = URLSessionConfiguration.default\n        configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders\n\n        return SessionManager(configuration: configuration)\n    }()\n\n    /// Creates default values for the \"Accept-Encoding\", \"Accept-Language\" and \"User-Agent\" headers.\n    open static let defaultHTTPHeaders: HTTPHeaders = {\n        // Accept-Encoding HTTP Header; see https://tools.ietf.org/html/rfc7230#section-4.2.3\n        let acceptEncoding: String = \"gzip;q=1.0, compress;q=0.5\"\n\n        // Accept-Language HTTP Header; see https://tools.ietf.org/html/rfc7231#section-5.3.5\n        let acceptLanguage = Locale.preferredLanguages.prefix(6).enumerated().map { index, languageCode in\n            let quality = 1.0 - (Double(index) * 0.1)\n            return \"\\(languageCode);q=\\(quality)\"\n        }.joined(separator: \", \")\n\n        // User-Agent Header; see https://tools.ietf.org/html/rfc7231#section-5.5.3\n        // Example: `iOS Example/1.0 (org.alamofire.iOS-Example; build:1; iOS 10.0.0) Alamofire/4.0.0`\n        let userAgent: String = {\n            if let info = Bundle.main.infoDictionary {\n                let executable = info[kCFBundleExecutableKey as String] as? String ?? \"Unknown\"\n                let bundle = info[kCFBundleIdentifierKey as String] as? String ?? \"Unknown\"\n                let appVersion = info[\"CFBundleShortVersionString\"] as? String ?? \"Unknown\"\n                let appBuild = info[kCFBundleVersionKey as String] as? String ?? \"Unknown\"\n\n                let osNameVersion: String = {\n                    let version = ProcessInfo.processInfo.operatingSystemVersion\n                    let versionString = \"\\(version.majorVersion).\\(version.minorVersion).\\(version.patchVersion)\"\n\n                    let osName: String = {\n                        #if os(iOS)\n                            return \"iOS\"\n                        #elseif os(watchOS)\n                            return \"watchOS\"\n                        #elseif os(tvOS)\n                            return \"tvOS\"\n                        #elseif os(macOS)\n                            return \"OS X\"\n                        #elseif os(Linux)\n                            return \"Linux\"\n                        #else\n                            return \"Unknown\"\n                        #endif\n                    }()\n\n                    return \"\\(osName) \\(versionString)\"\n                }()\n\n                let alamofireVersion: String = {\n                    guard\n                        let afInfo = Bundle(for: SessionManager.self).infoDictionary,\n                        let build = afInfo[\"CFBundleShortVersionString\"]\n                    else { return \"Unknown\" }\n\n                    return \"Alamofire/\\(build)\"\n                }()\n\n                return \"\\(executable)/\\(appVersion) (\\(bundle); build:\\(appBuild); \\(osNameVersion)) \\(alamofireVersion)\"\n            }\n\n            return \"Alamofire\"\n        }()\n\n        return [\n            \"Accept-Encoding\": acceptEncoding,\n            \"Accept-Language\": acceptLanguage,\n            \"User-Agent\": userAgent\n        ]\n    }()\n\n    /// Default memory threshold used when encoding `MultipartFormData` in bytes.\n    open static let multipartFormDataEncodingMemoryThreshold: UInt64 = 10_000_000\n\n    /// The underlying session.\n    open let session: URLSession\n\n    /// The session delegate handling all the task and session delegate callbacks.\n    open let delegate: SessionDelegate\n\n    /// Whether to start requests immediately after being constructed. `true` by default.\n    open var startRequestsImmediately: Bool = true\n\n    /// The request adapter called each time a new request is created.\n    open var adapter: RequestAdapter?\n\n    /// The request retrier called each time a request encounters an error to determine whether to retry the request.\n    open var retrier: RequestRetrier? {\n        get { return delegate.retrier }\n        set { delegate.retrier = newValue }\n    }\n\n    /// The background completion handler closure provided by the UIApplicationDelegate\n    /// `application:handleEventsForBackgroundURLSession:completionHandler:` method. By setting the background\n    /// completion handler, the SessionDelegate `sessionDidFinishEventsForBackgroundURLSession` closure implementation\n    /// will automatically call the handler.\n    ///\n    /// If you need to handle your own events before the handler is called, then you need to override the\n    /// SessionDelegate `sessionDidFinishEventsForBackgroundURLSession` and manually call the handler when finished.\n    ///\n    /// `nil` by default.\n    open var backgroundCompletionHandler: (() -> Void)?\n\n    let queue = DispatchQueue(label: \"org.alamofire.session-manager.\" + UUID().uuidString)\n\n    // MARK: - Lifecycle\n\n    /// Creates an instance with the specified `configuration`, `delegate` and `serverTrustPolicyManager`.\n    ///\n    /// - parameter configuration:            The configuration used to construct the managed session.\n    ///                                       `URLSessionConfiguration.default` by default.\n    /// - parameter delegate:                 The delegate used when initializing the session. `SessionDelegate()` by\n    ///                                       default.\n    /// - parameter serverTrustPolicyManager: The server trust policy manager to use for evaluating all server trust\n    ///                                       challenges. `nil` by default.\n    ///\n    /// - returns: The new `SessionManager` instance.\n    public init(\n        configuration: URLSessionConfiguration = URLSessionConfiguration.default,\n        delegate: SessionDelegate = SessionDelegate(),\n        serverTrustPolicyManager: ServerTrustPolicyManager? = nil)\n    {\n        self.delegate = delegate\n        self.session = URLSession(configuration: configuration, delegate: delegate, delegateQueue: nil)\n\n        commonInit(serverTrustPolicyManager: serverTrustPolicyManager)\n    }\n\n    /// Creates an instance with the specified `session`, `delegate` and `serverTrustPolicyManager`.\n    ///\n    /// - parameter session:                  The URL session.\n    /// - parameter delegate:                 The delegate of the URL session. Must equal the URL session's delegate.\n    /// - parameter serverTrustPolicyManager: The server trust policy manager to use for evaluating all server trust\n    ///                                       challenges. `nil` by default.\n    ///\n    /// - returns: The new `SessionManager` instance if the URL session's delegate matches; `nil` otherwise.\n    public init?(\n        session: URLSession,\n        delegate: SessionDelegate,\n        serverTrustPolicyManager: ServerTrustPolicyManager? = nil)\n    {\n        guard delegate === session.delegate else { return nil }\n\n        self.delegate = delegate\n        self.session = session\n\n        commonInit(serverTrustPolicyManager: serverTrustPolicyManager)\n    }\n\n    private func commonInit(serverTrustPolicyManager: ServerTrustPolicyManager?) {\n        session.serverTrustPolicyManager = serverTrustPolicyManager\n\n        delegate.sessionManager = self\n\n        delegate.sessionDidFinishEventsForBackgroundURLSession = { [weak self] session in\n            guard let strongSelf = self else { return }\n            DispatchQueue.main.async { strongSelf.backgroundCompletionHandler?() }\n        }\n    }\n\n    deinit {\n        session.invalidateAndCancel()\n    }\n\n    // MARK: - Data Request\n\n    /// Creates a `DataRequest` to retrieve the contents of the specified `url`, `method`, `parameters`, `encoding`\n    /// and `headers`.\n    ///\n    /// - parameter url:        The URL.\n    /// - parameter method:     The HTTP method. `.get` by default.\n    /// - parameter parameters: The parameters. `nil` by default.\n    /// - parameter encoding:   The parameter encoding. `URLEncoding.default` by default.\n    /// - parameter headers:    The HTTP headers. `nil` by default.\n    ///\n    /// - returns: The created `DataRequest`.\n    @discardableResult\n    open func request(\n        _ url: URLConvertible,\n        method: HTTPMethod = .get,\n        parameters: Parameters? = nil,\n        encoding: ParameterEncoding = URLEncoding.default,\n        headers: HTTPHeaders? = nil)\n        -> DataRequest\n    {\n        var originalRequest: URLRequest?\n\n        do {\n            originalRequest = try URLRequest(url: url, method: method, headers: headers)\n            let encodedURLRequest = try encoding.encode(originalRequest!, with: parameters)\n            return request(encodedURLRequest)\n        } catch {\n            return request(originalRequest, failedWith: error)\n        }\n    }\n\n    /// Creates a `DataRequest` to retrieve the contents of a URL based on the specified `urlRequest`.\n    ///\n    /// If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n    ///\n    /// - parameter urlRequest: The URL request.\n    ///\n    /// - returns: The created `DataRequest`.\n    open func request(_ urlRequest: URLRequestConvertible) -> DataRequest {\n        var originalRequest: URLRequest?\n\n        do {\n            originalRequest = try urlRequest.asURLRequest()\n            let originalTask = DataRequest.Requestable(urlRequest: originalRequest!)\n\n            let task = try originalTask.task(session: session, adapter: adapter, queue: queue)\n            let request = DataRequest(session: session, requestTask: .data(originalTask, task))\n\n            delegate[task] = request\n\n            if startRequestsImmediately { request.resume() }\n\n            return request\n        } catch {\n            return request(originalRequest, failedWith: error)\n        }\n    }\n\n    // MARK: Private - Request Implementation\n\n    private func request(_ urlRequest: URLRequest?, failedWith error: Error) -> DataRequest {\n        var requestTask: Request.RequestTask = .data(nil, nil)\n\n        if let urlRequest = urlRequest {\n            let originalTask = DataRequest.Requestable(urlRequest: urlRequest)\n            requestTask = .data(originalTask, nil)\n        }\n\n        let underlyingError = error.underlyingAdaptError ?? error\n        let request = DataRequest(session: session, requestTask: requestTask, error: underlyingError)\n\n        if let retrier = retrier, error is AdaptError {\n            allowRetrier(retrier, toRetry: request, with: underlyingError)\n        } else {\n            if startRequestsImmediately { request.resume() }\n        }\n\n        return request\n    }\n\n    // MARK: - Download Request\n\n    // MARK: URL Request\n\n    /// Creates a `DownloadRequest` to retrieve the contents the specified `url`, `method`, `parameters`, `encoding`,\n    /// `headers` and save them to the `destination`.\n    ///\n    /// If `destination` is not specified, the contents will remain in the temporary location determined by the\n    /// underlying URL session.\n    ///\n    /// If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n    ///\n    /// - parameter url:         The URL.\n    /// - parameter method:      The HTTP method. `.get` by default.\n    /// - parameter parameters:  The parameters. `nil` by default.\n    /// - parameter encoding:    The parameter encoding. `URLEncoding.default` by default.\n    /// - parameter headers:     The HTTP headers. `nil` by default.\n    /// - parameter destination: The closure used to determine the destination of the downloaded file. `nil` by default.\n    ///\n    /// - returns: The created `DownloadRequest`.\n    @discardableResult\n    open func download(\n        _ url: URLConvertible,\n        method: HTTPMethod = .get,\n        parameters: Parameters? = nil,\n        encoding: ParameterEncoding = URLEncoding.default,\n        headers: HTTPHeaders? = nil,\n        to destination: DownloadRequest.DownloadFileDestination? = nil)\n        -> DownloadRequest\n    {\n        do {\n            let urlRequest = try URLRequest(url: url, method: method, headers: headers)\n            let encodedURLRequest = try encoding.encode(urlRequest, with: parameters)\n            return download(encodedURLRequest, to: destination)\n        } catch {\n            return download(nil, to: destination, failedWith: error)\n        }\n    }\n\n    /// Creates a `DownloadRequest` to retrieve the contents of a URL based on the specified `urlRequest` and save\n    /// them to the `destination`.\n    ///\n    /// If `destination` is not specified, the contents will remain in the temporary location determined by the\n    /// underlying URL session.\n    ///\n    /// If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n    ///\n    /// - parameter urlRequest:  The URL request\n    /// - parameter destination: The closure used to determine the destination of the downloaded file. `nil` by default.\n    ///\n    /// - returns: The created `DownloadRequest`.\n    @discardableResult\n    open func download(\n        _ urlRequest: URLRequestConvertible,\n        to destination: DownloadRequest.DownloadFileDestination? = nil)\n        -> DownloadRequest\n    {\n        do {\n            let urlRequest = try urlRequest.asURLRequest()\n            return download(.request(urlRequest), to: destination)\n        } catch {\n            return download(nil, to: destination, failedWith: error)\n        }\n    }\n\n    // MARK: Resume Data\n\n    /// Creates a `DownloadRequest` from the `resumeData` produced from a previous request cancellation to retrieve\n    /// the contents of the original request and save them to the `destination`.\n    ///\n    /// If `destination` is not specified, the contents will remain in the temporary location determined by the\n    /// underlying URL session.\n    ///\n    /// If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n    ///\n    /// On the latest release of all the Apple platforms (iOS 10, macOS 10.12, tvOS 10, watchOS 3), `resumeData` is broken\n    /// on background URL session configurations. There's an underlying bug in the `resumeData` generation logic where the\n    /// data is written incorrectly and will always fail to resume the download. For more information about the bug and\n    /// possible workarounds, please refer to the following Stack Overflow post:\n    ///\n    ///    - http://stackoverflow.com/a/39347461/1342462\n    ///\n    /// - parameter resumeData:  The resume data. This is an opaque data blob produced by `URLSessionDownloadTask`\n    ///                          when a task is cancelled. See `URLSession -downloadTask(withResumeData:)` for\n    ///                          additional information.\n    /// - parameter destination: The closure used to determine the destination of the downloaded file. `nil` by default.\n    ///\n    /// - returns: The created `DownloadRequest`.\n    @discardableResult\n    open func download(\n        resumingWith resumeData: Data,\n        to destination: DownloadRequest.DownloadFileDestination? = nil)\n        -> DownloadRequest\n    {\n        return download(.resumeData(resumeData), to: destination)\n    }\n\n    // MARK: Private - Download Implementation\n\n    private func download(\n        _ downloadable: DownloadRequest.Downloadable,\n        to destination: DownloadRequest.DownloadFileDestination?)\n        -> DownloadRequest\n    {\n        do {\n            let task = try downloadable.task(session: session, adapter: adapter, queue: queue)\n            let download = DownloadRequest(session: session, requestTask: .download(downloadable, task))\n\n            download.downloadDelegate.destination = destination\n\n            delegate[task] = download\n\n            if startRequestsImmediately { download.resume() }\n\n            return download\n        } catch {\n            return download(downloadable, to: destination, failedWith: error)\n        }\n    }\n\n    private func download(\n        _ downloadable: DownloadRequest.Downloadable?,\n        to destination: DownloadRequest.DownloadFileDestination?,\n        failedWith error: Error)\n        -> DownloadRequest\n    {\n        var downloadTask: Request.RequestTask = .download(nil, nil)\n\n        if let downloadable = downloadable {\n            downloadTask = .download(downloadable, nil)\n        }\n\n        let underlyingError = error.underlyingAdaptError ?? error\n\n        let download = DownloadRequest(session: session, requestTask: downloadTask, error: underlyingError)\n        download.downloadDelegate.destination = destination\n\n        if let retrier = retrier, error is AdaptError {\n            allowRetrier(retrier, toRetry: download, with: underlyingError)\n        } else {\n            if startRequestsImmediately { download.resume() }\n        }\n\n        return download\n    }\n\n    // MARK: - Upload Request\n\n    // MARK: File\n\n    /// Creates an `UploadRequest` from the specified `url`, `method` and `headers` for uploading the `file`.\n    ///\n    /// If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n    ///\n    /// - parameter file:    The file to upload.\n    /// - parameter url:     The URL.\n    /// - parameter method:  The HTTP method. `.post` by default.\n    /// - parameter headers: The HTTP headers. `nil` by default.\n    ///\n    /// - returns: The created `UploadRequest`.\n    @discardableResult\n    open func upload(\n        _ fileURL: URL,\n        to url: URLConvertible,\n        method: HTTPMethod = .post,\n        headers: HTTPHeaders? = nil)\n        -> UploadRequest\n    {\n        do {\n            let urlRequest = try URLRequest(url: url, method: method, headers: headers)\n            return upload(fileURL, with: urlRequest)\n        } catch {\n            return upload(nil, failedWith: error)\n        }\n    }\n\n    /// Creates a `UploadRequest` from the specified `urlRequest` for uploading the `file`.\n    ///\n    /// If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n    ///\n    /// - parameter file:       The file to upload.\n    /// - parameter urlRequest: The URL request.\n    ///\n    /// - returns: The created `UploadRequest`.\n    @discardableResult\n    open func upload(_ fileURL: URL, with urlRequest: URLRequestConvertible) -> UploadRequest {\n        do {\n            let urlRequest = try urlRequest.asURLRequest()\n            return upload(.file(fileURL, urlRequest))\n        } catch {\n            return upload(nil, failedWith: error)\n        }\n    }\n\n    // MARK: Data\n\n    /// Creates an `UploadRequest` from the specified `url`, `method` and `headers` for uploading the `data`.\n    ///\n    /// If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n    ///\n    /// - parameter data:    The data to upload.\n    /// - parameter url:     The URL.\n    /// - parameter method:  The HTTP method. `.post` by default.\n    /// - parameter headers: The HTTP headers. `nil` by default.\n    ///\n    /// - returns: The created `UploadRequest`.\n    @discardableResult\n    open func upload(\n        _ data: Data,\n        to url: URLConvertible,\n        method: HTTPMethod = .post,\n        headers: HTTPHeaders? = nil)\n        -> UploadRequest\n    {\n        do {\n            let urlRequest = try URLRequest(url: url, method: method, headers: headers)\n            return upload(data, with: urlRequest)\n        } catch {\n            return upload(nil, failedWith: error)\n        }\n    }\n\n    /// Creates an `UploadRequest` from the specified `urlRequest` for uploading the `data`.\n    ///\n    /// If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n    ///\n    /// - parameter data:       The data to upload.\n    /// - parameter urlRequest: The URL request.\n    ///\n    /// - returns: The created `UploadRequest`.\n    @discardableResult\n    open func upload(_ data: Data, with urlRequest: URLRequestConvertible) -> UploadRequest {\n        do {\n            let urlRequest = try urlRequest.asURLRequest()\n            return upload(.data(data, urlRequest))\n        } catch {\n            return upload(nil, failedWith: error)\n        }\n    }\n\n    // MARK: InputStream\n\n    /// Creates an `UploadRequest` from the specified `url`, `method` and `headers` for uploading the `stream`.\n    ///\n    /// If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n    ///\n    /// - parameter stream:  The stream to upload.\n    /// - parameter url:     The URL.\n    /// - parameter method:  The HTTP method. `.post` by default.\n    /// - parameter headers: The HTTP headers. `nil` by default.\n    ///\n    /// - returns: The created `UploadRequest`.\n    @discardableResult\n    open func upload(\n        _ stream: InputStream,\n        to url: URLConvertible,\n        method: HTTPMethod = .post,\n        headers: HTTPHeaders? = nil)\n        -> UploadRequest\n    {\n        do {\n            let urlRequest = try URLRequest(url: url, method: method, headers: headers)\n            return upload(stream, with: urlRequest)\n        } catch {\n            return upload(nil, failedWith: error)\n        }\n    }\n\n    /// Creates an `UploadRequest` from the specified `urlRequest` for uploading the `stream`.\n    ///\n    /// If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n    ///\n    /// - parameter stream:     The stream to upload.\n    /// - parameter urlRequest: The URL request.\n    ///\n    /// - returns: The created `UploadRequest`.\n    @discardableResult\n    open func upload(_ stream: InputStream, with urlRequest: URLRequestConvertible) -> UploadRequest {\n        do {\n            let urlRequest = try urlRequest.asURLRequest()\n            return upload(.stream(stream, urlRequest))\n        } catch {\n            return upload(nil, failedWith: error)\n        }\n    }\n\n    // MARK: MultipartFormData\n\n    /// Encodes `multipartFormData` using `encodingMemoryThreshold` and calls `encodingCompletion` with new\n    /// `UploadRequest` using the `url`, `method` and `headers`.\n    ///\n    /// It is important to understand the memory implications of uploading `MultipartFormData`. If the cummulative\n    /// payload is small, encoding the data in-memory and directly uploading to a server is the by far the most\n    /// efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to\n    /// be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory\n    /// footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be\n    /// used for larger payloads such as video content.\n    ///\n    /// The `encodingMemoryThreshold` parameter allows Alamofire to automatically determine whether to encode in-memory\n    /// or stream from disk. If the content length of the `MultipartFormData` is below the `encodingMemoryThreshold`,\n    /// encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk\n    /// during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding\n    /// technique was used.\n    ///\n    /// If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n    ///\n    /// - parameter multipartFormData:       The closure used to append body parts to the `MultipartFormData`.\n    /// - parameter encodingMemoryThreshold: The encoding memory threshold in bytes.\n    ///                                      `multipartFormDataEncodingMemoryThreshold` by default.\n    /// - parameter url:                     The URL.\n    /// - parameter method:                  The HTTP method. `.post` by default.\n    /// - parameter headers:                 The HTTP headers. `nil` by default.\n    /// - parameter encodingCompletion:      The closure called when the `MultipartFormData` encoding is complete.\n    open func upload(\n        multipartFormData: @escaping (MultipartFormData) -> Void,\n        usingThreshold encodingMemoryThreshold: UInt64 = SessionManager.multipartFormDataEncodingMemoryThreshold,\n        to url: URLConvertible,\n        method: HTTPMethod = .post,\n        headers: HTTPHeaders? = nil,\n        encodingCompletion: ((MultipartFormDataEncodingResult) -> Void)?)\n    {\n        do {\n            let urlRequest = try URLRequest(url: url, method: method, headers: headers)\n\n            return upload(\n                multipartFormData: multipartFormData,\n                usingThreshold: encodingMemoryThreshold,\n                with: urlRequest,\n                encodingCompletion: encodingCompletion\n            )\n        } catch {\n            DispatchQueue.main.async { encodingCompletion?(.failure(error)) }\n        }\n    }\n\n    /// Encodes `multipartFormData` using `encodingMemoryThreshold` and calls `encodingCompletion` with new\n    /// `UploadRequest` using the `urlRequest`.\n    ///\n    /// It is important to understand the memory implications of uploading `MultipartFormData`. If the cummulative\n    /// payload is small, encoding the data in-memory and directly uploading to a server is the by far the most\n    /// efficient approach. However, if the payload is too large, encoding the data in-memory could cause your app to\n    /// be terminated. Larger payloads must first be written to disk using input and output streams to keep the memory\n    /// footprint low, then the data can be uploaded as a stream from the resulting file. Streaming from disk MUST be\n    /// used for larger payloads such as video content.\n    ///\n    /// The `encodingMemoryThreshold` parameter allows Alamofire to automatically determine whether to encode in-memory\n    /// or stream from disk. If the content length of the `MultipartFormData` is below the `encodingMemoryThreshold`,\n    /// encoding takes place in-memory. If the content length exceeds the threshold, the data is streamed to disk\n    /// during the encoding process. Then the result is uploaded as data or as a stream depending on which encoding\n    /// technique was used.\n    ///\n    /// If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n    ///\n    /// - parameter multipartFormData:       The closure used to append body parts to the `MultipartFormData`.\n    /// - parameter encodingMemoryThreshold: The encoding memory threshold in bytes.\n    ///                                      `multipartFormDataEncodingMemoryThreshold` by default.\n    /// - parameter urlRequest:              The URL request.\n    /// - parameter encodingCompletion:      The closure called when the `MultipartFormData` encoding is complete.\n    open func upload(\n        multipartFormData: @escaping (MultipartFormData) -> Void,\n        usingThreshold encodingMemoryThreshold: UInt64 = SessionManager.multipartFormDataEncodingMemoryThreshold,\n        with urlRequest: URLRequestConvertible,\n        encodingCompletion: ((MultipartFormDataEncodingResult) -> Void)?)\n    {\n        DispatchQueue.global(qos: .utility).async {\n            let formData = MultipartFormData()\n            multipartFormData(formData)\n\n            var tempFileURL: URL?\n\n            do {\n                var urlRequestWithContentType = try urlRequest.asURLRequest()\n                urlRequestWithContentType.setValue(formData.contentType, forHTTPHeaderField: \"Content-Type\")\n\n                let isBackgroundSession = self.session.configuration.identifier != nil\n\n                if formData.contentLength < encodingMemoryThreshold && !isBackgroundSession {\n                    let data = try formData.encode()\n\n                    let encodingResult = MultipartFormDataEncodingResult.success(\n                        request: self.upload(data, with: urlRequestWithContentType),\n                        streamingFromDisk: false,\n                        streamFileURL: nil\n                    )\n\n                    DispatchQueue.main.async { encodingCompletion?(encodingResult) }\n                } else {\n                    let fileManager = FileManager.default\n                    let tempDirectoryURL = URL(fileURLWithPath: NSTemporaryDirectory())\n                    let directoryURL = tempDirectoryURL.appendingPathComponent(\"org.alamofire.manager/multipart.form.data\")\n                    let fileName = UUID().uuidString\n                    let fileURL = directoryURL.appendingPathComponent(fileName)\n\n                    tempFileURL = fileURL\n\n                    var directoryError: Error?\n\n                    // Create directory inside serial queue to ensure two threads don't do this in parallel\n                    self.queue.sync {\n                        do {\n                            try fileManager.createDirectory(at: directoryURL, withIntermediateDirectories: true, attributes: nil)\n                        } catch {\n                            directoryError = error\n                        }\n                    }\n\n                    if let directoryError = directoryError { throw directoryError }\n\n                    try formData.writeEncodedData(to: fileURL)\n\n                    let upload = self.upload(fileURL, with: urlRequestWithContentType)\n\n                    // Cleanup the temp file once the upload is complete\n                    upload.delegate.queue.addOperation {\n                        do {\n                            try FileManager.default.removeItem(at: fileURL)\n                        } catch {\n                            // No-op\n                        }\n                    }\n\n                    DispatchQueue.main.async {\n                        let encodingResult = MultipartFormDataEncodingResult.success(\n                            request: upload,\n                            streamingFromDisk: true,\n                            streamFileURL: fileURL\n                        )\n\n                        encodingCompletion?(encodingResult)\n                    }\n                }\n            } catch {\n                // Cleanup the temp file in the event that the multipart form data encoding failed\n                if let tempFileURL = tempFileURL {\n                    do {\n                        try FileManager.default.removeItem(at: tempFileURL)\n                    } catch {\n                        // No-op\n                    }\n                }\n\n                DispatchQueue.main.async { encodingCompletion?(.failure(error)) }\n            }\n        }\n    }\n\n    // MARK: Private - Upload Implementation\n\n    private func upload(_ uploadable: UploadRequest.Uploadable) -> UploadRequest {\n        do {\n            let task = try uploadable.task(session: session, adapter: adapter, queue: queue)\n            let upload = UploadRequest(session: session, requestTask: .upload(uploadable, task))\n\n            if case let .stream(inputStream, _) = uploadable {\n                upload.delegate.taskNeedNewBodyStream = { _, _ in inputStream }\n            }\n\n            delegate[task] = upload\n\n            if startRequestsImmediately { upload.resume() }\n\n            return upload\n        } catch {\n            return upload(uploadable, failedWith: error)\n        }\n    }\n\n    private func upload(_ uploadable: UploadRequest.Uploadable?, failedWith error: Error) -> UploadRequest {\n        var uploadTask: Request.RequestTask = .upload(nil, nil)\n\n        if let uploadable = uploadable {\n            uploadTask = .upload(uploadable, nil)\n        }\n\n        let underlyingError = error.underlyingAdaptError ?? error\n        let upload = UploadRequest(session: session, requestTask: uploadTask, error: underlyingError)\n\n        if let retrier = retrier, error is AdaptError {\n            allowRetrier(retrier, toRetry: upload, with: underlyingError)\n        } else {\n            if startRequestsImmediately { upload.resume() }\n        }\n\n        return upload\n    }\n\n#if !os(watchOS)\n\n    // MARK: - Stream Request\n\n    // MARK: Hostname and Port\n\n    /// Creates a `StreamRequest` for bidirectional streaming using the `hostname` and `port`.\n    ///\n    /// If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n    ///\n    /// - parameter hostName: The hostname of the server to connect to.\n    /// - parameter port:     The port of the server to connect to.\n    ///\n    /// - returns: The created `StreamRequest`.\n    @discardableResult\n    @available(iOS 9.0, macOS 10.11, tvOS 9.0, *)\n    open func stream(withHostName hostName: String, port: Int) -> StreamRequest {\n        return stream(.stream(hostName: hostName, port: port))\n    }\n\n    // MARK: NetService\n\n    /// Creates a `StreamRequest` for bidirectional streaming using the `netService`.\n    ///\n    /// If `startRequestsImmediately` is `true`, the request will have `resume()` called before being returned.\n    ///\n    /// - parameter netService: The net service used to identify the endpoint.\n    ///\n    /// - returns: The created `StreamRequest`.\n    @discardableResult\n    @available(iOS 9.0, macOS 10.11, tvOS 9.0, *)\n    open func stream(with netService: NetService) -> StreamRequest {\n        return stream(.netService(netService))\n    }\n\n    // MARK: Private - Stream Implementation\n\n    @available(iOS 9.0, macOS 10.11, tvOS 9.0, *)\n    private func stream(_ streamable: StreamRequest.Streamable) -> StreamRequest {\n        do {\n            let task = try streamable.task(session: session, adapter: adapter, queue: queue)\n            let request = StreamRequest(session: session, requestTask: .stream(streamable, task))\n\n            delegate[task] = request\n\n            if startRequestsImmediately { request.resume() }\n\n            return request\n        } catch {\n            return stream(failedWith: error)\n        }\n    }\n\n    @available(iOS 9.0, macOS 10.11, tvOS 9.0, *)\n    private func stream(failedWith error: Error) -> StreamRequest {\n        let stream = StreamRequest(session: session, requestTask: .stream(nil, nil), error: error)\n        if startRequestsImmediately { stream.resume() }\n        return stream\n    }\n\n#endif\n\n    // MARK: - Internal - Retry Request\n\n    func retry(_ request: Request) -> Bool {\n        guard let originalTask = request.originalTask else { return false }\n\n        do {\n            let task = try originalTask.task(session: session, adapter: adapter, queue: queue)\n\n            request.delegate.task = task // resets all task delegate data\n\n            request.retryCount += 1\n            request.startTime = CFAbsoluteTimeGetCurrent()\n            request.endTime = nil\n\n            task.resume()\n\n            return true\n        } catch {\n            request.delegate.error = error.underlyingAdaptError ?? error\n            return false\n        }\n    }\n\n    private func allowRetrier(_ retrier: RequestRetrier, toRetry request: Request, with error: Error) {\n        DispatchQueue.utility.async { [weak self] in\n            guard let strongSelf = self else { return }\n\n            retrier.should(strongSelf, retry: request, with: error) { shouldRetry, timeDelay in\n                guard let strongSelf = self else { return }\n\n                guard shouldRetry else {\n                    if strongSelf.startRequestsImmediately { request.resume() }\n                    return\n                }\n\n                DispatchQueue.utility.after(timeDelay) {\n                    guard let strongSelf = self else { return }\n\n                    let retrySucceeded = strongSelf.retry(request)\n\n                    if retrySucceeded, let task = request.task {\n                        strongSelf.delegate[task] = request\n                    } else {\n                        if strongSelf.startRequestsImmediately { request.resume() }\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/TaskDelegate.swift",
    "content": "//\n//  TaskDelegate.swift\n//\n//  Copyright (c) 2014-2017 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// The task delegate is responsible for handling all delegate callbacks for the underlying task as well as\n/// executing all operations attached to the serial operation queue upon task completion.\nopen class TaskDelegate: NSObject {\n\n    // MARK: Properties\n\n    /// The serial operation queue used to execute all operations after the task completes.\n    open let queue: OperationQueue\n\n    /// The data returned by the server.\n    public var data: Data? { return nil }\n\n    /// The error generated throughout the lifecyle of the task.\n    public var error: Error?\n\n    var task: URLSessionTask? {\n        set {\n            taskLock.lock(); defer { taskLock.unlock() }\n            _task = newValue\n        }\n        get {\n            taskLock.lock(); defer { taskLock.unlock() }\n            return _task\n        }\n    }\n\n    var initialResponseTime: CFAbsoluteTime?\n    var credential: URLCredential?\n    var metrics: AnyObject? // URLSessionTaskMetrics\n\n    private var _task: URLSessionTask? {\n        didSet { reset() }\n    }\n\n    private let taskLock = NSLock()\n\n    // MARK: Lifecycle\n\n    init(task: URLSessionTask?) {\n        _task = task\n\n        self.queue = {\n            let operationQueue = OperationQueue()\n\n            operationQueue.maxConcurrentOperationCount = 1\n            operationQueue.isSuspended = true\n            operationQueue.qualityOfService = .utility\n\n            return operationQueue\n        }()\n    }\n\n    func reset() {\n        error = nil\n        initialResponseTime = nil\n    }\n\n    // MARK: URLSessionTaskDelegate\n\n    var taskWillPerformHTTPRedirection: ((URLSession, URLSessionTask, HTTPURLResponse, URLRequest) -> URLRequest?)?\n    var taskDidReceiveChallenge: ((URLSession, URLSessionTask, URLAuthenticationChallenge) -> (URLSession.AuthChallengeDisposition, URLCredential?))?\n    var taskNeedNewBodyStream: ((URLSession, URLSessionTask) -> InputStream?)?\n    var taskDidCompleteWithError: ((URLSession, URLSessionTask, Error?) -> Void)?\n\n    @objc(URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:)\n    func urlSession(\n        _ session: URLSession,\n        task: URLSessionTask,\n        willPerformHTTPRedirection response: HTTPURLResponse,\n        newRequest request: URLRequest,\n        completionHandler: @escaping (URLRequest?) -> Void)\n    {\n        var redirectRequest: URLRequest? = request\n\n        if let taskWillPerformHTTPRedirection = taskWillPerformHTTPRedirection {\n            redirectRequest = taskWillPerformHTTPRedirection(session, task, response, request)\n        }\n\n        completionHandler(redirectRequest)\n    }\n\n    @objc(URLSession:task:didReceiveChallenge:completionHandler:)\n    func urlSession(\n        _ session: URLSession,\n        task: URLSessionTask,\n        didReceive challenge: URLAuthenticationChallenge,\n        completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void)\n    {\n        var disposition: URLSession.AuthChallengeDisposition = .performDefaultHandling\n        var credential: URLCredential?\n\n        if let taskDidReceiveChallenge = taskDidReceiveChallenge {\n            (disposition, credential) = taskDidReceiveChallenge(session, task, challenge)\n        } else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {\n            let host = challenge.protectionSpace.host\n\n            if\n                let serverTrustPolicy = session.serverTrustPolicyManager?.serverTrustPolicy(forHost: host),\n                let serverTrust = challenge.protectionSpace.serverTrust\n            {\n                if serverTrustPolicy.evaluate(serverTrust, forHost: host) {\n                    disposition = .useCredential\n                    credential = URLCredential(trust: serverTrust)\n                } else {\n                    disposition = .cancelAuthenticationChallenge\n                }\n            }\n        } else {\n            if challenge.previousFailureCount > 0 {\n                disposition = .rejectProtectionSpace\n            } else {\n                credential = self.credential ?? session.configuration.urlCredentialStorage?.defaultCredential(for: challenge.protectionSpace)\n\n                if credential != nil {\n                    disposition = .useCredential\n                }\n            }\n        }\n\n        completionHandler(disposition, credential)\n    }\n\n    @objc(URLSession:task:needNewBodyStream:)\n    func urlSession(\n        _ session: URLSession,\n        task: URLSessionTask,\n        needNewBodyStream completionHandler: @escaping (InputStream?) -> Void)\n    {\n        var bodyStream: InputStream?\n\n        if let taskNeedNewBodyStream = taskNeedNewBodyStream {\n            bodyStream = taskNeedNewBodyStream(session, task)\n        }\n\n        completionHandler(bodyStream)\n    }\n\n    @objc(URLSession:task:didCompleteWithError:)\n    func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {\n        if let taskDidCompleteWithError = taskDidCompleteWithError {\n            taskDidCompleteWithError(session, task, error)\n        } else {\n            if let error = error {\n                if self.error == nil { self.error = error }\n\n                if\n                    let downloadDelegate = self as? DownloadTaskDelegate,\n                    let resumeData = (error as NSError).userInfo[NSURLSessionDownloadTaskResumeData] as? Data\n                {\n                    downloadDelegate.resumeData = resumeData\n                }\n            }\n\n            queue.isSuspended = false\n        }\n    }\n}\n\n// MARK: -\n\nclass DataTaskDelegate: TaskDelegate, URLSessionDataDelegate {\n\n    // MARK: Properties\n\n    var dataTask: URLSessionDataTask { return task as! URLSessionDataTask }\n\n    override var data: Data? {\n        if dataStream != nil {\n            return nil\n        } else {\n            return mutableData\n        }\n    }\n\n    var progress: Progress\n    var progressHandler: (closure: Request.ProgressHandler, queue: DispatchQueue)?\n\n    var dataStream: ((_ data: Data) -> Void)?\n\n    private var totalBytesReceived: Int64 = 0\n    private var mutableData: Data\n\n    private var expectedContentLength: Int64?\n\n    // MARK: Lifecycle\n\n    override init(task: URLSessionTask?) {\n        mutableData = Data()\n        progress = Progress(totalUnitCount: 0)\n\n        super.init(task: task)\n    }\n\n    override func reset() {\n        super.reset()\n\n        progress = Progress(totalUnitCount: 0)\n        totalBytesReceived = 0\n        mutableData = Data()\n        expectedContentLength = nil\n    }\n\n    // MARK: URLSessionDataDelegate\n\n    var dataTaskDidReceiveResponse: ((URLSession, URLSessionDataTask, URLResponse) -> URLSession.ResponseDisposition)?\n    var dataTaskDidBecomeDownloadTask: ((URLSession, URLSessionDataTask, URLSessionDownloadTask) -> Void)?\n    var dataTaskDidReceiveData: ((URLSession, URLSessionDataTask, Data) -> Void)?\n    var dataTaskWillCacheResponse: ((URLSession, URLSessionDataTask, CachedURLResponse) -> CachedURLResponse?)?\n\n    func urlSession(\n        _ session: URLSession,\n        dataTask: URLSessionDataTask,\n        didReceive response: URLResponse,\n        completionHandler: @escaping (URLSession.ResponseDisposition) -> Void)\n    {\n        var disposition: URLSession.ResponseDisposition = .allow\n\n        expectedContentLength = response.expectedContentLength\n\n        if let dataTaskDidReceiveResponse = dataTaskDidReceiveResponse {\n            disposition = dataTaskDidReceiveResponse(session, dataTask, response)\n        }\n\n        completionHandler(disposition)\n    }\n\n    func urlSession(\n        _ session: URLSession,\n        dataTask: URLSessionDataTask,\n        didBecome downloadTask: URLSessionDownloadTask)\n    {\n        dataTaskDidBecomeDownloadTask?(session, dataTask, downloadTask)\n    }\n\n    func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {\n        if initialResponseTime == nil { initialResponseTime = CFAbsoluteTimeGetCurrent() }\n\n        if let dataTaskDidReceiveData = dataTaskDidReceiveData {\n            dataTaskDidReceiveData(session, dataTask, data)\n        } else {\n            if let dataStream = dataStream {\n                dataStream(data)\n            } else {\n                mutableData.append(data)\n            }\n\n            let bytesReceived = Int64(data.count)\n            totalBytesReceived += bytesReceived\n            let totalBytesExpected = dataTask.response?.expectedContentLength ?? NSURLSessionTransferSizeUnknown\n\n            progress.totalUnitCount = totalBytesExpected\n            progress.completedUnitCount = totalBytesReceived\n\n            if let progressHandler = progressHandler {\n                progressHandler.queue.async { progressHandler.closure(self.progress) }\n            }\n        }\n    }\n\n    func urlSession(\n        _ session: URLSession,\n        dataTask: URLSessionDataTask,\n        willCacheResponse proposedResponse: CachedURLResponse,\n        completionHandler: @escaping (CachedURLResponse?) -> Void)\n    {\n        var cachedResponse: CachedURLResponse? = proposedResponse\n\n        if let dataTaskWillCacheResponse = dataTaskWillCacheResponse {\n            cachedResponse = dataTaskWillCacheResponse(session, dataTask, proposedResponse)\n        }\n\n        completionHandler(cachedResponse)\n    }\n}\n\n// MARK: -\n\nclass DownloadTaskDelegate: TaskDelegate, URLSessionDownloadDelegate {\n\n    // MARK: Properties\n\n    var downloadTask: URLSessionDownloadTask { return task as! URLSessionDownloadTask }\n\n    var progress: Progress\n    var progressHandler: (closure: Request.ProgressHandler, queue: DispatchQueue)?\n\n    var resumeData: Data?\n    override var data: Data? { return resumeData }\n\n    var destination: DownloadRequest.DownloadFileDestination?\n\n    var temporaryURL: URL?\n    var destinationURL: URL?\n\n    var fileURL: URL? { return destination != nil ? destinationURL : temporaryURL }\n\n    // MARK: Lifecycle\n\n    override init(task: URLSessionTask?) {\n        progress = Progress(totalUnitCount: 0)\n        super.init(task: task)\n    }\n\n    override func reset() {\n        super.reset()\n\n        progress = Progress(totalUnitCount: 0)\n        resumeData = nil\n    }\n\n    // MARK: URLSessionDownloadDelegate\n\n    var downloadTaskDidFinishDownloadingToURL: ((URLSession, URLSessionDownloadTask, URL) -> URL)?\n    var downloadTaskDidWriteData: ((URLSession, URLSessionDownloadTask, Int64, Int64, Int64) -> Void)?\n    var downloadTaskDidResumeAtOffset: ((URLSession, URLSessionDownloadTask, Int64, Int64) -> Void)?\n\n    func urlSession(\n        _ session: URLSession,\n        downloadTask: URLSessionDownloadTask,\n        didFinishDownloadingTo location: URL)\n    {\n        temporaryURL = location\n\n        guard\n            let destination = destination,\n            let response = downloadTask.response as? HTTPURLResponse\n        else { return }\n\n        let result = destination(location, response)\n        let destinationURL = result.destinationURL\n        let options = result.options\n\n        self.destinationURL = destinationURL\n\n        do {\n            if options.contains(.removePreviousFile), FileManager.default.fileExists(atPath: destinationURL.path) {\n                try FileManager.default.removeItem(at: destinationURL)\n            }\n\n            if options.contains(.createIntermediateDirectories) {\n                let directory = destinationURL.deletingLastPathComponent()\n                try FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true)\n            }\n\n            try FileManager.default.moveItem(at: location, to: destinationURL)\n        } catch {\n            self.error = error\n        }\n    }\n\n    func urlSession(\n        _ session: URLSession,\n        downloadTask: URLSessionDownloadTask,\n        didWriteData bytesWritten: Int64,\n        totalBytesWritten: Int64,\n        totalBytesExpectedToWrite: Int64)\n    {\n        if initialResponseTime == nil { initialResponseTime = CFAbsoluteTimeGetCurrent() }\n\n        if let downloadTaskDidWriteData = downloadTaskDidWriteData {\n            downloadTaskDidWriteData(\n                session,\n                downloadTask,\n                bytesWritten,\n                totalBytesWritten,\n                totalBytesExpectedToWrite\n            )\n        } else {\n            progress.totalUnitCount = totalBytesExpectedToWrite\n            progress.completedUnitCount = totalBytesWritten\n\n            if let progressHandler = progressHandler {\n                progressHandler.queue.async { progressHandler.closure(self.progress) }\n            }\n        }\n    }\n\n    func urlSession(\n        _ session: URLSession,\n        downloadTask: URLSessionDownloadTask,\n        didResumeAtOffset fileOffset: Int64,\n        expectedTotalBytes: Int64)\n    {\n        if let downloadTaskDidResumeAtOffset = downloadTaskDidResumeAtOffset {\n            downloadTaskDidResumeAtOffset(session, downloadTask, fileOffset, expectedTotalBytes)\n        } else {\n            progress.totalUnitCount = expectedTotalBytes\n            progress.completedUnitCount = fileOffset\n        }\n    }\n}\n\n// MARK: -\n\nclass UploadTaskDelegate: DataTaskDelegate {\n\n    // MARK: Properties\n\n    var uploadTask: URLSessionUploadTask { return task as! URLSessionUploadTask }\n\n    var uploadProgress: Progress\n    var uploadProgressHandler: (closure: Request.ProgressHandler, queue: DispatchQueue)?\n\n    // MARK: Lifecycle\n\n    override init(task: URLSessionTask?) {\n        uploadProgress = Progress(totalUnitCount: 0)\n        super.init(task: task)\n    }\n\n    override func reset() {\n        super.reset()\n        uploadProgress = Progress(totalUnitCount: 0)\n    }\n\n    // MARK: URLSessionTaskDelegate\n\n    var taskDidSendBodyData: ((URLSession, URLSessionTask, Int64, Int64, Int64) -> Void)?\n\n    func URLSession(\n        _ session: URLSession,\n        task: URLSessionTask,\n        didSendBodyData bytesSent: Int64,\n        totalBytesSent: Int64,\n        totalBytesExpectedToSend: Int64)\n    {\n        if initialResponseTime == nil { initialResponseTime = CFAbsoluteTimeGetCurrent() }\n\n        if let taskDidSendBodyData = taskDidSendBodyData {\n            taskDidSendBodyData(session, task, bytesSent, totalBytesSent, totalBytesExpectedToSend)\n        } else {\n            uploadProgress.totalUnitCount = totalBytesExpectedToSend\n            uploadProgress.completedUnitCount = totalBytesSent\n\n            if let uploadProgressHandler = uploadProgressHandler {\n                uploadProgressHandler.queue.async { uploadProgressHandler.closure(self.uploadProgress) }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/Timeline.swift",
    "content": "//\n//  Timeline.swift\n//\n//  Copyright (c) 2014-2017 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/// Responsible for computing the timing metrics for the complete lifecycle of a `Request`.\npublic struct Timeline {\n    /// The time the request was initialized.\n    public let requestStartTime: CFAbsoluteTime\n\n    /// The time the first bytes were received from or sent to the server.\n    public let initialResponseTime: CFAbsoluteTime\n\n    /// The time when the request was completed.\n    public let requestCompletedTime: CFAbsoluteTime\n\n    /// The time when the response serialization was completed.\n    public let serializationCompletedTime: CFAbsoluteTime\n\n    /// The time interval in seconds from the time the request started to the initial response from the server.\n    public let latency: TimeInterval\n\n    /// The time interval in seconds from the time the request started to the time the request completed.\n    public let requestDuration: TimeInterval\n\n    /// The time interval in seconds from the time the request completed to the time response serialization completed.\n    public let serializationDuration: TimeInterval\n\n    /// The time interval in seconds from the time the request started to the time response serialization completed.\n    public let totalDuration: TimeInterval\n\n    /// Creates a new `Timeline` instance with the specified request times.\n    ///\n    /// - parameter requestStartTime:           The time the request was initialized. Defaults to `0.0`.\n    /// - parameter initialResponseTime:        The time the first bytes were received from or sent to the server.\n    ///                                         Defaults to `0.0`.\n    /// - parameter requestCompletedTime:       The time when the request was completed. Defaults to `0.0`.\n    /// - parameter serializationCompletedTime: The time when the response serialization was completed. Defaults\n    ///                                         to `0.0`.\n    ///\n    /// - returns: The new `Timeline` instance.\n    public init(\n        requestStartTime: CFAbsoluteTime = 0.0,\n        initialResponseTime: CFAbsoluteTime = 0.0,\n        requestCompletedTime: CFAbsoluteTime = 0.0,\n        serializationCompletedTime: CFAbsoluteTime = 0.0)\n    {\n        self.requestStartTime = requestStartTime\n        self.initialResponseTime = initialResponseTime\n        self.requestCompletedTime = requestCompletedTime\n        self.serializationCompletedTime = serializationCompletedTime\n\n        self.latency = initialResponseTime - requestStartTime\n        self.requestDuration = requestCompletedTime - requestStartTime\n        self.serializationDuration = serializationCompletedTime - requestCompletedTime\n        self.totalDuration = serializationCompletedTime - requestStartTime\n    }\n}\n\n// MARK: - CustomStringConvertible\n\nextension Timeline: CustomStringConvertible {\n    /// The textual representation used when written to an output stream, which includes the latency, the request\n    /// duration and the total duration.\n    public var description: String {\n        let latency = String(format: \"%.3f\", self.latency)\n        let requestDuration = String(format: \"%.3f\", self.requestDuration)\n        let serializationDuration = String(format: \"%.3f\", self.serializationDuration)\n        let totalDuration = String(format: \"%.3f\", self.totalDuration)\n\n        // NOTE: Had to move to string concatenation due to memory leak filed as rdar://26761490. Once memory leak is\n        // fixed, we should move back to string interpolation by reverting commit 7d4a43b1.\n        let timings = [\n            \"\\\"Latency\\\": \" + latency + \" secs\",\n            \"\\\"Request Duration\\\": \" + requestDuration + \" secs\",\n            \"\\\"Serialization Duration\\\": \" + serializationDuration + \" secs\",\n            \"\\\"Total Duration\\\": \" + totalDuration + \" secs\"\n        ]\n\n        return \"Timeline: { \" + timings.joined(separator: \", \") + \" }\"\n    }\n}\n\n// MARK: - CustomDebugStringConvertible\n\nextension Timeline: CustomDebugStringConvertible {\n    /// The textual representation used when written to an output stream, which includes the request start time, the\n    /// initial response time, the request completed time, the serialization completed time, the latency, the request\n    /// duration and the total duration.\n    public var debugDescription: String {\n        let requestStartTime = String(format: \"%.3f\", self.requestStartTime)\n        let initialResponseTime = String(format: \"%.3f\", self.initialResponseTime)\n        let requestCompletedTime = String(format: \"%.3f\", self.requestCompletedTime)\n        let serializationCompletedTime = String(format: \"%.3f\", self.serializationCompletedTime)\n        let latency = String(format: \"%.3f\", self.latency)\n        let requestDuration = String(format: \"%.3f\", self.requestDuration)\n        let serializationDuration = String(format: \"%.3f\", self.serializationDuration)\n        let totalDuration = String(format: \"%.3f\", self.totalDuration)\n\n        // NOTE: Had to move to string concatenation due to memory leak filed as rdar://26761490. Once memory leak is\n        // fixed, we should move back to string interpolation by reverting commit 7d4a43b1.\n        let timings = [\n            \"\\\"Request Start Time\\\": \" + requestStartTime,\n            \"\\\"Initial Response Time\\\": \" + initialResponseTime,\n            \"\\\"Request Completed Time\\\": \" + requestCompletedTime,\n            \"\\\"Serialization Completed Time\\\": \" + serializationCompletedTime,\n            \"\\\"Latency\\\": \" + latency + \" secs\",\n            \"\\\"Request Duration\\\": \" + requestDuration + \" secs\",\n            \"\\\"Serialization Duration\\\": \" + serializationDuration + \" secs\",\n            \"\\\"Total Duration\\\": \" + totalDuration + \" secs\"\n        ]\n\n        return \"Timeline: { \" + timings.joined(separator: \", \") + \" }\"\n    }\n}\n"
  },
  {
    "path": "Pods/Alamofire/Source/Validation.swift",
    "content": "//\n//  Validation.swift\n//\n//  Copyright (c) 2014-2017 Alamofire Software Foundation (http://alamofire.org/)\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\nextension Request {\n\n    // MARK: Helper Types\n\n    fileprivate typealias ErrorReason = AFError.ResponseValidationFailureReason\n\n    /// Used to represent whether validation was successful or encountered an error resulting in a failure.\n    ///\n    /// - success: The validation was successful.\n    /// - failure: The validation failed encountering the provided error.\n    public enum ValidationResult {\n        case success\n        case failure(Error)\n    }\n\n    fileprivate struct MIMEType {\n        let type: String\n        let subtype: String\n\n        var isWildcard: Bool { return type == \"*\" && subtype == \"*\" }\n\n        init?(_ string: String) {\n            let components: [String] = {\n                let stripped = string.trimmingCharacters(in: .whitespacesAndNewlines)\n\n            #if swift(>=3.2)\n                let split = stripped[..<(stripped.range(of: \";\")?.lowerBound ?? stripped.endIndex)]\n            #else\n                let split = stripped.substring(to: stripped.range(of: \";\")?.lowerBound ?? stripped.endIndex)\n            #endif\n\n                return split.components(separatedBy: \"/\")\n            }()\n\n            if let type = components.first, let subtype = components.last {\n                self.type = type\n                self.subtype = subtype\n            } else {\n                return nil\n            }\n        }\n\n        func matches(_ mime: MIMEType) -> Bool {\n            switch (type, subtype) {\n            case (mime.type, mime.subtype), (mime.type, \"*\"), (\"*\", mime.subtype), (\"*\", \"*\"):\n                return true\n            default:\n                return false\n            }\n        }\n    }\n\n    // MARK: Properties\n\n    fileprivate var acceptableStatusCodes: [Int] { return Array(200..<300) }\n\n    fileprivate var acceptableContentTypes: [String] {\n        if let accept = request?.value(forHTTPHeaderField: \"Accept\") {\n            return accept.components(separatedBy: \",\")\n        }\n\n        return [\"*/*\"]\n    }\n\n    // MARK: Status Code\n\n    fileprivate func validate<S: Sequence>(\n        statusCode acceptableStatusCodes: S,\n        response: HTTPURLResponse)\n        -> ValidationResult\n        where S.Iterator.Element == Int\n    {\n        if acceptableStatusCodes.contains(response.statusCode) {\n            return .success\n        } else {\n            let reason: ErrorReason = .unacceptableStatusCode(code: response.statusCode)\n            return .failure(AFError.responseValidationFailed(reason: reason))\n        }\n    }\n\n    // MARK: Content Type\n\n    fileprivate func validate<S: Sequence>(\n        contentType acceptableContentTypes: S,\n        response: HTTPURLResponse,\n        data: Data?)\n        -> ValidationResult\n        where S.Iterator.Element == String\n    {\n        guard let data = data, data.count > 0 else { return .success }\n\n        guard\n            let responseContentType = response.mimeType,\n            let responseMIMEType = MIMEType(responseContentType)\n        else {\n            for contentType in acceptableContentTypes {\n                if let mimeType = MIMEType(contentType), mimeType.isWildcard {\n                    return .success\n                }\n            }\n\n            let error: AFError = {\n                let reason: ErrorReason = .missingContentType(acceptableContentTypes: Array(acceptableContentTypes))\n                return AFError.responseValidationFailed(reason: reason)\n            }()\n\n            return .failure(error)\n        }\n\n        for contentType in acceptableContentTypes {\n            if let acceptableMIMEType = MIMEType(contentType), acceptableMIMEType.matches(responseMIMEType) {\n                return .success\n            }\n        }\n\n        let error: AFError = {\n            let reason: ErrorReason = .unacceptableContentType(\n                acceptableContentTypes: Array(acceptableContentTypes),\n                responseContentType: responseContentType\n            )\n\n            return AFError.responseValidationFailed(reason: reason)\n        }()\n\n        return .failure(error)\n    }\n}\n\n// MARK: -\n\nextension DataRequest {\n    /// A closure used to validate a request that takes a URL request, a URL response and data, and returns whether the\n    /// request was valid.\n    public typealias Validation = (URLRequest?, HTTPURLResponse, Data?) -> ValidationResult\n\n    /// Validates the request, using the specified closure.\n    ///\n    /// If validation fails, subsequent calls to response handlers will have an associated error.\n    ///\n    /// - parameter validation: A closure to validate the request.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    public func validate(_ validation: @escaping Validation) -> Self {\n        let validationExecution: () -> Void = { [unowned self] in\n            if\n                let response = self.response,\n                self.delegate.error == nil,\n                case let .failure(error) = validation(self.request, response, self.delegate.data)\n            {\n                self.delegate.error = error\n            }\n        }\n\n        validations.append(validationExecution)\n\n        return self\n    }\n\n    /// Validates that the response has a status code in the specified sequence.\n    ///\n    /// If validation fails, subsequent calls to response handlers will have an associated error.\n    ///\n    /// - parameter range: The range of acceptable status codes.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    public func validate<S: Sequence>(statusCode acceptableStatusCodes: S) -> Self where S.Iterator.Element == Int {\n        return validate { [unowned self] _, response, _ in\n            return self.validate(statusCode: acceptableStatusCodes, response: response)\n        }\n    }\n\n    /// Validates that the response has a content type in the specified sequence.\n    ///\n    /// If validation fails, subsequent calls to response handlers will have an associated error.\n    ///\n    /// - parameter contentType: The acceptable content types, which may specify wildcard types and/or subtypes.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    public func validate<S: Sequence>(contentType acceptableContentTypes: S) -> Self where S.Iterator.Element == String {\n        return validate { [unowned self] _, response, data in\n            return self.validate(contentType: acceptableContentTypes, response: response, data: data)\n        }\n    }\n\n    /// Validates that the response has a status code in the default acceptable range of 200...299, and that the content\n    /// type matches any specified in the Accept HTTP header field.\n    ///\n    /// If validation fails, subsequent calls to response handlers will have an associated error.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    public func validate() -> Self {\n        return validate(statusCode: self.acceptableStatusCodes).validate(contentType: self.acceptableContentTypes)\n    }\n}\n\n// MARK: -\n\nextension DownloadRequest {\n    /// A closure used to validate a request that takes a URL request, a URL response, a temporary URL and a\n    /// destination URL, and returns whether the request was valid.\n    public typealias Validation = (\n        _ request: URLRequest?,\n        _ response: HTTPURLResponse,\n        _ temporaryURL: URL?,\n        _ destinationURL: URL?)\n        -> ValidationResult\n\n    /// Validates the request, using the specified closure.\n    ///\n    /// If validation fails, subsequent calls to response handlers will have an associated error.\n    ///\n    /// - parameter validation: A closure to validate the request.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    public func validate(_ validation: @escaping Validation) -> Self {\n        let validationExecution: () -> Void = { [unowned self] in\n            let request = self.request\n            let temporaryURL = self.downloadDelegate.temporaryURL\n            let destinationURL = self.downloadDelegate.destinationURL\n\n            if\n                let response = self.response,\n                self.delegate.error == nil,\n                case let .failure(error) = validation(request, response, temporaryURL, destinationURL)\n            {\n                self.delegate.error = error\n            }\n        }\n\n        validations.append(validationExecution)\n\n        return self\n    }\n\n    /// Validates that the response has a status code in the specified sequence.\n    ///\n    /// If validation fails, subsequent calls to response handlers will have an associated error.\n    ///\n    /// - parameter range: The range of acceptable status codes.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    public func validate<S: Sequence>(statusCode acceptableStatusCodes: S) -> Self where S.Iterator.Element == Int {\n        return validate { [unowned self] _, response, _, _ in\n            return self.validate(statusCode: acceptableStatusCodes, response: response)\n        }\n    }\n\n    /// Validates that the response has a content type in the specified sequence.\n    ///\n    /// If validation fails, subsequent calls to response handlers will have an associated error.\n    ///\n    /// - parameter contentType: The acceptable content types, which may specify wildcard types and/or subtypes.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    public func validate<S: Sequence>(contentType acceptableContentTypes: S) -> Self where S.Iterator.Element == String {\n        return validate { [unowned self] _, response, _, _ in\n            let fileURL = self.downloadDelegate.fileURL\n\n            guard let validFileURL = fileURL else {\n                return .failure(AFError.responseValidationFailed(reason: .dataFileNil))\n            }\n\n            do {\n                let data = try Data(contentsOf: validFileURL)\n                return self.validate(contentType: acceptableContentTypes, response: response, data: data)\n            } catch {\n                return .failure(AFError.responseValidationFailed(reason: .dataFileReadFailed(at: validFileURL)))\n            }\n        }\n    }\n\n    /// Validates that the response has a status code in the default acceptable range of 200...299, and that the content\n    /// type matches any specified in the Accept HTTP header field.\n    ///\n    /// If validation fails, subsequent calls to response handlers will have an associated error.\n    ///\n    /// - returns: The request.\n    @discardableResult\n    public func validate() -> Self {\n        return validate(statusCode: self.acceptableStatusCodes).validate(contentType: self.acceptableContentTypes)\n    }\n}\n"
  },
  {
    "path": "Pods/Differentiator/LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2017 RxSwift Community\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Pods/Differentiator/README.md",
    "content": "[![Travis CI](https://travis-ci.org/RxSwiftCommunity/RxDataSources.svg?branch=master)](https://travis-ci.org/RxSwiftCommunity/RxDataSources)\n\nTable and Collection view data sources\n======================================\n\n## Features\n\n- [x] **O(N)** algorithm for calculating differences\n  - the algorithm has the assumption that all sections and items are unique so there is no ambiguity\n  - in case there is ambiguity, fallbacks automagically on non animated refresh\n- [x] it applies additional heuristics to send the least number of commands to sectioned view\n  - even though the running time is linear, preferred number of sent commands is usually a lot less than linear\n  - it is preferred (and possible) to cap the number of changes to some small number, and in case the number of changes grows towards linear, just do normal reload\n- [x] Supports **extending your item and section structures**\n  - just extend your item with `IdentifiableType` and `Equatable`, and your section with `AnimatableSectionModelType`\n- [x] Supports all combinations of two level hierarchical animations for **both sections and items**\n  - Section animations: Insert, Delete, Move\n  - Item animations: Insert, Delete, Move, Reload (if old value is not equal to new value)\n- [x] Configurable animation types for `Insert`, `Reload` and `Delete` (Automatic, Fade, ...)\n- [x] Example app\n- [x] Randomized stress tests (example app)\n- [x] Supports editing out of the box (example app)\n- [x] Works with `UITableView` and `UICollectionView`\n\n## Why\nWriting table and collection view data sources is tedious. There is a large number of delegate methods that need to be implemented for the simplest case possible.\n\nRxSwift helps alleviate some of the burden with a simple data binding mechanism:\n1) Turn your data into an Observable sequence\n2) Bind the data to the tableView/collectionView using one of:\n  - `rx.items(dataSource:protocol<RxTableViewDataSourceType, UITableViewDataSource>)`\n  - `rx.items(cellIdentifier:String)`\n  - `rx.items(cellIdentifier:String:Cell.Type:_:)`\n  - `rx.items(_:_:)`\n\n```swift\nlet data = Observable<[String]>.just([\"first element\", \"second element\", \"third element\"])\n\ndata.bind(to: tableView.rx.items(cellIdentifier: \"Cell\")) { index, model, cell in\n  cell.textLabel?.text = model\n}\n.disposed(by: disposeBag)\n```\n\nThis works well with simple data sets but does not handle cases where you need to bind complex data sets with multiples sections, or when you need to perform animations when adding/modifying/deleting items.  \n\nThese are precisely the use cases that RxDataSources helps solve.\n\nWith RxDataSources, it is super easy to just write\n\n```swift\nlet dataSource = RxTableViewSectionedReloadDataSource<SectionModel<String, Int>>()\nObservable.just([SectionModel(model: \"title\", items: [1, 2, 3])])\n    .bind(to: tableView.rx.items(dataSource: dataSource))\n    .disposed(by: disposeBag)\n```\n![RxDataSources example app](https://raw.githubusercontent.com/kzaher/rxswiftcontent/rxdatasources/RxDataSources.gif)\n\n## How\nGiven the following custom data structure:\n```swift\nstruct CustomData {\n  var anInt: Int\n  var aString: String\n  var aCGPoint: CGPoint\n}\n```\n\n1) Start by defining your sections with a struct that conforms to the `SectionModelType` protocol:\n  - define the `Item` typealias: equal to the type of items that the section will contain\n  - declare an `items` property: of type array of `Item`\n\n```swift\nstruct SectionOfCustomData {\n  var header: String    \n  var items: [Item]\n}\nextension SectionOfCustomData: SectionModelType {\n  typealias Item = CustomData\n  \n   init(original: SectionOfCustomData, items: [Item]) {\n    self = original\n    self.items = items\n  } \n}\n```\n\n2) Create a dataSource object and pass it your `SectionOfCustomData` type:\n```swift \nlet dataSource = RxTableViewSectionedReloadDataSource<SectionOfCustomData>()\n```\n\n3) Customize closures on the dataSource as needed:\n- `configureCell` (required)\n- `titleForHeaderInSection`\n- `titleForFooterInSection`\n- etc\n\n```swift \ndataSource.configureCell = { (ds: RxTableViewSectionedReloadDataSource<SectionOfCustomData>, tv: UITableView, ip: IndexPath, item: Item) in\n  let cell = tv.dequeueReusableCell(withIdentifier: \"Cell\", for: ip)\n  cell.textLabel?.text = \"Item \\(item.anInt): \\(item.aString) - \\(item.aCGPoint.x):\\(item.aCGPoint.y)\"\n  return cell\n}\ndataSource.titleForHeaderInSection = { ds, index in\n  return ds.sectionModels[index].header\n}\n```\n\n4) Define the actual data as an Observable sequence of CustomData objects and bind it to the tableView\n```swift \nlet sections = [\n  SectionOfCustomData(header: \"First section\", items: [CustomData(anInt: 0, aString: \"zero\", aCGPoint: CGPoint.zero), CustomData(anInt: 1, aString: \"one\", aCGPoint: CGPoint(x: 1, y: 1)) ]),\n  SectionOfCustomData(header: \"Second section\", items: [CustomData(anInt: 2, aString: \"two\", aCGPoint: CGPoint(x: 2, y: 2)), CustomData(anInt: 3, aString: \"three\", aCGPoint: CGPoint(x: 3, y: 3)) ])\n]\n\nObservable.just(sections)\n  .bind(to: tableView.rx.items(dataSource: dataSource))\n  .disposed(by: disposeBag)\n```\n\n\n### Animations\nTo implement animations with RxDataSources, the same steps are required as with non-animated data, execept:\n- SectionOfCustomData needs to conform to `AnimatableSectionModelType`\n- dataSource needs to be an instance of `RxTableViewSectionedAnimatedDataSource` or `RxCollectionViewSectionedAnimatedDataSource`\n\n\n## Requirements\n\nXcode 9.0\n\nSwift 4.0\n\nFor Swift 3.x version please use versions `1.0 ... 2.0.2`\nFor Swift 2.3 version please use versions `0.1 ... 0.9`\n\n## Installation\n\n**We'll try to keep the API as stable as possible, but breaking API changes can occur.**\n\n### CocoaPods\n\nPodfile\n```\npod 'RxDataSources', '~> 3.0'\n```\n\n### Carthage\n\nCartfile\n```\ngithub \"RxSwiftCommunity/RxDataSources\" ~> 3.0\n```\n"
  },
  {
    "path": "Pods/Differentiator/Sources/Differentiator/AnimatableSectionModel.swift",
    "content": "//\n//  AnimatableSectionModel.swift\n//  RxDataSources\n//\n//  Created by Krunoslav Zaher on 1/10/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\npublic struct AnimatableSectionModel<Section: IdentifiableType, ItemType: IdentifiableType & Equatable> {\n    public var model: Section\n    public var items: [Item]\n\n    public init(model: Section, items: [ItemType]) {\n        self.model = model\n        self.items = items\n    }\n    \n}\n\nextension AnimatableSectionModel\n    : AnimatableSectionModelType {\n    public typealias Item = ItemType\n    public typealias Identity = Section.Identity\n\n    public var identity: Section.Identity {\n        return model.identity\n    }\n\n    public init(original: AnimatableSectionModel, items: [Item]) {\n        self.model = original.model\n        self.items = items\n    }\n    \n    public var hashValue: Int {\n        return self.model.identity.hashValue\n    }\n}\n\n\nextension AnimatableSectionModel\n    : CustomStringConvertible {\n\n    public var description: String {\n        return \"HashableSectionModel(model: \\\"\\(self.model)\\\", items: \\(items))\"\n    }\n\n}\n"
  },
  {
    "path": "Pods/Differentiator/Sources/Differentiator/AnimatableSectionModelType+ItemPath.swift",
    "content": "//\n//  AnimatableSectionModelType+ItemPath.swift\n//  RxDataSources\n//\n//  Created by Krunoslav Zaher on 1/9/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\nextension Array where Element: AnimatableSectionModelType {\n    subscript(index: ItemPath) -> Element.Item {\n        return self[index.sectionIndex].items[index.itemIndex]\n    }\n}"
  },
  {
    "path": "Pods/Differentiator/Sources/Differentiator/AnimatableSectionModelType.swift",
    "content": "//\n//  AnimatableSectionModelType.swift\n//  RxDataSources\n//\n//  Created by Krunoslav Zaher on 1/6/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\npublic protocol AnimatableSectionModelType\n    : SectionModelType\n    , IdentifiableType where Item: IdentifiableType, Item: Equatable {\n}\n"
  },
  {
    "path": "Pods/Differentiator/Sources/Differentiator/Changeset.swift",
    "content": "//\n//  Changeset.swift\n//  RxDataSources\n//\n//  Created by Krunoslav Zaher on 5/30/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\npublic struct Changeset<S: SectionModelType> {\n    public typealias I = S.Item\n\n    public let reloadData: Bool\n\n    public let originalSections: [S]\n    public let finalSections: [S]\n\n    public let insertedSections: [Int]\n    public let deletedSections: [Int]\n    public let movedSections: [(from: Int, to: Int)]\n    public let updatedSections: [Int]\n\n    public let insertedItems: [ItemPath]\n    public let deletedItems: [ItemPath]\n    public let movedItems: [(from: ItemPath, to: ItemPath)]\n    public let updatedItems: [ItemPath]\n\n    init(reloadData: Bool = false,\n        originalSections: [S] = [],\n        finalSections: [S] = [],\n        insertedSections: [Int] = [],\n        deletedSections: [Int] = [],\n        movedSections: [(from: Int, to: Int)] = [],\n        updatedSections: [Int] = [],\n\n        insertedItems: [ItemPath] = [],\n        deletedItems: [ItemPath] = [],\n        movedItems: [(from: ItemPath, to: ItemPath)] = [],\n        updatedItems: [ItemPath] = []\n    ) {\n        self.reloadData = reloadData\n\n        self.originalSections = originalSections\n        self.finalSections = finalSections\n\n        self.insertedSections = insertedSections\n        self.deletedSections = deletedSections\n        self.movedSections = movedSections\n        self.updatedSections = updatedSections\n\n        self.insertedItems = insertedItems\n        self.deletedItems = deletedItems\n        self.movedItems = movedItems\n        self.updatedItems = updatedItems\n    }\n\n    public static func initialValue(_ sections: [S]) -> Changeset<S> {\n        return Changeset<S>(\n            reloadData: true,\n            finalSections: sections,\n            insertedSections: Array(0 ..< sections.count) as [Int]\n        )\n    }\n}\n\nextension ItemPath\n    : CustomDebugStringConvertible {\n    public var debugDescription : String {\n        return \"(\\(sectionIndex), \\(itemIndex))\"\n    }\n}\n\nextension Changeset\n    : CustomDebugStringConvertible {\n\n    public var debugDescription : String {\n        let serializedSections = \"[\\n\" + finalSections.map { \"\\($0)\" }.joined(separator: \",\\n\") + \"\\n]\\n\"\n        return \" >> Final sections\"\n        + \"   \\n\\(serializedSections)\"\n        + (insertedSections.count > 0 || deletedSections.count > 0 || movedSections.count > 0 || updatedSections.count > 0 ? \"\\nSections:\" : \"\")\n        + (insertedSections.count > 0 ? \"\\ninsertedSections:\\n\\t\\(insertedSections)\" : \"\")\n        + (deletedSections.count > 0 ?  \"\\ndeletedSections:\\n\\t\\(deletedSections)\" : \"\")\n        + (movedSections.count > 0 ? \"\\nmovedSections:\\n\\t\\(movedSections)\" : \"\")\n        + (updatedSections.count > 0 ? \"\\nupdatesSections:\\n\\t\\(updatedSections)\" : \"\")\n            + (insertedItems.count > 0 || deletedItems.count > 0 || movedItems.count > 0 || updatedItems.count > 0 ? \"\\nItems:\" : \"\")\n        + (insertedItems.count > 0 ? \"\\ninsertedItems:\\n\\t\\(insertedItems)\" : \"\")\n        + (deletedItems.count > 0 ? \"\\ndeletedItems:\\n\\t\\(deletedItems)\" : \"\")\n        + (movedItems.count > 0 ? \"\\nmovedItems:\\n\\t\\(movedItems)\" : \"\")\n        + (updatedItems.count > 0 ? \"\\nupdatedItems:\\n\\t\\(updatedItems)\" : \"\")\n    }\n}\n"
  },
  {
    "path": "Pods/Differentiator/Sources/Differentiator/Diff.swift",
    "content": "//\n//  Differentiator.swift\n//  RxDataSources\n//\n//  Created by Krunoslav Zaher on 6/27/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\nfileprivate extension AnimatableSectionModelType {\n    init(safeOriginal: Self, safeItems: [Item]) throws {\n        self.init(original: safeOriginal, items: safeItems)\n\n        if self.items != safeItems || self.identity != safeOriginal.identity {\n            throw Diff.Error.invalidInitializerImplementation(section: self, expectedItems: safeItems, expectedIdentifier: safeOriginal.identity)\n        }\n    }\n}\n\npublic enum Diff {\n\n    public enum Error : Swift.Error, CustomDebugStringConvertible {\n\n        case duplicateItem(item: Any)\n        case duplicateSection(section: Any)\n        case invalidInitializerImplementation(section: Any, expectedItems: Any, expectedIdentifier: Any)\n\n        public var debugDescription: String {\n            switch self {\n            case let .duplicateItem(item):\n                return \"Duplicate item \\(item)\"\n            case let .duplicateSection(section):\n                return \"Duplicate section \\(section)\"\n            case let .invalidInitializerImplementation(section, expectedItems, expectedIdentifier):\n                return \"Wrong initializer implementation for: \\(section)\\n\" +\n                    \"Expected it should return items: \\(expectedItems)\\n\" +\n                \"Expected it should have id: \\(expectedIdentifier)\"\n            }\n        }\n    }\n\n    private enum EditEvent : CustomDebugStringConvertible {\n        case inserted           // can't be found in old sections\n        case insertedAutomatically           // Item inside section being inserted\n        case deleted            // Was in old, not in new, in it's place is something \"not new\" :(, otherwise it's Updated\n        case deletedAutomatically            // Item inside section that is being deleted\n        case moved              // same item, but was on different index, and needs explicit move\n        case movedAutomatically // don't need to specify any changes for those rows\n        case untouched\n\n        var debugDescription: String {\n            get {\n                switch self {\n                case .inserted:\n                    return \"Inserted\"\n                case .insertedAutomatically:\n                    return \"InsertedAutomatically\"\n                case .deleted:\n                    return \"Deleted\"\n                case .deletedAutomatically:\n                    return \"DeletedAutomatically\"\n                case .moved:\n                    return \"Moved\"\n                case .movedAutomatically:\n                    return \"MovedAutomatically\"\n                case .untouched:\n                    return \"Untouched\"\n                }\n            }\n        }\n    }\n\n    private struct SectionAssociatedData : CustomDebugStringConvertible {\n        var event: EditEvent\n        var indexAfterDelete: Int?\n        var moveIndex: Int?\n        var itemCount: Int\n\n        var debugDescription: String {\n            get {\n                return \"\\(event), \\(String(describing: indexAfterDelete))\"\n            }\n        }\n\n        static var initial: SectionAssociatedData {\n            return SectionAssociatedData(event: .untouched, indexAfterDelete: nil, moveIndex: nil, itemCount: 0)\n        }\n    }\n\n    private struct ItemAssociatedData: CustomDebugStringConvertible {\n        var event: EditEvent\n        var indexAfterDelete: Int?\n        var moveIndex: ItemPath?\n\n        var debugDescription: String {\n            get {\n                return \"\\(event) \\(String(describing: indexAfterDelete))\"\n            }\n        }\n\n        static var initial : ItemAssociatedData {\n            return ItemAssociatedData(event: .untouched, indexAfterDelete: nil, moveIndex: nil)\n        }\n    }\n\n    private static func indexSections<S: AnimatableSectionModelType>(_ sections: [S]) throws -> [S.Identity : Int] {\n        var indexedSections: [S.Identity : Int] = [:]\n        for (i, section) in sections.enumerated() {\n            guard indexedSections[section.identity] == nil else {\n                #if DEBUG\n                    if indexedSections[section.identity] != nil {\n                        print(\"Section \\(section) has already been indexed at \\(indexedSections[section.identity]!)\")\n                    }\n                #endif\n                throw Error.duplicateSection(section: section)\n            }\n            indexedSections[section.identity] = i\n        }\n\n        return indexedSections\n    }\n\n    //================================================================================\n    //  Optimizations because Swift dictionaries are extremely slow (ARC, bridging ...)\n    //================================================================================\n    // swift dictionary optimizations {\n\n    private struct OptimizedIdentity<E: Hashable> : Hashable {\n\n        let hashValue: Int\n        let identity: UnsafePointer<E>\n\n        init(_ identity: UnsafePointer<E>) {\n            self.identity = identity\n            self.hashValue = identity.pointee.hashValue\n        }\n\n        static func == (lhs: OptimizedIdentity<E>, rhs: OptimizedIdentity<E>) -> Bool {\n            if lhs.hashValue != rhs.hashValue {\n                return false\n            }\n\n            if lhs.identity.distance(to: rhs.identity) == 0 {\n                return true\n            }\n\n            return lhs.identity.pointee == rhs.identity.pointee\n        }\n\n    }\n\n    private static func calculateAssociatedData<Item: IdentifiableType>(\n        initialItemCache: ContiguousArray<ContiguousArray<Item>>,\n        finalItemCache: ContiguousArray<ContiguousArray<Item>>\n        ) throws\n        -> (ContiguousArray<ContiguousArray<ItemAssociatedData>>, ContiguousArray<ContiguousArray<ItemAssociatedData>>) {\n\n            typealias Identity = Item.Identity\n            let totalInitialItems = initialItemCache.map { $0.count }.reduce(0, +)\n\n            var initialIdentities: ContiguousArray<Identity> = ContiguousArray()\n            var initialItemPaths: ContiguousArray<ItemPath> = ContiguousArray()\n\n            initialIdentities.reserveCapacity(totalInitialItems)\n            initialItemPaths.reserveCapacity(totalInitialItems)\n\n            for (i, items) in initialItemCache.enumerated() {\n                for j in 0 ..< items.count {\n                    let item = items[j]\n                    initialIdentities.append(item.identity)\n                    initialItemPaths.append(ItemPath(sectionIndex: i, itemIndex: j))\n                }\n            }\n\n            var initialItemData = ContiguousArray(initialItemCache.map { items in\n                return ContiguousArray<ItemAssociatedData>(repeating: ItemAssociatedData.initial, count: items.count)\n            })\n\n            var finalItemData = ContiguousArray(finalItemCache.map { items in\n                return ContiguousArray<ItemAssociatedData>(repeating: ItemAssociatedData.initial, count: items.count)\n            })\n\n            try initialIdentities.withUnsafeBufferPointer { (identitiesBuffer: UnsafeBufferPointer<Identity>) -> () in\n                var dictionary: [OptimizedIdentity<Identity>: Int] = Dictionary(minimumCapacity: totalInitialItems * 2)\n\n                for i in 0 ..< initialIdentities.count {\n                    let identityPointer = identitiesBuffer.baseAddress!.advanced(by: i)\n\n                    let key = OptimizedIdentity(identityPointer)\n\n                    if let existingValueItemPathIndex = dictionary[key] {\n                        let itemPath = initialItemPaths[existingValueItemPathIndex]\n                        let item = initialItemCache[itemPath.sectionIndex][itemPath.itemIndex]\n                        #if DEBUG\n                            print(\"Item \\(item) has already been indexed at \\(itemPath)\" )\n                        #endif\n                        throw Error.duplicateItem(item: item)\n                    }\n\n                    dictionary[key] = i\n                }\n\n                for (i, items) in finalItemCache.enumerated() {\n                    for j in 0 ..< items.count {\n                        let item = items[j]\n                        var identity = item.identity\n                        let key = OptimizedIdentity(&identity)\n                        guard let initialItemPathIndex = dictionary[key] else {\n                            continue\n                        }\n                        let itemPath = initialItemPaths[initialItemPathIndex]\n                        if initialItemData[itemPath.sectionIndex][itemPath.itemIndex].moveIndex != nil {\n                            throw Error.duplicateItem(item: item)\n                        }\n\n                        initialItemData[itemPath.sectionIndex][itemPath.itemIndex].moveIndex = ItemPath(sectionIndex: i, itemIndex: j)\n                        finalItemData[i][j].moveIndex = itemPath\n                    }\n                }\n\n                return ()\n            }\n\n            return (initialItemData, finalItemData)\n    }\n\n    // } swift dictionary optimizations\n\n    /*\n\n     I've uncovered this case during random stress testing of logic.\n     This is the hardest generic update case that causes two passes, first delete, and then move/insert\n\n     [\n     NumberSection(model: \"1\", items: [1111]),\n     NumberSection(model: \"2\", items: [2222]),\n     ]\n\n     [\n     NumberSection(model: \"2\", items: [0]),\n     NumberSection(model: \"1\", items: []),\n     ]\n\n     If update is in the form\n\n     * Move section from 2 to 1\n     * Delete Items at paths 0 - 0, 1 - 0\n     * Insert Items at paths 0 - 0\n\n     or\n\n     * Move section from 2 to 1\n     * Delete Items at paths 0 - 0\n     * Reload Items at paths 1 - 0\n\n     or\n\n     * Move section from 2 to 1\n     * Delete Items at paths 0 - 0\n     * Reload Items at paths 0 - 0\n\n     it crashes table view.\n\n     No matter what change is performed, it fails for me.\n     If anyone knows how to make this work for one Changeset, PR is welcome.\n\n     */\n\n    // If you are considering working out your own algorithm, these are tricky\n    // transition cases that you can use.\n\n    // case 1\n    /*\n     from = [\n     NumberSection(model: \"section 4\", items: [10, 11, 12]),\n     NumberSection(model: \"section 9\", items: [25, 26, 27]),\n     ]\n     to = [\n     HashableSectionModel(model: \"section 9\", items: [11, 26, 27]),\n     HashableSectionModel(model: \"section 4\", items: [10, 12])\n     ]\n     */\n\n    // case 2\n    /*\n     from = [\n     HashableSectionModel(model: \"section 10\", items: [26]),\n     HashableSectionModel(model: \"section 7\", items: [5, 29]),\n     HashableSectionModel(model: \"section 1\", items: [14]),\n     HashableSectionModel(model: \"section 5\", items: [16]),\n     HashableSectionModel(model: \"section 4\", items: []),\n     HashableSectionModel(model: \"section 8\", items: [3, 15, 19, 23]),\n     HashableSectionModel(model: \"section 3\", items: [20])\n     ]\n     to = [\n     HashableSectionModel(model: \"section 10\", items: [26]),\n     HashableSectionModel(model: \"section 1\", items: [14]),\n     HashableSectionModel(model: \"section 9\", items: [3]),\n     HashableSectionModel(model: \"section 5\", items: [16, 8]),\n     HashableSectionModel(model: \"section 8\", items: [15, 19, 23]),\n     HashableSectionModel(model: \"section 3\", items: [20]),\n     HashableSectionModel(model: \"Section 2\", items: [7])\n     ]\n     */\n\n    // case 3\n    /*\n     from = [\n     HashableSectionModel(model: \"section 4\", items: [5]),\n     HashableSectionModel(model: \"section 6\", items: [20, 14]),\n     HashableSectionModel(model: \"section 9\", items: []),\n     HashableSectionModel(model: \"section 2\", items: [2, 26]),\n     HashableSectionModel(model: \"section 8\", items: [23]),\n     HashableSectionModel(model: \"section 10\", items: [8, 18, 13]),\n     HashableSectionModel(model: \"section 1\", items: [28, 25, 6, 11, 10, 29, 24, 7, 19])\n     ]\n     to = [\n     HashableSectionModel(model: \"section 4\", items: [5]),\n     HashableSectionModel(model: \"section 6\", items: [20, 14]),\n     HashableSectionModel(model: \"section 9\", items: [16]),\n     HashableSectionModel(model: \"section 7\", items: [17, 15, 4]),\n     HashableSectionModel(model: \"section 2\", items: [2, 26, 23]),\n     HashableSectionModel(model: \"section 8\", items: []),\n     HashableSectionModel(model: \"section 10\", items: [8, 18, 13]),\n     HashableSectionModel(model: \"section 1\", items: [28, 25, 6, 11, 10, 29, 24, 7, 19])\n     ]\n     */\n\n    // Generates differential changes suitable for sectioned view consumption.\n    // It will not only detect changes between two states, but it will also try to compress those changes into\n    // almost minimal set of changes.\n    //\n    // I know, I know, it's ugly :( Totally agree, but this is the only general way I could find that works 100%, and\n    // avoids UITableView quirks.\n    //\n    // Please take into consideration that I was also convinced about 20 times that I've found a simple general\n    // solution, but then UITableView falls apart under stress testing :(\n    //\n    // Sincerely, if somebody else would present me this 250 lines of code, I would call him a mad man. I would think\n    // that there has to be a simpler solution. Well, after 3 days, I'm not convinced any more :)\n    //\n    // Maybe it can be made somewhat simpler, but don't think it can be made much simpler.\n    //\n    // The algorithm could take anywhere from 1 to 3 table view transactions to finish the updates.\n    //\n    //  * stage 1 - remove deleted sections and items\n    //  * stage 2 - move sections into place\n    //  * stage 3 - fix moved and new items\n    //\n    // There maybe exists a better division, but time will tell.\n    //\n    public static func differencesForSectionedView<S: AnimatableSectionModelType>(\n        initialSections: [S],\n        finalSections: [S])\n        throws -> [Changeset<S>] {\n            typealias I = S.Item\n\n            var result: [Changeset<S>] = []\n\n            var sectionCommands = try CommandGenerator<S>.generatorForInitialSections(initialSections, finalSections: finalSections)\n\n            result.append(contentsOf: try sectionCommands.generateDeleteSectionsDeletedItemsAndUpdatedItems())\n            result.append(contentsOf: try sectionCommands.generateInsertAndMoveSections())\n            result.append(contentsOf: try sectionCommands.generateInsertAndMovedItems())\n\n            return result\n    }\n\n\n    @available(*, deprecated, renamed: \"differencesForSectionedView(initialSections:finalSections:)\")\n    public static func differencesForSectionedView<S: AnimatableSectionModelType>(\n        _ initialSections: [S],\n        finalSections: [S])\n        throws -> [Changeset<S>] {\n            return try differencesForSectionedView(initialSections: initialSections, finalSections: finalSections)\n    }\n\n    private struct CommandGenerator<S: AnimatableSectionModelType> {\n        typealias Item = S.Item\n\n        let initialSections: [S]\n        let finalSections: [S]\n\n        let initialSectionData: ContiguousArray<SectionAssociatedData>\n        let finalSectionData: ContiguousArray<SectionAssociatedData>\n\n        let initialItemData: ContiguousArray<ContiguousArray<ItemAssociatedData>>\n        let finalItemData: ContiguousArray<ContiguousArray<ItemAssociatedData>>\n\n        let initialItemCache: ContiguousArray<ContiguousArray<Item>>\n        let finalItemCache: ContiguousArray<ContiguousArray<Item>>\n\n        static func generatorForInitialSections(\n            _ initialSections: [S],\n            finalSections: [S]\n            ) throws -> CommandGenerator<S> {\n\n            let (initialSectionData, finalSectionData) = try calculateSectionMovements(initialSections: initialSections, finalSections: finalSections)\n\n            let initialItemCache = ContiguousArray(initialSections.map {\n                ContiguousArray($0.items)\n            })\n\n            let finalItemCache = ContiguousArray(finalSections.map {\n                ContiguousArray($0.items)\n            })\n\n            let (initialItemData, finalItemData) = try calculateItemMovements(\n                initialItemCache: initialItemCache,\n                finalItemCache: finalItemCache,\n                initialSectionData: initialSectionData,\n                finalSectionData: finalSectionData\n            )\n\n            return CommandGenerator<S>(\n                initialSections: initialSections,\n                finalSections: finalSections,\n\n                initialSectionData: initialSectionData,\n                finalSectionData: finalSectionData,\n\n                initialItemData: initialItemData,\n                finalItemData: finalItemData,\n\n                initialItemCache: initialItemCache,\n                finalItemCache: finalItemCache\n            )\n        }\n\n        static func calculateItemMovements(\n            initialItemCache: ContiguousArray<ContiguousArray<Item>>,\n            finalItemCache: ContiguousArray<ContiguousArray<Item>>,\n            initialSectionData: ContiguousArray<SectionAssociatedData>,\n            finalSectionData: ContiguousArray<SectionAssociatedData>) throws\n            -> (ContiguousArray<ContiguousArray<ItemAssociatedData>>, ContiguousArray<ContiguousArray<ItemAssociatedData>>) {\n\n                var (initialItemData, finalItemData) = try Diff.calculateAssociatedData(\n                    initialItemCache: initialItemCache,\n                    finalItemCache: finalItemCache\n                )\n\n                let findNextUntouchedOldIndex = { (initialSectionIndex: Int, initialSearchIndex: Int?) -> Int? in\n                    guard var i2 = initialSearchIndex else {\n                        return nil\n                    }\n\n                    while i2 < initialSectionData[initialSectionIndex].itemCount {\n                        if initialItemData[initialSectionIndex][i2].event == .untouched {\n                            return i2\n                        }\n\n                        i2 = i2 + 1\n                    }\n\n                    return nil\n                }\n\n                // first mark deleted items\n                for i in 0 ..< initialItemCache.count {\n                    guard let _ = initialSectionData[i].moveIndex else {\n                        continue\n                    }\n\n                    var indexAfterDelete = 0\n                    for j in 0 ..< initialItemCache[i].count {\n\n                        guard let finalIndexPath = initialItemData[i][j].moveIndex else {\n                            initialItemData[i][j].event = .deleted\n                            continue\n                        }\n\n                        // from this point below, section has to be move type because it's initial and not deleted\n\n                        // because there is no move to inserted section\n                        if finalSectionData[finalIndexPath.sectionIndex].event == .inserted {\n                            initialItemData[i][j].event = .deleted\n                            continue\n                        }\n\n                        initialItemData[i][j].indexAfterDelete = indexAfterDelete\n                        indexAfterDelete += 1\n                    }\n                }\n\n                // mark moved or moved automatically\n                for i in 0 ..< finalItemCache.count {\n                    guard let originalSectionIndex = finalSectionData[i].moveIndex else {\n                        continue\n                    }\n\n                    var untouchedIndex: Int? = 0\n                    for j in 0 ..< finalItemCache[i].count {\n                        untouchedIndex = findNextUntouchedOldIndex(originalSectionIndex, untouchedIndex)\n\n                        guard let originalIndex = finalItemData[i][j].moveIndex else {\n                            finalItemData[i][j].event = .inserted\n                            continue\n                        }\n\n                        // In case trying to move from deleted section, abort, otherwise it will crash table view\n                        if initialSectionData[originalIndex.sectionIndex].event == .deleted {\n                            finalItemData[i][j].event = .inserted\n                            continue\n                        }\n                            // original section can't be inserted\n                        else if initialSectionData[originalIndex.sectionIndex].event == .inserted {\n                            try precondition(false, \"New section in initial sections, that is wrong\")\n                        }\n\n                        let initialSectionEvent = initialSectionData[originalIndex.sectionIndex].event\n                        try precondition(initialSectionEvent == .moved || initialSectionEvent == .movedAutomatically, \"Section not moved\")\n\n                        let eventType = originalIndex == ItemPath(sectionIndex: originalSectionIndex, itemIndex: untouchedIndex ?? -1)\n                            ? EditEvent.movedAutomatically : EditEvent.moved\n\n                        initialItemData[originalIndex.sectionIndex][originalIndex.itemIndex].event = eventType\n                        finalItemData[i][j].event = eventType\n                    }\n                }\n\n                return (initialItemData, finalItemData)\n        }\n\n        static func calculateSectionMovements(initialSections: [S], finalSections: [S]) throws\n            -> (ContiguousArray<SectionAssociatedData>, ContiguousArray<SectionAssociatedData>) {\n\n                let initialSectionIndexes = try Diff.indexSections(initialSections)\n\n                var initialSectionData = ContiguousArray<SectionAssociatedData>(repeating: SectionAssociatedData.initial, count: initialSections.count)\n                var finalSectionData = ContiguousArray<SectionAssociatedData>(repeating: SectionAssociatedData.initial, count: finalSections.count)\n\n                for (i, section) in finalSections.enumerated() {\n                    finalSectionData[i].itemCount = finalSections[i].items.count\n                    guard let initialSectionIndex = initialSectionIndexes[section.identity] else {\n                        continue\n                    }\n\n                    if initialSectionData[initialSectionIndex].moveIndex != nil {\n                        throw Error.duplicateSection(section: section)\n                    }\n\n                    initialSectionData[initialSectionIndex].moveIndex = i\n                    finalSectionData[i].moveIndex = initialSectionIndex\n                }\n\n                var sectionIndexAfterDelete = 0\n\n                // deleted sections\n                for i in 0 ..< initialSectionData.count {\n                    initialSectionData[i].itemCount = initialSections[i].items.count\n                    if initialSectionData[i].moveIndex == nil {\n                        initialSectionData[i].event = .deleted\n                        continue\n                    }\n\n                    initialSectionData[i].indexAfterDelete = sectionIndexAfterDelete\n                    sectionIndexAfterDelete += 1\n                }\n\n                // moved sections\n\n                var untouchedOldIndex: Int? = 0\n                let findNextUntouchedOldIndex = { (initialSearchIndex: Int?) -> Int? in\n                    guard var i = initialSearchIndex else {\n                        return nil\n                    }\n\n                    while i < initialSections.count {\n                        if initialSectionData[i].event == .untouched {\n                            return i\n                        }\n\n                        i = i + 1\n                    }\n\n                    return nil\n                }\n\n                // inserted and moved sections {\n                // this should fix all sections and move them into correct places\n                // 2nd stage\n                for i in 0 ..< finalSections.count {\n                    untouchedOldIndex = findNextUntouchedOldIndex(untouchedOldIndex)\n\n                    // oh, it did exist\n                    if let oldSectionIndex = finalSectionData[i].moveIndex {\n                        let moveType = oldSectionIndex != untouchedOldIndex ? EditEvent.moved : EditEvent.movedAutomatically\n\n                        finalSectionData[i].event = moveType\n                        initialSectionData[oldSectionIndex].event = moveType\n                    }\n                    else {\n                        finalSectionData[i].event = .inserted\n                    }\n                }\n\n                // inserted sections\n                for (i, section) in finalSectionData.enumerated() {\n                    if section.moveIndex == nil {\n                        _ = finalSectionData[i].event == .inserted\n                    }\n                }\n\n                return (initialSectionData, finalSectionData)\n        }\n\n        mutating func generateDeleteSectionsDeletedItemsAndUpdatedItems() throws -> [Changeset<S>] {\n            var deletedSections = [Int]()\n\n            var deletedItems = [ItemPath]()\n            var updatedItems = [ItemPath]()\n\n            var afterDeleteState = [S]()\n\n            // mark deleted items {\n            // 1rst stage again (I know, I know ...)\n            for (i, initialItems) in initialItemCache.enumerated() {\n                let event = initialSectionData[i].event\n\n                // Deleted section will take care of deleting child items.\n                // In case of moving an item from deleted section, tableview will\n                // crash anyway, so this is not limiting anything.\n                if event == .deleted {\n                    deletedSections.append(i)\n                    continue\n                }\n\n                var afterDeleteItems: [S.Item] = []\n                for j in 0 ..< initialItems.count {\n                    let event = initialItemData[i][j].event\n                    switch event {\n                    case .deleted:\n                        deletedItems.append(ItemPath(sectionIndex: i, itemIndex: j))\n                    case .moved, .movedAutomatically:\n                        let finalItemIndex = try initialItemData[i][j].moveIndex.unwrap()\n                        let finalItem = finalItemCache[finalItemIndex.sectionIndex][finalItemIndex.itemIndex]\n                        if finalItem != initialSections[i].items[j] {\n                            updatedItems.append(ItemPath(sectionIndex: i, itemIndex: j))\n                        }\n                        afterDeleteItems.append(finalItem)\n                    default:\n                        try precondition(false, \"Unhandled case\")\n                    }\n                }\n\n                afterDeleteState.append(try S.init(safeOriginal: initialSections[i], safeItems: afterDeleteItems))\n            }\n            // }\n\n            if deletedItems.count == 0 && deletedSections.count == 0 && updatedItems.count == 0 {\n                return []\n            }\n\n            return [Changeset(\n                finalSections: afterDeleteState,\n                deletedSections: deletedSections,\n                deletedItems: deletedItems,\n                updatedItems: updatedItems\n                )]\n        }\n\n        func generateInsertAndMoveSections() throws -> [Changeset<S>] {\n\n            var movedSections = [(from: Int, to: Int)]()\n            var insertedSections = [Int]()\n\n            for i in 0 ..< initialSections.count {\n                switch initialSectionData[i].event {\n                case .deleted:\n                    break\n                case .moved:\n                    movedSections.append((from: try initialSectionData[i].indexAfterDelete.unwrap(), to: try initialSectionData[i].moveIndex.unwrap()))\n                case .movedAutomatically:\n                    break\n                default:\n                    try precondition(false, \"Unhandled case in initial sections\")\n                }\n            }\n            \n            for i in 0 ..< finalSections.count {\n                switch finalSectionData[i].event {\n                case .inserted:\n                    insertedSections.append(i)\n                default:\n                    break\n                }\n            }\n            \n            if insertedSections.count ==  0 && movedSections.count == 0 {\n                return []\n            }\n            \n            // sections should be in place, but items should be original without deleted ones\n            let sectionsAfterChange: [S] = try self.finalSections.enumerated().map { i, s -> S in\n                let event = self.finalSectionData[i].event\n                \n                if event == .inserted {\n                    // it's already set up\n                    return s\n                }\n                else if event == .moved || event == .movedAutomatically {\n                    let originalSectionIndex = try finalSectionData[i].moveIndex.unwrap()\n                    let originalSection = initialSections[originalSectionIndex]\n                    \n                    var items: [S.Item] = []\n                    items.reserveCapacity(originalSection.items.count)\n                    let itemAssociatedData = self.initialItemData[originalSectionIndex]\n                    for j in 0 ..< originalSection.items.count {\n                        let initialData = itemAssociatedData[j]\n                        \n                        guard initialData.event != .deleted else {\n                            continue\n                        }\n                        \n                        guard let finalIndex = initialData.moveIndex else {\n                            try precondition(false, \"Item was moved, but no final location.\")\n                            continue\n                        }\n                        \n                        items.append(finalItemCache[finalIndex.sectionIndex][finalIndex.itemIndex])\n                    }\n                    \n                    let modifiedSection = try S.init(safeOriginal: s, safeItems: items)\n                    \n                    return modifiedSection\n                }\n                else {\n                    try precondition(false, \"This is weird, this shouldn't happen\")\n                    return s\n                }\n            }\n            \n            return [Changeset(\n                finalSections: sectionsAfterChange,\n                insertedSections:  insertedSections,\n                movedSections: movedSections\n                )]\n        }\n        \n        mutating func generateInsertAndMovedItems() throws -> [Changeset<S>] {\n            var insertedItems = [ItemPath]()\n            var movedItems = [(from: ItemPath, to: ItemPath)]()\n            \n            // mark new and moved items {\n            // 3rd stage\n            for i in 0 ..< finalSections.count {\n                let finalSection = finalSections[i]\n                \n                let sectionEvent = finalSectionData[i].event\n                // new and deleted sections cause reload automatically\n                if sectionEvent != .moved && sectionEvent != .movedAutomatically {\n                    continue\n                }\n                \n                for j in 0 ..< finalSection.items.count {\n                    let currentItemEvent = finalItemData[i][j].event\n                    \n                    try precondition(currentItemEvent != .untouched, \"Current event is not untouched\")\n                    \n                    let event = finalItemData[i][j].event\n                    \n                    switch event {\n                    case .inserted:\n                        insertedItems.append(ItemPath(sectionIndex: i, itemIndex: j))\n                    case .moved:\n                        let originalIndex = try finalItemData[i][j].moveIndex.unwrap()\n                        let finalSectionIndex = try initialSectionData[originalIndex.sectionIndex].moveIndex.unwrap()\n                        let moveFromItemWithIndex = try initialItemData[originalIndex.sectionIndex][originalIndex.itemIndex].indexAfterDelete.unwrap()\n                        \n                        let moveCommand = (\n                            from: ItemPath(sectionIndex: finalSectionIndex, itemIndex: moveFromItemWithIndex),\n                            to: ItemPath(sectionIndex: i, itemIndex: j)\n                        )\n                        movedItems.append(moveCommand)\n                    default:\n                        break\n                    }\n                }\n            }\n            // }\n            \n            if insertedItems.count == 0 && movedItems.count == 0 {\n                return []\n            }\n            return [Changeset(\n                finalSections: finalSections,\n                insertedItems: insertedItems,\n                movedItems: movedItems\n                )]\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/Differentiator/Sources/Differentiator/IdentifiableType.swift",
    "content": "//\n//  IdentifiableType.swift\n//  RxDataSources\n//\n//  Created by Krunoslav Zaher on 1/6/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\npublic protocol IdentifiableType {\n    associatedtype Identity: Hashable\n\n    var identity : Identity { get }\n}"
  },
  {
    "path": "Pods/Differentiator/Sources/Differentiator/IdentifiableValue.swift",
    "content": "//\n//  IdentifiableValue.swift\n//  RxDataSources\n//\n//  Created by Krunoslav Zaher on 1/7/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\npublic struct IdentifiableValue<Value: Hashable> {\n    public let value: Value\n}\n\nextension IdentifiableValue\n    : IdentifiableType {\n\n    public typealias Identity = Value\n\n    public var identity : Identity {\n        return value\n    }\n}\n\nextension IdentifiableValue\n    : Equatable\n    , CustomStringConvertible\n    , CustomDebugStringConvertible {\n\n    public var description: String {\n        return \"\\(value)\"\n    }\n\n    public var debugDescription: String {\n        return \"\\(value)\"\n    }\n}\n\npublic func == <V>(lhs: IdentifiableValue<V>, rhs: IdentifiableValue<V>) -> Bool {\n    return lhs.value == rhs.value\n}\n"
  },
  {
    "path": "Pods/Differentiator/Sources/Differentiator/ItemPath.swift",
    "content": "//\n//  ItemPath.swift\n//  RxDataSources\n//\n//  Created by Krunoslav Zaher on 1/9/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\npublic struct ItemPath {\n    public let sectionIndex: Int\n    public let itemIndex: Int\n\n    public init(sectionIndex: Int, itemIndex: Int) {\n        self.sectionIndex = sectionIndex\n        self.itemIndex = itemIndex\n    }\n}\n\nextension ItemPath : Equatable {\n    \n}\n\npublic func == (lhs: ItemPath, rhs: ItemPath) -> Bool {\n    return lhs.sectionIndex == rhs.sectionIndex && lhs.itemIndex == rhs.itemIndex\n}\n\nextension ItemPath: Hashable {\n\n    public var hashValue: Int {\n        return sectionIndex.byteSwapped.hashValue ^ itemIndex.hashValue\n    }\n    \n}\n"
  },
  {
    "path": "Pods/Differentiator/Sources/Differentiator/Optional+Extensions.swift",
    "content": "//\n//  Optional+Extensions.swift\n//  RxDataSources\n//\n//  Created by Krunoslav Zaher on 1/8/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\nextension Optional {\n    func unwrap() throws -> Wrapped {\n        if let unwrapped = self {\n            return unwrapped\n        }\n        else {\n            debugFatalError(\"Error during unwrapping optional\")\n            throw DifferentiatorError.unwrappingOptional\n        }\n   }\n}\n"
  },
  {
    "path": "Pods/Differentiator/Sources/Differentiator/SectionModel.swift",
    "content": "//\n//  SectionModel.swift\n//  RxDataSources\n//\n//  Created by Krunoslav Zaher on 6/16/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\npublic struct SectionModel<Section, ItemType> {\n    public var model: Section\n    public var items: [Item]\n\n    public init(model: Section, items: [Item]) {\n        self.model = model\n        self.items = items\n    }\n}\n\nextension SectionModel\n    : SectionModelType {\n    public typealias Identity = Section\n    public typealias Item = ItemType\n    \n    public var identity: Section {\n        return model\n    }\n}\n\nextension SectionModel\n    : CustomStringConvertible {\n\n    public var description: String {\n        return \"\\(self.model) > \\(items)\"\n    }\n}\n\nextension SectionModel {\n    public init(original: SectionModel<Section, Item>, items: [Item]) {\n        self.model = original.model\n        self.items = items\n    }\n}\n"
  },
  {
    "path": "Pods/Differentiator/Sources/Differentiator/SectionModelType.swift",
    "content": "//\n//  SectionModelType.swift\n//  RxDataSources\n//\n//  Created by Krunoslav Zaher on 6/28/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\npublic protocol SectionModelType {\n    associatedtype Item\n\n    var items: [Item] { get }\n\n    init(original: Self, items: [Item])\n}"
  },
  {
    "path": "Pods/Differentiator/Sources/Differentiator/Utilities.swift",
    "content": "//\n//  Utilities.swift\n//  RxDataSources\n//\n//  Created by muukii on 8/2/17.\n//  Copyright © 2017 kzaher. All rights reserved.\n//\n\nimport Foundation\n\nenum DifferentiatorError : Error {\n    case unwrappingOptional\n    case preconditionFailed(message: String)\n}\n\nfunc precondition(_ condition: Bool, _ message: @autoclosure() -> String) throws -> () {\n    if condition {\n        return\n    }\n    debugFatalError(\"Precondition failed\")\n\n    throw DifferentiatorError.preconditionFailed(message: message())\n}\n\nfunc debugFatalError(_ error: Error) {\n    debugFatalError(\"\\(error)\")\n}\n\nfunc debugFatalError(_ message: String) {\n    #if DEBUG\n        fatalError(message)\n    #else\n        print(message)\n    #endif\n}\n"
  },
  {
    "path": "Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Categories/IQNSArray+Sort.swift",
    "content": "//\n//  IQNSArray+Sort.swift\n// https://github.com/hackiftekhar/IQKeyboardManager\n// Copyright (c) 2013-16 Iftekhar Qurashi.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\nimport UIKit\n\n/**\nUIView.subviews sorting category.\n*/\ninternal extension Array {\n    \n    ///--------------\n    /// MARK: Sorting\n    ///--------------\n    \n    /**\n    Returns the array by sorting the UIView's by their tag property.\n    */\n    internal func sortedArrayByTag() -> [Element] {\n        \n        return sorted(by: { (obj1 : Element, obj2 : Element) -> Bool in\n            \n            let view1 = obj1 as! UIView\n            let view2 = obj2 as! UIView\n            \n            return (view1.tag < view2.tag)\n        })\n    }\n    \n    /**\n    Returns the array by sorting the UIView's by their tag property.\n    */\n    internal func sortedArrayByPosition() -> [Element] {\n        \n        return sorted(by: { (obj1 : Element, obj2 : Element) -> Bool in\n            \n            let view1 = obj1 as! UIView\n            let view2 = obj2 as! UIView\n            \n            let x1 = view1.frame.minX\n            let y1 = view1.frame.minY\n            let x2 = view2.frame.minX\n            let y2 = view2.frame.minY\n            \n            if y1 != y2 {\n                return y1 < y2\n            } else {\n                return x1 < x2\n            }\n        })\n    }\n}\n\n"
  },
  {
    "path": "Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Categories/IQUIScrollView+Additions.swift",
    "content": "//\n//  IQUIScrollView+Additions.swift\n// https://github.com/hackiftekhar/IQKeyboardManager\n// Copyright (c) 2013-16 Iftekhar Qurashi.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\nimport UIKit\n\nprivate var kIQShouldIgnoreScrollingAdjustment      = \"kIQShouldIgnoreScrollingAdjustment\"\nprivate var kIQShouldRestoreScrollViewContentOffset = \"kIQShouldRestoreScrollViewContentOffset\"\n\npublic extension UIScrollView {\n    \n    /**\n     If YES, then scrollview will ignore scrolling (simply not scroll it) for adjusting textfield position. Default is NO.\n     */\n    public var shouldIgnoreScrollingAdjustment: Bool {\n        get {\n            \n            if let aValue = objc_getAssociatedObject(self, &kIQShouldIgnoreScrollingAdjustment) as? Bool {\n                return aValue\n            } else {\n                return false\n            }\n        }\n        set(newValue) {\n            objc_setAssociatedObject(self, &kIQShouldIgnoreScrollingAdjustment, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n        }\n    }\n\n    /**\n     To set customized distance from keyboard for textField/textView. Can't be less than zero\n     */\n    public var shouldRestoreScrollViewContentOffset: Bool {\n        get {\n            \n            if let aValue = objc_getAssociatedObject(self, &kIQShouldRestoreScrollViewContentOffset) as? Bool {\n                return aValue\n            } else {\n                return false\n            }\n        }\n        set(newValue) {\n            objc_setAssociatedObject(self, &kIQShouldRestoreScrollViewContentOffset, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Categories/IQUITextFieldView+Additions.swift",
    "content": "//\n//  IQUITextFieldView+Additions.swift\n// https://github.com/hackiftekhar/IQKeyboardManager\n// Copyright (c) 2013-16 Iftekhar Qurashi.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\nimport UIKit\n\n/**\nUses default keyboard distance for textField.\n*/\npublic let kIQUseDefaultKeyboardDistance = CGFloat.greatestFiniteMagnitude\n\nprivate var kIQKeyboardDistanceFromTextField = \"kIQKeyboardDistanceFromTextField\"\nprivate var kIQIgnoreSwitchingByNextPrevious = \"kIQIgnoreSwitchingByNextPrevious\"\n\n/**\nUIView category for managing UITextField/UITextView\n*/\npublic extension UIView {\n\n    /**\n     To set customized distance from keyboard for textField/textView. Can't be less than zero\n     */\n    public var keyboardDistanceFromTextField: CGFloat {\n        get {\n            \n            if let aValue = objc_getAssociatedObject(self, &kIQKeyboardDistanceFromTextField) as? CGFloat {\n                return aValue\n            } else {\n                return kIQUseDefaultKeyboardDistance\n            }\n        }\n        set(newValue) {\n            objc_setAssociatedObject(self, &kIQKeyboardDistanceFromTextField, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n        }\n    }\n    \n    /**\n     If shouldIgnoreSwitchingByNextPrevious is true then library will ignore this textField/textView while moving to other textField/textView using keyboard toolbar next previous buttons. Default is false\n     */\n    public var ignoreSwitchingByNextPrevious: Bool {\n        get {\n            \n            if let aValue = objc_getAssociatedObject(self, &kIQIgnoreSwitchingByNextPrevious) as? Bool {\n                return aValue\n            } else {\n                return false\n            }\n        }\n        set(newValue) {\n            objc_setAssociatedObject(self, &kIQIgnoreSwitchingByNextPrevious, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n        }\n    }\n}\n\n"
  },
  {
    "path": "Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Categories/IQUIView+Hierarchy.swift",
    "content": "//\n//  IQUIView+Hierarchy.swift\n// https://github.com/hackiftekhar/IQKeyboardManager\n// Copyright (c) 2013-16 Iftekhar Qurashi.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nimport UIKit\n\n/**\nUIView hierarchy category.\n*/\npublic extension UIView {\n    \n    ///----------------------\n    /// MARK: viewControllers\n    ///----------------------\n\n    /**\n    Returns the UIViewController object that manages the receiver.\n    */\n    public func viewController()->UIViewController? {\n        \n        var nextResponder: UIResponder? = self\n        \n        repeat {\n            nextResponder = nextResponder?.next\n            \n            if let viewController = nextResponder as? UIViewController {\n                return viewController\n            }\n            \n        } while nextResponder != nil\n        \n        return nil\n    }\n    \n    /**\n    Returns the topMost UIViewController object in hierarchy.\n    */\n    public func topMostController()->UIViewController? {\n        \n        var controllersHierarchy = [UIViewController]()\n\n        if var topController = window?.rootViewController {\n            controllersHierarchy.append(topController)\n\n            while topController.presentedViewController != nil {\n                \n                topController = topController.presentedViewController!\n\n                controllersHierarchy.append(topController)\n            }\n            \n            var matchController :UIResponder? = viewController()\n\n            while matchController != nil && controllersHierarchy.contains(matchController as! UIViewController) == false {\n                \n                repeat {\n                    matchController = matchController?.next\n\n                } while matchController != nil && matchController is UIViewController == false\n            }\n            \n            return matchController as? UIViewController\n            \n        } else {\n            return viewController()\n        }\n    }\n    \n    \n    ///-----------------------------------\n    /// MARK: Superviews/Subviews/Siglings\n    ///-----------------------------------\n    \n    /**\n    Returns the superView of provided class type.\n    */\n    public func superviewOfClassType(_ classType:UIView.Type)->UIView? {\n\n        var superView = superview\n        \n        while let unwrappedSuperView = superView {\n            \n            if unwrappedSuperView.isKind(of: classType) {\n                \n                //If it's UIScrollView, then validating for special cases\n                if unwrappedSuperView.isKind(of: UIScrollView.self) {\n                    \n                    let classNameString = NSStringFromClass(type(of:unwrappedSuperView.self))\n\n                    //  If it's not UITableViewWrapperView class, this is internal class which is actually manage in UITableview. The speciality of this class is that it's superview is UITableView.\n                    //  If it's not UITableViewCellScrollView class, this is internal class which is actually manage in UITableviewCell. The speciality of this class is that it's superview is UITableViewCell.\n                    //If it's not _UIQueuingScrollView class, actually we validate for _ prefix which usually used by Apple internal classes\n                    if unwrappedSuperView.superview?.isKind(of: UITableView.self) == false &&\n                        unwrappedSuperView.superview?.isKind(of: UITableViewCell.self) == false &&\n                        classNameString.hasPrefix(\"_\") == false {\n                        return superView\n                    }\n                }\n                else {\n                    return superView\n                }\n            }\n            \n            superView = unwrappedSuperView.superview\n        }\n        \n        return nil\n    }\n\n    /**\n    Returns all siblings of the receiver which canBecomeFirstResponder.\n    */\n    public func responderSiblings()->[UIView] {\n\n        //Array of (UITextField/UITextView's).\n        var tempTextFields = [UIView]()\n\n        //\tGetting all siblings\n        if let siblings = superview?.subviews {\n            \n            for textField in siblings {\n                \n                if (textField == self || textField.ignoreSwitchingByNextPrevious == false) && textField._IQcanBecomeFirstResponder() == true {\n                    tempTextFields.append(textField)\n                }\n            }\n        }\n\n        return tempTextFields\n    }\n    \n    /**\n    Returns all deep subViews of the receiver which canBecomeFirstResponder.\n    */\n    public func deepResponderViews()->[UIView] {\n        \n        //Array of (UITextField/UITextView's).\n        var textfields = [UIView]()\n        \n        for textField in subviews {\n            \n            if (textField == self || textField.ignoreSwitchingByNextPrevious == false) && textField._IQcanBecomeFirstResponder() == true {\n                textfields.append(textField)\n            }\n\n            //Sometimes there are hidden or disabled views and textField inside them still recorded, so we added some more validations here (Bug ID: #458)\n            //Uncommented else (Bug ID: #625)\n            if textField.subviews.count != 0  && isUserInteractionEnabled == true && isHidden == false && alpha != 0.0 {\n                for deepView in textField.deepResponderViews() {\n                    textfields.append(deepView)\n                }\n            }\n        }\n        \n        //subviews are returning in opposite order. Sorting according the frames 'y'.\n        return textfields.sorted(by: { (view1 : UIView, view2 : UIView) -> Bool in\n            \n            let frame1 = view1.convert(view1.bounds, to: self)\n            let frame2 = view2.convert(view2.bounds, to: self)\n\n            let x1 = frame1.minX\n            let y1 = frame1.minY\n            let x2 = frame2.minX\n            let y2 = frame2.minY\n            \n            if y1 != y2 {\n                return y1 < y2\n            } else {\n                return x1 < x2\n            }\n        })\n    }\n    \n    fileprivate func _IQcanBecomeFirstResponder() -> Bool {\n        \n        var _IQcanBecomeFirstResponder = false\n        \n        //  Setting toolbar to keyboard.\n        if let textField = self as? UITextField {\n            _IQcanBecomeFirstResponder = textField.isEnabled\n        } else if let textView = self as? UITextView {\n            _IQcanBecomeFirstResponder = textView.isEditable\n        }\n        \n        if _IQcanBecomeFirstResponder == true {\n            _IQcanBecomeFirstResponder = isUserInteractionEnabled == true && isHidden == false && alpha != 0.0 && isAlertViewTextField() == false && isSearchBarTextField() == false\n        }\n\n        return _IQcanBecomeFirstResponder\n    }\n\n    ///-------------------------\n    /// MARK: Special TextFields\n    ///-------------------------\n    \n    /**\n    Returns YES if the receiver object is UISearchBarTextField, otherwise return NO.\n    */\n    public func isSearchBarTextField()-> Bool {\n        \n        var searchBar : UIResponder? = self.next\n        \n        var isSearchBarTextField = false\n        \n        while searchBar != nil && isSearchBarTextField == false {\n            \n            if searchBar!.isKind(of: UISearchBar.self) {\n                isSearchBarTextField = true\n                break\n            } else if searchBar is UIViewController {\n                break\n            }\n            \n            searchBar = searchBar?.next\n        }\n        \n        return isSearchBarTextField\n    }\n    \n    /**\n    Returns YES if the receiver object is UIAlertSheetTextField, otherwise return NO.\n    */\n    public func isAlertViewTextField()->Bool {\n        \n        var alertViewController : UIResponder? = self.viewController()\n        \n        var isAlertViewTextField = false\n        \n        while alertViewController != nil && isAlertViewTextField == false {\n            \n            if alertViewController!.isKind(of: UIAlertController.self) {\n                isAlertViewTextField = true\n                break\n            }\n            \n            alertViewController = alertViewController?.next\n        }\n        \n        return isAlertViewTextField\n    }\n    \n\n    ///----------------\n    /// MARK: Transform\n    ///----------------\n    \n    /**\n    Returns current view transform with respect to the 'toView'.\n    */\n    public func convertTransformToView(_ toView:UIView?)->CGAffineTransform {\n        \n        var newView = toView\n        \n        if newView == nil {\n            newView = window\n        }\n        \n        //My Transform\n        var myTransform = CGAffineTransform.identity\n        \n        if let superView = superview {\n            myTransform = transform.concatenating(superView.convertTransformToView(nil))\n        } else {\n            myTransform = transform\n        }\n    \n        var viewTransform = CGAffineTransform.identity\n        \n        //view Transform\n        if let unwrappedToView = newView {\n            \n            if let unwrappedSuperView = unwrappedToView.superview {\n                viewTransform = unwrappedToView.transform.concatenating(unwrappedSuperView.convertTransformToView(nil))\n            }\n            else {\n                viewTransform = unwrappedToView.transform\n            }\n        }\n        \n        //Concating MyTransform and ViewTransform\n        return myTransform.concatenating(viewTransform.inverted())\n    }\n    \n    ///-----------------\n    /// TODO: Hierarchy\n    ///-----------------\n    \n//    /**\n//    Returns a string that represent the information about it's subview's hierarchy. You can use this method to debug the subview's positions.\n//    */\n//    func subHierarchy()->NSString {\n//        \n//    }\n//    \n//    /**\n//    Returns an string that represent the information about it's upper hierarchy. You can use this method to debug the superview's positions.\n//    */\n//    func superHierarchy()->NSString {\n//        \n//    }\n//    \n//    /**\n//    Returns an string that represent the information about it's frame positions. You can use this method to debug self positions.\n//    */\n//    func debugHierarchy()->NSString {\n//        \n//    }\n\n    fileprivate func depth()->Int {\n        var depth : Int = 0\n        \n        if let superView = superview {\n            depth = superView.depth()+1\n        }\n        \n        return depth\n    }\n    \n}\n\n\nextension NSObject {\n    \n    public func _IQDescription() -> String {\n        return \"<\\(self) \\(Unmanaged.passUnretained(self).toOpaque())>\"\n    }\n}\n\n\n\n"
  },
  {
    "path": "Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Categories/IQUIViewController+Additions.swift",
    "content": "//\n//  IQUIViewController+Additions.swift\n// https://github.com/hackiftekhar/IQKeyboardManager\n// Copyright (c) 2013-16 Iftekhar Qurashi.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport UIKit\n\n\nprivate var kIQLayoutGuideConstraint = \"kIQLayoutGuideConstraint\"\n\n\npublic extension UIViewController {\n\n    /**\n    To set customized distance from keyboard for textField/textView. Can't be less than zero\n     \n     @deprecated    Library is internally handling Safe Area (If you are using Safe Area from Xcode9 and iOS11) and there is no need to do any tweak if you already migrated to use Safe Area\n    */\n    @available(iOS, deprecated: 11.0)\n    @IBOutlet public var IQLayoutGuideConstraint: NSLayoutConstraint? {\n        get {\n            \n            return objc_getAssociatedObject(self, &kIQLayoutGuideConstraint) as? NSLayoutConstraint\n        }\n\n        set(newValue) {\n            objc_setAssociatedObject(self, &kIQLayoutGuideConstraint, newValue,objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Categories/IQUIWindow+Hierarchy.swift",
    "content": "//\n//  IQUIWindow+Hierarchy.swift\n// https://github.com/hackiftekhar/IQKeyboardManager\n// Copyright (c) 2013-16 Iftekhar Qurashi.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nimport UIKit\n\n/** @abstract UIWindow hierarchy category.  */\npublic extension UIWindow {\n\n    /** @return Returns the current Top Most ViewController in hierarchy.   */\n    public func topMostWindowController()->UIViewController? {\n        \n        var topController = rootViewController\n        \n        while let presentedController = topController?.presentedViewController {\n            topController = presentedController\n        }\n        \n        return topController\n    }\n    \n    /** @return Returns the topViewController in stack of topMostWindowController.    */\n    public func currentViewController()->UIViewController? {\n        \n        var currentViewController = topMostWindowController()\n        \n        while currentViewController != nil && currentViewController is UINavigationController && (currentViewController as! UINavigationController).topViewController != nil {\n            currentViewController = (currentViewController as! UINavigationController).topViewController\n        }\n\n        return currentViewController\n    }\n}\n"
  },
  {
    "path": "Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Constants/IQKeyboardManagerConstants.swift",
    "content": "//\n//  IQKeyboardManagerConstants.swift\n// https://github.com/hackiftekhar/IQKeyboardManager\n// Copyright (c) 2013-16 Iftekhar Qurashi.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nimport Foundation\n\n///-----------------------------------\n/// MARK: IQAutoToolbarManageBehaviour\n///-----------------------------------\n\n/**\n`IQAutoToolbarBySubviews`\nCreates Toolbar according to subview's hirarchy of Textfield's in view.\n\n`IQAutoToolbarByTag`\nCreates Toolbar according to tag property of TextField's.\n\n`IQAutoToolbarByPosition`\nCreates Toolbar according to the y,x position of textField in it's superview coordinate.\n*/\npublic enum IQAutoToolbarManageBehaviour : Int {\n    case bySubviews\n    case byTag\n    case byPosition\n}\n\n/**\n `IQPreviousNextDisplayModeDefault`\n Show NextPrevious when there are more than 1 textField otherwise hide.\n \n `IQPreviousNextDisplayModeAlwaysHide`\n Do not show NextPrevious buttons in any case.\n \n `IQPreviousNextDisplayModeAlwaysShow`\n Always show nextPrevious buttons, if there are more than 1 textField then both buttons will be visible but will be shown as disabled.\n */\npublic enum IQPreviousNextDisplayMode : Int {\n    case Default\n    case alwaysHide\n    case alwaysShow\n}\n\n/*\n \n /---------------------------------------------------------------------------------------------------\\\n \\---------------------------------------------------------------------------------------------------/\n |                                   iOS Notification Mechanism                                    |\n /---------------------------------------------------------------------------------------------------\\\n \\---------------------------------------------------------------------------------------------------/\n \n \n ------------------------------------------------------------\n When UITextField become first responder\n ------------------------------------------------------------\n - UITextFieldTextDidBeginEditingNotification (UITextField)\n - UIKeyboardWillShowNotification\n - UIKeyboardDidShowNotification\n \n ------------------------------------------------------------\n When UITextView become first responder\n ------------------------------------------------------------\n - UIKeyboardWillShowNotification\n - UITextViewTextDidBeginEditingNotification (UITextView)\n - UIKeyboardDidShowNotification\n \n ------------------------------------------------------------\n When switching focus from UITextField to another UITextField\n ------------------------------------------------------------\n - UITextFieldTextDidEndEditingNotification (UITextField1)\n - UITextFieldTextDidBeginEditingNotification (UITextField2)\n - UIKeyboardWillShowNotification\n - UIKeyboardDidShowNotification\n \n ------------------------------------------------------------\n When switching focus from UITextView to another UITextView\n ------------------------------------------------------------\n - UITextViewTextDidEndEditingNotification : (UITextView1)\n - UIKeyboardWillShowNotification\n - UITextViewTextDidBeginEditingNotification : (UITextView2)\n - UIKeyboardDidShowNotification\n \n ------------------------------------------------------------\n When switching focus from UITextField to UITextView\n ------------------------------------------------------------\n - UITextFieldTextDidEndEditingNotification (UITextField)\n - UIKeyboardWillShowNotification\n - UITextViewTextDidBeginEditingNotification (UITextView)\n - UIKeyboardDidShowNotification\n \n ------------------------------------------------------------\n When switching focus from UITextView to UITextField\n ------------------------------------------------------------\n - UITextViewTextDidEndEditingNotification (UITextView)\n - UITextFieldTextDidBeginEditingNotification (UITextField)\n - UIKeyboardWillShowNotification\n - UIKeyboardDidShowNotification\n \n ------------------------------------------------------------\n When opening/closing UIKeyboard Predictive bar\n ------------------------------------------------------------\n - UIKeyboardWillShowNotification\n - UIKeyboardDidShowNotification\n \n ------------------------------------------------------------\n On orientation change\n ------------------------------------------------------------\n - UIApplicationWillChangeStatusBarOrientationNotification\n - UIKeyboardWillHideNotification\n - UIKeyboardDidHideNotification\n - UIApplicationDidChangeStatusBarOrientationNotification\n - UIKeyboardWillShowNotification\n - UIKeyboardDidShowNotification\n - UIKeyboardWillShowNotification\n - UIKeyboardDidShowNotification\n \n */\n"
  },
  {
    "path": "Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Constants/IQKeyboardManagerConstantsInternal.swift",
    "content": "//\n//  IQKeyboardManagerConstantsInternal.swift\n// https://github.com/hackiftekhar/IQKeyboardManager\n// Copyright (c) 2013-16 Iftekhar Qurashi.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nimport Foundation\n\n///-----------------------------------\n/// MARK: IQLayoutGuidePosition\n///-----------------------------------\n\n/**\n`IQLayoutGuidePositionNone`\nIf there are no IQLayoutGuideConstraint associated with viewController\n\n`IQLayoutGuidePositionTop`\nIf provided IQLayoutGuideConstraint is associated with with viewController topLayoutGuide\n\n`IQLayoutGuidePositionBottom`\nIf provided IQLayoutGuideConstraint is associated with with viewController bottomLayoutGuide\n*/\nenum IQLayoutGuidePosition : Int {\n    case none\n    case top\n    case bottom\n}\n"
  },
  {
    "path": "Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager.swift",
    "content": "//\n//  IQKeyboardManager.swift\n// https://github.com/hackiftekhar/IQKeyboardManager\n// Copyright (c) 2013-16 Iftekhar Qurashi.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nimport Foundation\nimport CoreGraphics\nimport UIKit\nimport QuartzCore\n\n///---------------------\n/// MARK: IQToolbar tags\n///---------------------\n\n/**\nCodeless drop-in universal library allows to prevent issues of keyboard sliding up and cover UITextField/UITextView. Neither need to write any code nor any setup required and much more. A generic version of KeyboardManagement. https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html\n*/\n\nopen class IQKeyboardManager: NSObject, UIGestureRecognizerDelegate {\n    \n    /**\n    Default tag for toolbar with Done button   -1002.\n    */\n    fileprivate static let  kIQDoneButtonToolbarTag         =   -1002\n    \n    /**\n    Default tag for toolbar with Previous/Next buttons -1005.\n    */\n    fileprivate static let  kIQPreviousNextButtonToolbarTag =   -1005\n    \n    ///---------------------------\n    ///  MARK: UIKeyboard handling\n    ///---------------------------\n    \n    /**\n     Registered classes list with library.\n     */\n    fileprivate var registeredClasses  = [UIView.Type]()\n    \n    /**\n    Enable/disable managing distance between keyboard and textField. Default is YES(Enabled when class loads in `+(void)load` method).\n    */\n    open var enable = false {\n        \n        didSet {\n            //If not enable, enable it.\n            if enable == true &&\n                oldValue == false {\n                //If keyboard is currently showing. Sending a fake notification for keyboardWillShow to adjust view according to keyboard.\n                if _kbShowNotification != nil {\n                    keyboardWillShow(_kbShowNotification)\n                }\n                showLog(\"Enabled\")\n            } else if enable == false &&\n                oldValue == true {   //If not disable, desable it.\n                keyboardWillHide(nil)\n                showLog(\"Disabled\")\n            }\n        }\n    }\n    \n    fileprivate func privateIsEnabled()-> Bool {\n        \n        var isEnabled = enable\n        \n        if let textFieldViewController = _textFieldView?.viewController() {\n            \n            if isEnabled == false {\n                \n                //If viewController is kind of enable viewController class, then assuming it's enabled.\n                for enabledClass in enabledDistanceHandlingClasses {\n                    \n                    if textFieldViewController.isKind(of: enabledClass) {\n                        isEnabled = true\n                        break\n                    }\n                }\n            }\n            \n            if isEnabled == true {\n                \n                //If viewController is kind of disabled viewController class, then assuming it's disabled.\n                for disabledClass in disabledDistanceHandlingClasses {\n                    \n                    if textFieldViewController.isKind(of: disabledClass) {\n                        isEnabled = false\n                        break\n                    }\n                }\n                \n                //Special Controllers\n                if isEnabled == true {\n                    \n                    let classNameString = NSStringFromClass(type(of:textFieldViewController.self))\n                    \n                    //_UIAlertControllerTextFieldViewController\n                    if (classNameString.contains(\"UIAlertController\") && classNameString.hasSuffix(\"TextFieldViewController\")) {\n                        isEnabled = false\n                    }\n                }\n            }\n        }\n        \n        return isEnabled\n    }\n    \n    /**\n    To set keyboard distance from textField. can't be less than zero. Default is 10.0.\n    */\n    open var keyboardDistanceFromTextField: CGFloat {\n        \n        set {\n            _privateKeyboardDistanceFromTextField =  max(0, newValue)\n            showLog(\"keyboardDistanceFromTextField: \\(_privateKeyboardDistanceFromTextField)\")\n        }\n        get {\n            return _privateKeyboardDistanceFromTextField\n        }\n    }\n    \n    /**\n     Boolean to know if keyboard is showing.\n     */\n    open var keyboardShowing: Bool {\n        \n        get {\n            return _privateIsKeyboardShowing\n        }\n    }\n    \n    /**\n     moved distance to the top used to maintain distance between keyboard and textField. Most of the time this will be a positive value.\n     */\n    open var movedDistance: CGFloat {\n        \n        get {\n            return _privateMovedDistance\n        }\n    }\n\n    /**\n    Prevent keyboard manager to slide up the rootView to more than keyboard height. Default is YES.\n    */\n    open var preventShowingBottomBlankSpace = true\n    \n    /**\n    Returns the default singleton instance.\n    */\n    @objc open class func sharedManager() -> IQKeyboardManager {\n        \n        struct Static {\n            //Singleton instance. Initializing keyboard manger.\n            static let kbManager = IQKeyboardManager()\n        }\n        \n        /** @return Returns the default singleton instance. */\n        return Static.kbManager\n    }\n    \n    ///-------------------------\n    /// MARK: IQToolbar handling\n    ///-------------------------\n    \n    /**\n    Automatic add the IQToolbar functionality. Default is YES.\n    */\n    open var enableAutoToolbar = true {\n        \n        didSet {\n\n            privateIsEnableAutoToolbar() ?addToolbarIfRequired():removeToolbarIfRequired()\n\n            let enableToolbar = enableAutoToolbar ? \"Yes\" : \"NO\"\n\n            showLog(\"enableAutoToolbar: \\(enableToolbar)\")\n        }\n    }\n    \n    fileprivate func privateIsEnableAutoToolbar() -> Bool {\n        \n        var enableToolbar = enableAutoToolbar\n        \n        if let textFieldViewController = _textFieldView?.viewController() {\n            \n            if enableToolbar == false {\n                \n                //If found any toolbar enabled classes then return.\n                for enabledClass in enabledToolbarClasses {\n                    \n                    if textFieldViewController.isKind(of: enabledClass) {\n                        enableToolbar = true\n                        break\n                    }\n                }\n            }\n            \n            if enableToolbar == true {\n                \n                //If found any toolbar disabled classes then return.\n                for disabledClass in disabledToolbarClasses {\n                    \n                    if textFieldViewController.isKind(of: disabledClass) {\n                        enableToolbar = false\n                        break\n                    }\n                }\n                \n                //Special Controllers\n                if enableToolbar == true {\n                    \n                    let classNameString = NSStringFromClass(type(of:textFieldViewController.self))\n                    \n                    //_UIAlertControllerTextFieldViewController\n                    if (classNameString.contains(\"UIAlertController\") && classNameString.hasSuffix(\"TextFieldViewController\")) {\n                        enableToolbar = false\n                    }\n                }\n            }\n        }\n\n        return enableToolbar\n    }\n\n    /**\n     /**\n     IQAutoToolbarBySubviews:   Creates Toolbar according to subview's hirarchy of Textfield's in view.\n     IQAutoToolbarByTag:        Creates Toolbar according to tag property of TextField's.\n     IQAutoToolbarByPosition:   Creates Toolbar according to the y,x position of textField in it's superview coordinate.\n     \n     Default is IQAutoToolbarBySubviews.\n     */\n    AutoToolbar managing behaviour. Default is IQAutoToolbarBySubviews.\n    */\n    open var toolbarManageBehaviour = IQAutoToolbarManageBehaviour.bySubviews\n\n    /**\n    If YES, then uses textField's tintColor property for IQToolbar, otherwise tint color is black. Default is NO.\n    */\n    open var shouldToolbarUsesTextFieldTintColor = false\n    \n    /**\n    This is used for toolbar.tintColor when textfield.keyboardAppearance is UIKeyboardAppearanceDefault. If shouldToolbarUsesTextFieldTintColor is YES then this property is ignored. Default is nil and uses black color.\n    */\n    open var toolbarTintColor : UIColor?\n\n    /**\n     This is used for toolbar.barTintColor. Default is nil and uses white color.\n     */\n    open var toolbarBarTintColor : UIColor?\n\n    /**\n     IQPreviousNextDisplayModeDefault:      Show NextPrevious when there are more than 1 textField otherwise hide.\n     IQPreviousNextDisplayModeAlwaysHide:   Do not show NextPrevious buttons in any case.\n     IQPreviousNextDisplayModeAlwaysShow:   Always show nextPrevious buttons, if there are more than 1 textField then both buttons will be visible but will be shown as disabled.\n     */\n    open var previousNextDisplayMode = IQPreviousNextDisplayMode.Default\n\n    /**\n     Toolbar done button icon, If nothing is provided then check toolbarDoneBarButtonItemText to draw done button.\n     */\n    open var toolbarDoneBarButtonItemImage : UIImage?\n    \n    /**\n     Toolbar done button text, If nothing is provided then system default 'UIBarButtonSystemItemDone' will be used.\n     */\n    open var toolbarDoneBarButtonItemText : String?\n\n    /**\n    If YES, then it add the textField's placeholder text on IQToolbar. Default is YES.\n    */\n    @available(*,deprecated, message: \"This is renamed to `shouldShowToolbarPlaceholder` for more clear naming.\")\n    open var shouldShowTextFieldPlaceholder: Bool {\n        \n        set {\n            shouldShowToolbarPlaceholder =  newValue\n        }\n        get {\n            return shouldShowToolbarPlaceholder\n        }\n    }\n    open var shouldShowToolbarPlaceholder = true\n\n    /**\n    Placeholder Font. Default is nil.\n    */\n    open var placeholderFont: UIFont?\n    \n    \n    ///--------------------------\n    /// MARK: UITextView handling\n    ///--------------------------\n    \n    /** used to adjust contentInset of UITextView. */\n    fileprivate var         startingTextViewContentInsets = UIEdgeInsets.zero\n    \n    /** used to adjust scrollIndicatorInsets of UITextView. */\n    fileprivate var         startingTextViewScrollIndicatorInsets = UIEdgeInsets.zero\n    \n    /** used with textView to detect a textFieldView contentInset is changed or not. (Bug ID: #92)*/\n    fileprivate var         isTextViewContentInsetChanged = false\n        \n\n    ///---------------------------------------\n    /// MARK: UIKeyboard appearance overriding\n    ///---------------------------------------\n\n    /**\n    Override the keyboardAppearance for all textField/textView. Default is NO.\n    */\n    open var overrideKeyboardAppearance = false\n    \n    /**\n    If overrideKeyboardAppearance is YES, then all the textField keyboardAppearance is set using this property.\n    */\n    open var keyboardAppearance = UIKeyboardAppearance.default\n\n    \n    ///-----------------------------------------------------------\n    /// MARK: UITextField/UITextView Next/Previous/Resign handling\n    ///-----------------------------------------------------------\n    \n    \n    /**\n    Resigns Keyboard on touching outside of UITextField/View. Default is NO.\n    */\n    open var shouldResignOnTouchOutside = false {\n        \n        didSet {\n            _tapGesture.isEnabled = privateShouldResignOnTouchOutside()\n            \n            let shouldResign = shouldResignOnTouchOutside ? \"Yes\" : \"NO\"\n            \n            showLog(\"shouldResignOnTouchOutside: \\(shouldResign)\")\n        }\n    }\n    \n    /** TapGesture to resign keyboard on view's touch. It's a readonly property and exposed only for adding/removing dependencies if your added gesture does have collision with this one */\n    fileprivate var _tapGesture: UITapGestureRecognizer!\n    open var resignFirstResponderGesture: UITapGestureRecognizer {\n        get {\n            return _tapGesture\n        }\n    }\n    \n    /*******************************************/\n    \n    fileprivate func privateShouldResignOnTouchOutside() -> Bool {\n        \n        var shouldResign = shouldResignOnTouchOutside\n        \n        if let textFieldViewController = _textFieldView?.viewController() {\n            \n            if shouldResign == false {\n                \n                //If viewController is kind of enable viewController class, then assuming shouldResignOnTouchOutside is enabled.\n                for enabledClass in enabledTouchResignedClasses {\n                    \n                    if textFieldViewController.isKind(of: enabledClass) {\n                        shouldResign = true\n                        break\n                    }\n                }\n            }\n            \n            if shouldResign == true {\n                \n                //If viewController is kind of disable viewController class, then assuming shouldResignOnTouchOutside is disable.\n                for disabledClass in disabledTouchResignedClasses {\n                    \n                    if textFieldViewController.isKind(of: disabledClass) {\n                        shouldResign = false\n                        break\n                    }\n                }\n                \n                //Special Controllers\n                if shouldResign == true {\n                    \n                    let classNameString = NSStringFromClass(type(of:textFieldViewController.self))\n                    \n                    //_UIAlertControllerTextFieldViewController\n                    if (classNameString.contains(\"UIAlertController\") && classNameString.hasSuffix(\"TextFieldViewController\")) {\n                        shouldResign = false\n                    }\n                }\n            }\n        }\n        \n        return shouldResign\n    }\n    \n    /**\n    Resigns currently first responder field.\n    */\n    @discardableResult open func resignFirstResponder()-> Bool {\n        \n        if let textFieldRetain = _textFieldView {\n            \n            //Resigning first responder\n            let isResignFirstResponder = textFieldRetain.resignFirstResponder()\n            \n            //  If it refuses then becoming it as first responder again.    (Bug ID: #96)\n            if isResignFirstResponder == false {\n                //If it refuses to resign then becoming it first responder again for getting notifications callback.\n                textFieldRetain.becomeFirstResponder()\n                \n                showLog(\"Refuses to resign first responder: \\(String(describing: _textFieldView?._IQDescription()))\")\n            }\n            \n            return isResignFirstResponder\n        }\n        \n        return false\n    }\n    \n    /**\n    Returns YES if can navigate to previous responder textField/textView, otherwise NO.\n    */\n    @objc open var canGoPrevious: Bool {\n        //Getting all responder view's.\n        if let textFields = responderViews() {\n            if let  textFieldRetain = _textFieldView {\n                \n                //Getting index of current textField.\n                if let index = textFields.index(of: textFieldRetain) {\n                    \n                    //If it is not first textField. then it's previous object canBecomeFirstResponder.\n                    if index > 0 {\n                        return true\n                    }\n                }\n            }\n        }\n        return false\n    }\n    \n    /**\n    Returns YES if can navigate to next responder textField/textView, otherwise NO.\n    */\n    @objc open var canGoNext: Bool {\n        //Getting all responder view's.\n        if let textFields = responderViews() {\n            if let  textFieldRetain = _textFieldView {\n                //Getting index of current textField.\n                if let index = textFields.index(of: textFieldRetain) {\n                    \n                    //If it is not first textField. then it's previous object canBecomeFirstResponder.\n                    if index < textFields.count-1 {\n                        return true\n                    }\n                }\n            }\n        }\n        return false\n    }\n    \n    /**\n    Navigate to previous responder textField/textView.\n    */\n    @objc @discardableResult open func goPrevious()-> Bool {\n        \n        //Getting all responder view's.\n        if let  textFieldRetain = _textFieldView {\n            if let textFields = responderViews() {\n                //Getting index of current textField.\n                if let index = textFields.index(of: textFieldRetain) {\n                    \n                    //If it is not first textField. then it's previous object becomeFirstResponder.\n                    if index > 0 {\n                        \n                        let nextTextField = textFields[index-1]\n                        \n                        let isAcceptAsFirstResponder = nextTextField.becomeFirstResponder()\n                        \n                        //  If it refuses then becoming previous textFieldView as first responder again.    (Bug ID: #96)\n                        if isAcceptAsFirstResponder == false {\n                            //If next field refuses to become first responder then restoring old textField as first responder.\n                            textFieldRetain.becomeFirstResponder()\n                            \n                            showLog(\"Refuses to become first responder: \\(nextTextField._IQDescription())\")\n                        }\n                        \n                        return isAcceptAsFirstResponder\n                    }\n                }\n            }\n        }\n        \n        return false\n    }\n    \n    /**\n    Navigate to next responder textField/textView.\n    */\n    @objc @discardableResult open func goNext()-> Bool {\n\n        //Getting all responder view's.\n        if let  textFieldRetain = _textFieldView {\n            if let textFields = responderViews() {\n                //Getting index of current textField.\n                if let index = textFields.index(of: textFieldRetain) {\n                    //If it is not last textField. then it's next object becomeFirstResponder.\n                    if index < textFields.count-1 {\n                        \n                        let nextTextField = textFields[index+1]\n                        \n                        let isAcceptAsFirstResponder = nextTextField.becomeFirstResponder()\n                        \n                        //  If it refuses then becoming previous textFieldView as first responder again.    (Bug ID: #96)\n                        if isAcceptAsFirstResponder == false {\n                            //If next field refuses to become first responder then restoring old textField as first responder.\n                            textFieldRetain.becomeFirstResponder()\n                            \n                            showLog(\"Refuses to become first responder: \\(nextTextField._IQDescription())\")\n                        }\n                        \n                        return isAcceptAsFirstResponder\n                    }\n                }\n            }\n        }\n\n        return false\n    }\n    \n    /**\tpreviousAction. */\n    @objc internal func previousAction (_ barButton : IQBarButtonItem) {\n        \n        //If user wants to play input Click sound.\n        if shouldPlayInputClicks == true {\n            //Play Input Click Sound.\n            UIDevice.current.playInputClick()\n        }\n        \n        if canGoPrevious == true {\n            \n            if let textFieldRetain = _textFieldView {\n                let isAcceptAsFirstResponder = goPrevious()\n                \n                if isAcceptAsFirstResponder &&\n                    barButton.invocation.target != nil &&\n                    barButton.invocation.action != nil {\n                    \n                    UIApplication.shared.sendAction(barButton.invocation.action!, to: barButton.invocation.target, from: textFieldRetain, for: UIEvent())\n                }\n            }\n        }\n    }\n    \n    /**\tnextAction. */\n    @objc internal func nextAction (_ barButton : IQBarButtonItem) {\n        \n        //If user wants to play input Click sound.\n        if shouldPlayInputClicks == true {\n            //Play Input Click Sound.\n            UIDevice.current.playInputClick()\n        }\n        \n        if canGoNext == true {\n            \n            if let textFieldRetain = _textFieldView {\n                let isAcceptAsFirstResponder = goNext()\n                \n                if isAcceptAsFirstResponder &&\n                    barButton.invocation.target != nil &&\n                    barButton.invocation.action != nil {\n                    \n                    UIApplication.shared.sendAction(barButton.invocation.action!, to: barButton.invocation.target, from: textFieldRetain, for: UIEvent())\n                }\n            }\n        }\n    }\n    \n    /**\tdoneAction. Resigning current textField. */\n    @objc internal func doneAction (_ barButton : IQBarButtonItem) {\n        \n        //If user wants to play input Click sound.\n        if shouldPlayInputClicks == true {\n            //Play Input Click Sound.\n            UIDevice.current.playInputClick()\n        }\n        \n        if let textFieldRetain = _textFieldView {\n            //Resign textFieldView.\n            let isResignedFirstResponder = resignFirstResponder()\n            \n            if isResignedFirstResponder &&\n                barButton.invocation.target != nil &&\n                barButton.invocation.action != nil{\n                \n                UIApplication.shared.sendAction(barButton.invocation.action!, to: barButton.invocation.target, from: textFieldRetain, for: UIEvent())\n            }\n        }\n    }\n    \n    /** Resigning on tap gesture.   (Enhancement ID: #14)*/\n    @objc internal func tapRecognized(_ gesture: UITapGestureRecognizer) {\n        \n        if gesture.state == UIGestureRecognizerState.ended {\n\n            //Resigning currently responder textField.\n            _ = resignFirstResponder()\n        }\n    }\n    \n    /** Note: returning YES is guaranteed to allow simultaneous recognition. returning NO is not guaranteed to prevent simultaneous recognition, as the other gesture's delegate may return YES. */\n    open func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {\n        return false\n    }\n    \n    /** To not detect touch events in a subclass of UIControl, these may have added their own selector for specific work */\n    open func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {\n        //  Should not recognize gesture if the clicked view is either UIControl or UINavigationBar(<Back button etc...)    (Bug ID: #145)\n        \n        for ignoreClass in touchResignedGestureIgnoreClasses {\n            \n            if touch.view?.isKind(of: ignoreClass) == true {\n                return false\n            }\n        }\n\n        return true\n    }\n    \n    ///-----------------------\n    /// MARK: UISound handling\n    ///-----------------------\n\n    /**\n    If YES, then it plays inputClick sound on next/previous/done click.\n    */\n    open var shouldPlayInputClicks = true\n    \n    \n    ///---------------------------\n    /// MARK: UIAnimation handling\n    ///---------------------------\n\n    /**\n    If YES, then calls 'setNeedsLayout' and 'layoutIfNeeded' on any frame update of to viewController's view.\n    */\n    open var layoutIfNeededOnUpdate = false\n\n    ///-----------------------------------------------\n    /// @name InteractivePopGestureRecognizer handling\n    ///-----------------------------------------------\n    \n    /**\n     If YES, then always consider UINavigationController.view begin point as {0,0}, this is a workaround to fix a bug #464 because there are no notification mechanism exist when UINavigationController.view.frame gets changed internally.\n     */\n    open var shouldFixInteractivePopGestureRecognizer = true\n    \n#if swift(>=3.2)\n    ///------------------------------------\n    /// MARK: Safe Area\n    ///------------------------------------\n\n    /**\n     If YES, then library will try to adjust viewController.additionalSafeAreaInsets to automatically handle layout guide. Default is NO.\n     */\n    open var canAdjustAdditionalSafeAreaInsets = false\n#endif\n\n    ///------------------------------------\n    /// MARK: Class Level disabling methods\n    ///------------------------------------\n    \n    /**\n     Disable distance handling within the scope of disabled distance handling viewControllers classes. Within this scope, 'enabled' property is ignored. Class should be kind of UIViewController.\n     */\n    open var disabledDistanceHandlingClasses  = [UIViewController.Type]()\n    \n    /**\n     Enable distance handling within the scope of enabled distance handling viewControllers classes. Within this scope, 'enabled' property is ignored. Class should be kind of UIViewController. If same Class is added in disabledDistanceHandlingClasses list, then enabledDistanceHandlingClasses will be ignored.\n     */\n    open var enabledDistanceHandlingClasses  = [UIViewController.Type]()\n    \n    /**\n     Disable automatic toolbar creation within the scope of disabled toolbar viewControllers classes. Within this scope, 'enableAutoToolbar' property is ignored. Class should be kind of UIViewController.\n     */\n    open var disabledToolbarClasses  = [UIViewController.Type]()\n    \n    /**\n     Enable automatic toolbar creation within the scope of enabled toolbar viewControllers classes. Within this scope, 'enableAutoToolbar' property is ignored. Class should be kind of UIViewController. If same Class is added in disabledToolbarClasses list, then enabledToolbarClasses will be ignore.\n     */\n    open var enabledToolbarClasses  = [UIViewController.Type]()\n\n    /**\n     Allowed subclasses of UIView to add all inner textField, this will allow to navigate between textField contains in different superview. Class should be kind of UIView.\n     */\n    open var toolbarPreviousNextAllowedClasses  = [UIView.Type]()\n    \n    /**\n     Disabled classes to ignore 'shouldResignOnTouchOutside' property, Class should be kind of UIViewController.\n     */\n    open var disabledTouchResignedClasses  = [UIViewController.Type]()\n    \n    /**\n     Enabled classes to forcefully enable 'shouldResignOnTouchOutsite' property. Class should be kind of UIViewController. If same Class is added in disabledTouchResignedClasses list, then enabledTouchResignedClasses will be ignored.\n     */\n    open var enabledTouchResignedClasses  = [UIViewController.Type]()\n    \n    /**\n     if shouldResignOnTouchOutside is enabled then you can customise the behaviour to not recognise gesture touches on some specific view subclasses. Class should be kind of UIView. Default is [UIControl, UINavigationBar]\n     */\n    open var touchResignedGestureIgnoreClasses  = [UIView.Type]()    \n\n    ///-------------------------------------------\n    /// MARK: Third Party Library support\n    /// Add TextField/TextView Notifications customised Notifications. For example while using YYTextView https://github.com/ibireme/YYText\n    ///-------------------------------------------\n    \n    /**\n    Add/Remove customised Notification for third party customised TextField/TextView. Please be aware that the Notification object must be idential to UITextField/UITextView Notification objects and customised TextField/TextView support must be idential to UITextField/UITextView.\n    @param didBeginEditingNotificationName This should be identical to UITextViewTextDidBeginEditingNotification\n    @param didEndEditingNotificationName This should be identical to UITextViewTextDidEndEditingNotification\n    */\n    \n    open func registerTextFieldViewClass(_ aClass: UIView.Type, didBeginEditingNotificationName : String, didEndEditingNotificationName : String) {\n        \n        registeredClasses.append(aClass)\n\n        NotificationCenter.default.addObserver(self, selector: #selector(self.textFieldViewDidBeginEditing(_:)),    name: Notification.Name(rawValue: didBeginEditingNotificationName), object: nil)\n        NotificationCenter.default.addObserver(self, selector: #selector(self.textFieldViewDidEndEditing(_:)),      name: Notification.Name(rawValue: didEndEditingNotificationName), object: nil)\n    }\n    \n    open func unregisterTextFieldViewClass(_ aClass: UIView.Type, didBeginEditingNotificationName : String, didEndEditingNotificationName : String) {\n        \n        if let index = registeredClasses.index(where: { element in\n            return element == aClass.self\n        }) {\n            registeredClasses.remove(at: index)\n        }\n\n        NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: didBeginEditingNotificationName), object: nil)\n        NotificationCenter.default.removeObserver(self, name: Notification.Name(rawValue: didEndEditingNotificationName), object: nil)\n    }\n    \n    /**************************************************************************************/\n    ///------------------------\n    /// MARK: Private variables\n    ///------------------------\n\n    /*******************************************/\n\n    /** To save UITextField/UITextView object voa textField/textView notifications. */\n    fileprivate weak var    _textFieldView: UIView?\n    \n    /** To save rootViewController.view.frame. */\n    fileprivate var         _topViewBeginRect = CGRect.zero\n    \n    /** To save rootViewController */\n    fileprivate weak var    _rootViewController: UIViewController?\n    \n#if swift(>=3.2)\n    /** To save additionalSafeAreaInsets of rootViewController to tweak iOS11 Safe Area */\n    fileprivate var         _initialAdditionalSafeAreaInsets = UIEdgeInsets.zero\n#endif\n\n    /** To save topBottomLayoutConstraint original constant */\n    fileprivate var         _layoutGuideConstraintInitialConstant: CGFloat  = 0\n\n    /** To save topBottomLayoutConstraint original constraint reference */\n    fileprivate weak var    _layoutGuideConstraint: NSLayoutConstraint?\n\n    /*******************************************/\n\n    /** Variable to save lastScrollView that was scrolled. */\n    fileprivate weak var    _lastScrollView: UIScrollView?\n    \n    /** LastScrollView's initial contentOffset. */\n    fileprivate var         _startingContentOffset = CGPoint.zero\n    \n    /** LastScrollView's initial scrollIndicatorInsets. */\n    fileprivate var         _startingScrollIndicatorInsets = UIEdgeInsets.zero\n    \n    /** LastScrollView's initial contentInsets. */\n    fileprivate var         _startingContentInsets = UIEdgeInsets.zero\n    \n    /*******************************************/\n\n    /** To save keyboardWillShowNotification. Needed for enable keyboard functionality. */\n    fileprivate var         _kbShowNotification: Notification?\n    \n    /** To save keyboard size. */\n    fileprivate var         _kbSize = CGSize.zero\n    \n    /** To save Status Bar size. */\n    fileprivate var         _statusBarFrame = CGRect.zero\n    \n    /** To save keyboard animation duration. */\n    fileprivate var         _animationDuration : TimeInterval = 0.25\n    \n    /** To mimic the keyboard animation */\n    fileprivate var         _animationCurve = UIViewAnimationOptions.curveEaseOut\n    \n    /*******************************************/\n\n    /** Boolean to maintain keyboard is showing or it is hide. To solve rootViewController.view.frame calculations. */\n    fileprivate var         _privateIsKeyboardShowing = false\n\n    fileprivate var         _privateMovedDistance : CGFloat = 0.0\n    \n    /** To use with keyboardDistanceFromTextField. */\n    fileprivate var         _privateKeyboardDistanceFromTextField: CGFloat = 10.0\n    \n    /**************************************************************************************/\n    \n    ///--------------------------------------\n    /// MARK: Initialization/Deinitialization\n    ///--------------------------------------\n    \n    /*  Singleton Object Initialization. */\n    override init() {\n        \n        super.init()\n\n        self.registerAllNotifications()\n\n        //Creating gesture for @shouldResignOnTouchOutside. (Enhancement ID: #14)\n        _tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.tapRecognized(_:)))\n        _tapGesture.cancelsTouchesInView = false\n        _tapGesture.delegate = self\n        _tapGesture.isEnabled = shouldResignOnTouchOutside\n        \n        //Loading IQToolbar, IQTitleBarButtonItem, IQBarButtonItem to fix first time keyboard appearance delay (Bug ID: #550)\n        let textField = UITextField()\n        textField.addDoneOnKeyboardWithTarget(nil, action: #selector(self.doneAction(_:)))\n        textField.addPreviousNextDoneOnKeyboardWithTarget(nil, previousAction: #selector(self.previousAction(_:)), nextAction: #selector(self.nextAction(_:)), doneAction: #selector(self.doneAction(_:)))\n        \n        disabledDistanceHandlingClasses.append(UITableViewController.self)\n        disabledDistanceHandlingClasses.append(UIAlertController.self)\n        disabledToolbarClasses.append(UIAlertController.self)\n        disabledTouchResignedClasses.append(UIAlertController.self)\n        toolbarPreviousNextAllowedClasses.append(UITableView.self)\n        toolbarPreviousNextAllowedClasses.append(UICollectionView.self)\n        toolbarPreviousNextAllowedClasses.append(IQPreviousNextView.self)\n        touchResignedGestureIgnoreClasses.append(UIControl.self)\n        touchResignedGestureIgnoreClasses.append(UINavigationBar.self)\n    }\n    \n    /** Override +load method to enable KeyboardManager when class loader load IQKeyboardManager. Enabling when app starts (No need to write any code) */\n    /** It doesn't work from Swift 1.2 */\n//    override public class func load() {\n//        super.load()\n//        \n//        //Enabling IQKeyboardManager.\n//        IQKeyboardManager.sharedManager().enable = true\n//    }\n    \n    deinit {\n        //  Disable the keyboard manager.\n        enable = false\n\n        //Removing notification observers on dealloc.\n        NotificationCenter.default.removeObserver(self)\n    }\n    \n    /** Getting keyWindow. */\n    fileprivate func keyWindow() -> UIWindow? {\n        \n        if let keyWindow = _textFieldView?.window {\n            return keyWindow\n        } else {\n            \n            struct Static {\n                /** @abstract   Save keyWindow object for reuse.\n                @discussion Sometimes [[UIApplication sharedApplication] keyWindow] is returning nil between the app.   */\n                static weak var keyWindow : UIWindow?\n            }\n\n            /*  (Bug ID: #23, #25, #73)   */\n            let originalKeyWindow = UIApplication.shared.keyWindow\n            \n            //If original key window is not nil and the cached keywindow is also not original keywindow then changing keywindow.\n            if originalKeyWindow != nil &&\n                (Static.keyWindow == nil || Static.keyWindow != originalKeyWindow) {\n                Static.keyWindow = originalKeyWindow\n            }\n\n            //Return KeyWindow\n            return Static.keyWindow\n        }\n    }\n\n    ///-----------------------\n    /// MARK: Helper Functions\n    ///-----------------------\n    \n    /*  Helper function to manipulate RootViewController's frame with animation. */\n    fileprivate func setRootViewFrame(_ frame: CGRect) {\n        \n        //  Getting topMost ViewController.\n        var controller = _textFieldView?.topMostController()\n        \n        if controller == nil {\n            controller = keyWindow()?.topMostWindowController()\n        }\n        \n        if let unwrappedController = controller {\n            \n            var newFrame = frame\n            //frame size needs to be adjusted on iOS8 due to orientation structure changes.\n            newFrame.size = unwrappedController.view.frame.size\n            \n#if swift(>=3.2)\n    \n            var safeAreaNewInset = UIEdgeInsets.zero;\n\n            if canAdjustAdditionalSafeAreaInsets {\n        \n                if #available(iOS 11, *) {\n                    \n                    if let textFieldView = _textFieldView {\n                        safeAreaNewInset = _initialAdditionalSafeAreaInsets;\n                        let viewMovement : CGFloat = _topViewBeginRect.maxY - newFrame.maxY;\n                        \n                        //Maintain keyboardDistanceFromTextField\n                        var specialKeyboardDistanceFromTextField = textFieldView.keyboardDistanceFromTextField\n                        \n                        if textFieldView.isSearchBarTextField() {\n                            \n                            if  let searchBar = textFieldView.superviewOfClassType(UISearchBar.self) {\n                                specialKeyboardDistanceFromTextField = searchBar.keyboardDistanceFromTextField\n                            }\n                        }\n                        \n                        let newKeyboardDistanceFromTextField = (specialKeyboardDistanceFromTextField == kIQUseDefaultKeyboardDistance) ? keyboardDistanceFromTextField : specialKeyboardDistanceFromTextField\n                        \n                        let textFieldDistance = textFieldView.frame.size.height + newKeyboardDistanceFromTextField;\n                        safeAreaNewInset.bottom += min(viewMovement, textFieldDistance);\n                    }\n                }\n            }\n#endif\n\n            //Used UIViewAnimationOptionBeginFromCurrentState to minimize strange animations.\n            UIView.animate(withDuration: _animationDuration, delay: 0, options: UIViewAnimationOptions.beginFromCurrentState.union(_animationCurve), animations: { () -> Void in\n                \n#if swift(>=3.2)\n                if self.canAdjustAdditionalSafeAreaInsets {\n                    if #available(iOS 11, *) {\n                        unwrappedController.additionalSafeAreaInsets = safeAreaNewInset;\n                    }\n                }\n#endif\n\n                //  Setting it's new frame\n                unwrappedController.view.frame = newFrame\n                self.showLog(\"Set \\(String(describing: controller?._IQDescription())) frame to : \\(newFrame)\")\n                \n                //Animating content if needed (Bug ID: #204)\n                if self.layoutIfNeededOnUpdate == true {\n                    //Animating content (Bug ID: #160)\n                    unwrappedController.view.setNeedsLayout()\n                    unwrappedController.view.layoutIfNeeded()\n                }\n \n                \n                }) { (animated:Bool) -> Void in}\n        } else {  //  If can't get rootViewController then printing warning to user.\n            showLog(\"You must set UIWindow.rootViewController in your AppDelegate to work with IQKeyboardManager\")\n        }\n    }\n\n    /* Adjusting RootViewController's frame according to interface orientation. */\n    fileprivate func adjustFrame() {\n        \n        //  We are unable to get textField object while keyboard showing on UIWebView's textField.  (Bug ID: #11)\n        if _textFieldView == nil {\n            return\n        }\n        \n        let textFieldView = _textFieldView!\n\n        let startTime = CACurrentMediaTime()\n        showLog(\"****** \\(#function) started ******\")\n\n        //  Getting KeyWindow object.\n        let optionalWindow = keyWindow()\n        \n        //  Getting RootViewController.  (Bug ID: #1, #4)\n        var optionalRootController = _textFieldView?.topMostController()\n        if optionalRootController == nil {\n            optionalRootController = keyWindow()?.topMostWindowController()\n        }\n        \n        //  Converting Rectangle according to window bounds.\n        let optionalTextFieldViewRect = textFieldView.superview?.convert(textFieldView.frame, to: optionalWindow)\n\n        if optionalRootController == nil ||\n            optionalWindow == nil ||\n            optionalTextFieldViewRect == nil {\n            return\n        }\n        \n        let rootController = optionalRootController!\n        let window = optionalWindow!\n        let textFieldViewRect = optionalTextFieldViewRect!\n        \n        //  Getting RootViewRect.\n        var rootViewRect = rootController.view.frame\n        //Getting statusBarFrame\n\n        //Maintain keyboardDistanceFromTextField\n        var specialKeyboardDistanceFromTextField = textFieldView.keyboardDistanceFromTextField\n        \n        if textFieldView.isSearchBarTextField() {\n            \n            if  let searchBar = textFieldView.superviewOfClassType(UISearchBar.self) {\n                specialKeyboardDistanceFromTextField = searchBar.keyboardDistanceFromTextField\n            }\n        }\n        \n        let newKeyboardDistanceFromTextField = (specialKeyboardDistanceFromTextField == kIQUseDefaultKeyboardDistance) ? keyboardDistanceFromTextField : specialKeyboardDistanceFromTextField\n        var kbSize = _kbSize\n        kbSize.height += newKeyboardDistanceFromTextField\n\n        let statusBarFrame = UIApplication.shared.statusBarFrame\n        \n        //  (Bug ID: #250)\n        var layoutGuidePosition = IQLayoutGuidePosition.none\n        \n        if let viewController = textFieldView.viewController() {\n            \n            if let constraint = _layoutGuideConstraint {\n                \n                var layoutGuide : UILayoutSupport?\n                if let itemLayoutGuide = constraint.firstItem as? UILayoutSupport {\n                    layoutGuide = itemLayoutGuide\n                } else if let itemLayoutGuide = constraint.secondItem as? UILayoutSupport {\n                    layoutGuide = itemLayoutGuide\n                }\n                \n                if let itemLayoutGuide : UILayoutSupport = layoutGuide {\n                    \n                    if (itemLayoutGuide === viewController.topLayoutGuide)    //If topLayoutGuide constraint\n                    {\n                        layoutGuidePosition = .top\n                    }\n                    else if (itemLayoutGuide === viewController.bottomLayoutGuide)    //If bottomLayoutGuice constraint\n                    {\n                        layoutGuidePosition = .bottom\n                    }\n                }\n            }\n        }\n        \n        let topLayoutGuide : CGFloat = statusBarFrame.height\n\n        var move : CGFloat = 0.0\n        //  Move positive = textField is hidden.\n        //  Move negative = textField is showing.\n        \n        //  Checking if there is bottomLayoutGuide attached (Bug ID: #250)\n        if layoutGuidePosition == .bottom {\n            //  Calculating move position.\n            move = textFieldViewRect.maxY-(window.frame.height-kbSize.height)\n        } else {\n            //  Calculating move position. Common for both normal and special cases.\n            move = min(textFieldViewRect.minY-(topLayoutGuide+5), textFieldViewRect.maxY-(window.frame.height-kbSize.height))\n        }\n        \n        showLog(\"Need to move: \\(move)\")\n\n        var superScrollView : UIScrollView? = nil\n        var superView = textFieldView.superviewOfClassType(UIScrollView.self) as? UIScrollView\n        \n        //Getting UIScrollView whose scrolling is enabled.    //  (Bug ID: #285)\n        while let view = superView {\n            \n            if (view.isScrollEnabled && view.shouldIgnoreScrollingAdjustment == false) {\n                superScrollView = view\n                break\n            }\n            else {\n                //  Getting it's superScrollView.   //  (Enhancement ID: #21, #24)\n                superView = view.superviewOfClassType(UIScrollView.self) as? UIScrollView\n            }\n        }\n        \n        //If there was a lastScrollView.    //  (Bug ID: #34)\n        if let lastScrollView = _lastScrollView {\n            //If we can't find current superScrollView, then setting lastScrollView to it's original form.\n            if superScrollView == nil {\n                \n                showLog(\"Restoring \\(lastScrollView._IQDescription()) contentInset to : \\(_startingContentInsets) and contentOffset to : \\(_startingContentOffset)\")\n\n                UIView.animate(withDuration: _animationDuration, delay: 0, options: UIViewAnimationOptions.beginFromCurrentState.union(_animationCurve), animations: { () -> Void in\n                    \n                    lastScrollView.contentInset = self._startingContentInsets\n                    lastScrollView.scrollIndicatorInsets = self._startingScrollIndicatorInsets\n                    }) { (animated:Bool) -> Void in }\n                \n                if lastScrollView.shouldRestoreScrollViewContentOffset == true {\n                    lastScrollView.setContentOffset(_startingContentOffset, animated: true)\n                }\n                \n                _startingContentInsets = UIEdgeInsets.zero\n                _startingScrollIndicatorInsets = UIEdgeInsets.zero\n                _startingContentOffset = CGPoint.zero\n                _lastScrollView = nil\n            } else if superScrollView != lastScrollView {     //If both scrollView's are different, then reset lastScrollView to it's original frame and setting current scrollView as last scrollView.\n                \n                showLog(\"Restoring \\(lastScrollView._IQDescription()) contentInset to : \\(_startingContentInsets) and contentOffset to : \\(_startingContentOffset)\")\n                \n                UIView.animate(withDuration: _animationDuration, delay: 0, options: UIViewAnimationOptions.beginFromCurrentState.union(_animationCurve), animations: { () -> Void in\n                    \n                    lastScrollView.contentInset = self._startingContentInsets\n                    lastScrollView.scrollIndicatorInsets = self._startingScrollIndicatorInsets\n                    }) { (animated:Bool) -> Void in }\n                \n                if lastScrollView.shouldRestoreScrollViewContentOffset == true {\n                    lastScrollView.setContentOffset(_startingContentOffset, animated: true)\n                }\n\n                _lastScrollView = superScrollView\n                _startingContentInsets = superScrollView!.contentInset\n                _startingScrollIndicatorInsets = superScrollView!.scrollIndicatorInsets\n                _startingContentOffset = superScrollView!.contentOffset\n                \n                showLog(\"Saving New \\(lastScrollView._IQDescription()) contentInset : \\(_startingContentInsets) and contentOffset : \\(_startingContentOffset)\")\n            }\n            //Else the case where superScrollView == lastScrollView means we are on same scrollView after switching to different textField. So doing nothing, going ahead\n        } else if let unwrappedSuperScrollView = superScrollView {    //If there was no lastScrollView and we found a current scrollView. then setting it as lastScrollView.\n            _lastScrollView = unwrappedSuperScrollView\n            _startingContentInsets = unwrappedSuperScrollView.contentInset\n            _startingScrollIndicatorInsets = unwrappedSuperScrollView.scrollIndicatorInsets\n            _startingContentOffset = unwrappedSuperScrollView.contentOffset\n\n            showLog(\"Saving \\(unwrappedSuperScrollView._IQDescription()) contentInset : \\(_startingContentInsets) and contentOffset : \\(_startingContentOffset)\")\n        }\n        \n        //  Special case for ScrollView.\n        //  If we found lastScrollView then setting it's contentOffset to show textField.\n        if let lastScrollView = _lastScrollView {\n            //Saving\n            var lastView = textFieldView\n            var superScrollView = _lastScrollView\n            \n            while let scrollView = superScrollView {\n                \n                //Looping in upper hierarchy until we don't found any scrollView in it's upper hirarchy till UIWindow object.\n                if move > 0 ? (move > (-scrollView.contentOffset.y - scrollView.contentInset.top)) : scrollView.contentOffset.y>0 {\n                    \n                    var tempScrollView = scrollView.superviewOfClassType(UIScrollView.self) as? UIScrollView\n                    var nextScrollView : UIScrollView? = nil\n                    while let view = tempScrollView {\n                        \n                        if (view.isScrollEnabled  && view.shouldIgnoreScrollingAdjustment == false) {\n                            nextScrollView = view\n                            break\n                        } else {\n                            tempScrollView = view.superviewOfClassType(UIScrollView.self) as? UIScrollView\n                        }\n                    }\n                    \n                    //Getting lastViewRect.\n                    if let lastViewRect = lastView.superview?.convert(lastView.frame, to: scrollView) {\n                        \n                        //Calculating the expected Y offset from move and scrollView's contentOffset.\n                        var shouldOffsetY = scrollView.contentOffset.y - min(scrollView.contentOffset.y,-move)\n                        \n                        //Rearranging the expected Y offset according to the view.\n                        shouldOffsetY = min(shouldOffsetY, lastViewRect.origin.y /*-5*/)   //-5 is for good UI.//Commenting -5 (Bug ID: #69)\n\n                        //[_textFieldView isKindOfClass:[UITextView class]] If is a UITextView type\n                        //nextScrollView == nil    If processing scrollView is last scrollView in upper hierarchy (there is no other scrollView upper hierrchy.)\n                        //[_textFieldView isKindOfClass:[UITextView class]] If is a UITextView type\n                        //shouldOffsetY >= 0     shouldOffsetY must be greater than in order to keep distance from navigationBar (Bug ID: #92)\n                        if textFieldView is UITextView == true &&\n                            nextScrollView == nil &&\n                            shouldOffsetY >= 0 {\n                            var maintainTopLayout : CGFloat = 0\n                            \n                            if let navigationBarFrame = textFieldView.viewController()?.navigationController?.navigationBar.frame {\n                                maintainTopLayout = navigationBarFrame.maxY\n                            }\n                            \n                            maintainTopLayout += 10.0 //For good UI\n                            \n                            //  Converting Rectangle according to window bounds.\n                            if let currentTextFieldViewRect = textFieldView.superview?.convert(textFieldView.frame, to: window) {\n\n                                //Calculating expected fix distance which needs to be managed from navigation bar\n                                let expectedFixDistance = currentTextFieldViewRect.minY - maintainTopLayout\n                                \n                                //Now if expectedOffsetY (superScrollView.contentOffset.y + expectedFixDistance) is lower than current shouldOffsetY, which means we're in a position where navigationBar up and hide, then reducing shouldOffsetY with expectedOffsetY (superScrollView.contentOffset.y + expectedFixDistance)\n                                shouldOffsetY = min(shouldOffsetY, scrollView.contentOffset.y + expectedFixDistance)\n\n                                //Setting move to 0 because now we don't want to move any view anymore (All will be managed by our contentInset logic.\n                                move = 0\n                            }\n                            else {\n                                //Subtracting the Y offset from the move variable, because we are going to change scrollView's contentOffset.y to shouldOffsetY.\n                                move -= (shouldOffsetY-scrollView.contentOffset.y)\n                            }\n                        }\n                        else\n                        {\n                            //Subtracting the Y offset from the move variable, because we are going to change scrollView's contentOffset.y to shouldOffsetY.\n                            move -= (shouldOffsetY-scrollView.contentOffset.y)\n                        }\n                        \n                        //Getting problem while using `setContentOffset:animated:`, So I used animation API.\n                        UIView.animate(withDuration: _animationDuration, delay: 0, options: UIViewAnimationOptions.beginFromCurrentState.union(_animationCurve), animations: { () -> Void in\n                        \n                            self.showLog(\"Adjusting \\(scrollView.contentOffset.y-shouldOffsetY) to \\(scrollView._IQDescription()) ContentOffset\")\n                            \n                            self.showLog(\"Remaining Move: \\(move)\")\n                            \n                            scrollView.contentOffset = CGPoint(x: scrollView.contentOffset.x, y: shouldOffsetY)\n                            }) { (animated:Bool) -> Void in }\n                    }\n                    \n                    //  Getting next lastView & superScrollView.\n                    lastView = scrollView\n                    superScrollView = nextScrollView\n                } else {\n                    break\n                }\n            }\n            \n            //Updating contentInset\n            if let lastScrollViewRect = lastScrollView.superview?.convert(lastScrollView.frame, to: window) {\n                \n                let bottom : CGFloat = kbSize.height-newKeyboardDistanceFromTextField-(window.frame.height-lastScrollViewRect.maxY)\n                \n                // Update the insets so that the scroll vew doesn't shift incorrectly when the offset is near the bottom of the scroll view.\n                var movedInsets = lastScrollView.contentInset\n                \n                movedInsets.bottom = max(_startingContentInsets.bottom, bottom)\n                \n                showLog(\"\\(lastScrollView._IQDescription()) old ContentInset : \\(lastScrollView.contentInset)\")\n                \n                //Getting problem while using `setContentOffset:animated:`, So I used animation API.\n                UIView.animate(withDuration: _animationDuration, delay: 0, options: UIViewAnimationOptions.beginFromCurrentState.union(_animationCurve), animations: { () -> Void in\n                    lastScrollView.contentInset = movedInsets\n\n                    var newInset = lastScrollView.scrollIndicatorInsets\n                    newInset.bottom = movedInsets.bottom\n                    lastScrollView.scrollIndicatorInsets = newInset\n\n                    }) { (animated:Bool) -> Void in }\n\n                showLog(\"\\(lastScrollView._IQDescription()) new ContentInset : \\(lastScrollView.contentInset)\")\n            }\n        }\n        //Going ahead. No else if.\n        \n        if layoutGuidePosition == .top {\n            \n            if let constraint = _layoutGuideConstraint {\n                \n                let constant = min(_layoutGuideConstraintInitialConstant, constraint.constant-move)\n                \n                UIView.animate(withDuration: _animationDuration, delay: 0, options: (_animationCurve.union(UIViewAnimationOptions.beginFromCurrentState)), animations: { () -> Void in\n                    \n                    constraint.constant = constant\n                    self._rootViewController?.view.setNeedsLayout()\n                    self._rootViewController?.view.layoutIfNeeded()\n                    \n                    }, completion: { (finished) -> Void in })\n            }\n            \n        } else if layoutGuidePosition == .bottom {\n            \n            if let constraint = _layoutGuideConstraint {\n                \n                let constant = max(_layoutGuideConstraintInitialConstant, constraint.constant+move)\n                \n                UIView.animate(withDuration: _animationDuration, delay: 0, options: (_animationCurve.union(UIViewAnimationOptions.beginFromCurrentState)), animations: { () -> Void in\n                    \n                    constraint.constant = constant\n                    self._rootViewController?.view.setNeedsLayout()\n                    self._rootViewController?.view.layoutIfNeeded()\n                    \n                    }, completion: { (finished) -> Void in })\n            }\n            \n        } else {\n            \n            //Special case for UITextView(Readjusting textView.contentInset when textView hight is too big to fit on screen)\n            //_lastScrollView       If not having inside any scrollView, (now contentInset manages the full screen textView.\n            //[_textFieldView isKindOfClass:[UITextView class]] If is a UITextView type\n            if let textView = textFieldView as? UITextView {\n                let textViewHeight = min(textView.frame.height, (window.frame.height-kbSize.height-(topLayoutGuide)))\n                \n                if (textView.frame.size.height-textView.contentInset.bottom>textViewHeight)\n                {\n                    UIView.animate(withDuration: _animationDuration, delay: 0, options: (_animationCurve.union(UIViewAnimationOptions.beginFromCurrentState)), animations: { () -> Void in\n                        \n                        self.showLog(\"\\(textFieldView._IQDescription()) Old UITextView.contentInset : \\(textView.contentInset)\")\n                        \n                        //_isTextViewContentInsetChanged,  If frame is not change by library in past, then saving user textView properties  (Bug ID: #92)\n                        if (self.isTextViewContentInsetChanged == false)\n                        {\n                            self.startingTextViewContentInsets = textView.contentInset\n                            self.startingTextViewScrollIndicatorInsets = textView.scrollIndicatorInsets\n                        }\n                        \n                        var newContentInset = textView.contentInset\n                        newContentInset.bottom = textView.frame.size.height-textViewHeight\n                        textView.contentInset = newContentInset\n                        textView.scrollIndicatorInsets = newContentInset\n                        self.isTextViewContentInsetChanged = true\n                        \n                        self.showLog(\"\\(textFieldView._IQDescription()) Old UITextView.contentInset : \\(textView.contentInset)\")\n                        \n                        \n                        }, completion: { (finished) -> Void in })\n                }\n            }\n\n            //  Special case for iPad modalPresentationStyle.\n            if rootController.modalPresentationStyle == UIModalPresentationStyle.formSheet ||\n                rootController.modalPresentationStyle == UIModalPresentationStyle.pageSheet {\n                \n                showLog(\"Found Special case for Model Presentation Style: \\(rootController.modalPresentationStyle)\")\n                \n                //  +Positive or zero.\n                if move >= 0 {\n                    // We should only manipulate y.\n                    rootViewRect.origin.y -= move\n                    \n                    //  From now prevent keyboard manager to slide up the rootView to more than keyboard height. (Bug ID: #93)\n                    if preventShowingBottomBlankSpace == true {\n                        let minimumY: CGFloat = (window.frame.height-rootViewRect.size.height-topLayoutGuide)/2-(kbSize.height-newKeyboardDistanceFromTextField)\n                        \n                        rootViewRect.origin.y = max(rootViewRect.minY, minimumY)\n                    }\n                    \n                    showLog(\"Moving Upward\")\n                    //  Setting adjusted rootViewRect\n                    setRootViewFrame(rootViewRect)\n                    _privateMovedDistance = (_topViewBeginRect.origin.y-rootViewRect.origin.y)\n                } else {  //  -Negative\n                    //  Calculating disturbed distance. Pull Request #3\n                    let disturbDistance = rootViewRect.minY-_topViewBeginRect.minY\n                    \n                    //  disturbDistance Negative = frame disturbed.\n                    //  disturbDistance positive = frame not disturbed.\n                    if disturbDistance <= 0 {\n                        // We should only manipulate y.\n                        rootViewRect.origin.y -= max(move, disturbDistance)\n                        \n                        showLog(\"Moving Downward\")\n                        //  Setting adjusted rootViewRect\n                        setRootViewFrame(rootViewRect)\n                        _privateMovedDistance = (_topViewBeginRect.origin.y-rootViewRect.origin.y)\n                    }\n                }\n            } else {  //If presentation style is neither UIModalPresentationFormSheet nor UIModalPresentationPageSheet then going ahead.(General case)\n                //  +Positive or zero.\n                if move >= 0 {\n                    \n                    rootViewRect.origin.y -= move\n\n                    //  From now prevent keyboard manager to slide up the rootView to more than keyboard height. (Bug ID: #93)\n                    if preventShowingBottomBlankSpace == true {\n                        \n                        rootViewRect.origin.y = max(rootViewRect.origin.y, min(0, -kbSize.height+newKeyboardDistanceFromTextField))\n                    }\n                    \n                    showLog(\"Moving Upward\")\n                    //  Setting adjusted rootViewRect\n                    setRootViewFrame(rootViewRect)\n                    _privateMovedDistance = (_topViewBeginRect.origin.y-rootViewRect.origin.y)\n                } else {  //  -Negative\n                    let disturbDistance : CGFloat = rootViewRect.minY-_topViewBeginRect.minY\n                    \n                    //  disturbDistance Negative = frame disturbed.\n                    //  disturbDistance positive = frame not disturbed.\n                    if disturbDistance <= 0 {\n                        \n                        rootViewRect.origin.y -= max(move, disturbDistance)\n                        \n                        showLog(\"Moving Downward\")\n                        //  Setting adjusted rootViewRect\n                        //  Setting adjusted rootViewRect\n                        setRootViewFrame(rootViewRect)\n                        _privateMovedDistance = (_topViewBeginRect.origin.y-rootViewRect.origin.y)\n                    }\n                }\n            }\n        }\n\n        let elapsedTime = CACurrentMediaTime() - startTime\n        showLog(\"****** \\(#function) ended: \\(elapsedTime) seconds ******\")\n    }\n\n    ///---------------------\n    /// MARK: Public Methods\n    ///---------------------\n    \n    /*  Refreshes textField/textView position if any external changes is explicitly made by user.   */\n    open func reloadLayoutIfNeeded() -> Void {\n\n        if privateIsEnabled() == true {\n            if _textFieldView != nil &&\n                _privateIsKeyboardShowing == true &&\n                _topViewBeginRect.equalTo(CGRect.zero) == false &&\n                _textFieldView?.isAlertViewTextField() == false {\n                adjustFrame()\n            }\n        }\n    }\n\n    ///-------------------------------\n    /// MARK: UIKeyboard Notifications\n    ///-------------------------------\n\n    /*  UIKeyboardWillShowNotification. */\n    @objc internal func keyboardWillShow(_ notification : Notification?) -> Void {\n        \n        _kbShowNotification = notification\n\n        //  Boolean to know keyboard is showing/hiding\n        _privateIsKeyboardShowing = true\n        \n        let oldKBSize = _kbSize\n\n        if let info = notification?.userInfo {\n            \n            //  Getting keyboard animation.\n            if let curve = info[UIKeyboardAnimationCurveUserInfoKey] as? UInt {\n                _animationCurve = UIViewAnimationOptions(rawValue: curve)\n            } else {\n                _animationCurve = UIViewAnimationOptions.curveEaseOut\n            }\n            \n            //  Getting keyboard animation duration\n            if let duration = info[UIKeyboardAnimationDurationUserInfoKey] as? TimeInterval {\n                \n                //Saving animation duration\n                if duration != 0.0 {\n                    _animationDuration = duration\n                }\n            } else {\n                _animationDuration = 0.25\n            }\n            \n            //  Getting UIKeyboardSize.\n            if let kbFrame = info[UIKeyboardFrameEndUserInfoKey] as? CGRect {\n                \n                let screenSize = UIScreen.main.bounds\n                \n                //Calculating actual keyboard displayed size, keyboard frame may be different when hardware keyboard is attached (Bug ID: #469) (Bug ID: #381)\n                let intersectRect = kbFrame.intersection(screenSize)\n                \n                if intersectRect.isNull {\n                    _kbSize = CGSize(width: screenSize.size.width, height: 0)\n                } else {\n                    _kbSize = intersectRect.size\n                }\n\n                showLog(\"UIKeyboard Size : \\(_kbSize)\")\n            }\n        }\n\n        if privateIsEnabled() == false {\n            return\n        }\n        \n        let startTime = CACurrentMediaTime()\n        showLog(\"****** \\(#function) started ******\")\n\n        //  (Bug ID: #5)\n        if _textFieldView != nil && _topViewBeginRect.equalTo(CGRect.zero) == true {\n            \n            //  keyboard is not showing(At the beginning only). We should save rootViewRect.\n            if let constraint = _textFieldView?.viewController()?.IQLayoutGuideConstraint {\n                _layoutGuideConstraint = constraint\n                _layoutGuideConstraintInitialConstant = constraint.constant\n            }\n            \n            //  keyboard is not showing(At the beginning only). We should save rootViewRect.\n            _rootViewController = _textFieldView?.topMostController()\n            if _rootViewController == nil {\n                _rootViewController = keyWindow()?.topMostWindowController()\n            }\n            \n            if let unwrappedRootController = _rootViewController {\n                _topViewBeginRect = unwrappedRootController.view.frame\n                \n#if swift(>=3.2)\n                if #available(iOS 11, *) {\n                    _initialAdditionalSafeAreaInsets = unwrappedRootController.additionalSafeAreaInsets;\n                }\n#endif\n                if _topViewBeginRect.origin.y != 0 &&\n                    shouldFixInteractivePopGestureRecognizer == true &&\n                    unwrappedRootController is UINavigationController &&\n                    unwrappedRootController.modalPresentationStyle != UIModalPresentationStyle.formSheet &&\n                    unwrappedRootController.modalPresentationStyle != UIModalPresentationStyle.pageSheet {\n\n                    if let window = keyWindow() {\n                        _topViewBeginRect.origin.y = window.frame.size.height-unwrappedRootController.view.frame.size.height\n                    } else {\n                        _topViewBeginRect.origin.y = 0\n                    }\n                }\n\n                showLog(\"Saving \\(unwrappedRootController._IQDescription()) beginning Frame: \\(_topViewBeginRect)\")\n            } else {\n                _topViewBeginRect = CGRect.zero\n            }\n        }\n\n        //  Getting topMost ViewController.\n        var topMostController = _textFieldView?.topMostController()\n        \n        if topMostController == nil {\n            topMostController = keyWindow()?.topMostWindowController()\n        }\n\n        //If last restored keyboard size is different(any orientation accure), then refresh. otherwise not.\n        if _kbSize.equalTo(oldKBSize) == false {\n            \n            //If _textFieldView is inside UITableViewController then let UITableViewController to handle it (Bug ID: #37) (Bug ID: #76) See note:- https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html If it is UIAlertView textField then do not affect anything (Bug ID: #70).\n            \n            if _privateIsKeyboardShowing == true &&\n                _textFieldView != nil &&\n                _textFieldView?.isAlertViewTextField() == false {\n                \n                //  keyboard is already showing. adjust frame.\n                adjustFrame()\n            }\n        }\n        \n        let elapsedTime = CACurrentMediaTime() - startTime\n        showLog(\"****** \\(#function) ended: \\(elapsedTime) seconds ******\")\n    }\n\n    /*  UIKeyboardDidShowNotification. */\n    @objc internal func keyboardDidShow(_ notification : Notification?) -> Void {\n        \n        if privateIsEnabled() == false {\n            return\n        }\n        \n        let startTime = CACurrentMediaTime()\n        showLog(\"****** \\(#function) started ******\")\n        \n        //  Getting topMost ViewController.\n        var topMostController = _textFieldView?.topMostController()\n        \n        if topMostController == nil {\n            topMostController = keyWindow()?.topMostWindowController()\n        }\n        \n        if _textFieldView != nil &&\n            (topMostController?.modalPresentationStyle == UIModalPresentationStyle.formSheet || topMostController?.modalPresentationStyle == UIModalPresentationStyle.pageSheet) &&\n            _textFieldView?.isAlertViewTextField() == false {\n            \n            //In case of form sheet or page sheet, we'll add adjustFrame call in main queue to perform it when UI thread will do all framing updation so adjustFrame will be executed after all internal operations.\n            OperationQueue.main.addOperation {\n                self.adjustFrame()\n            }\n        }\n        \n        let elapsedTime = CACurrentMediaTime() - startTime\n        showLog(\"****** \\(#function) ended: \\(elapsedTime) seconds ******\")\n    }\n\n    /*  UIKeyboardWillHideNotification. So setting rootViewController to it's default frame. */\n    @objc internal func keyboardWillHide(_ notification : Notification?) -> Void {\n        \n        //If it's not a fake notification generated by [self setEnable:NO].\n        if notification != nil {\n            _kbShowNotification = nil\n        }\n        \n        //  Boolean to know keyboard is showing/hiding\n        _privateIsKeyboardShowing = false\n        \n        if let info = notification?.userInfo {\n            \n            //  Getting keyboard animation duration\n            if let duration =  info[UIKeyboardAnimationDurationUserInfoKey] as? TimeInterval {\n                if duration != 0 {\n                    //  Setitng keyboard animation duration\n                    _animationDuration = duration\n                }\n            }\n        }\n        \n        //If not enabled then do nothing.\n        if privateIsEnabled() == false {\n            return\n        }\n        \n        let startTime = CACurrentMediaTime()\n        showLog(\"****** \\(#function) started ******\")\n\n        //Commented due to #56. Added all the conditions below to handle UIWebView's textFields.    (Bug ID: #56)\n        //  We are unable to get textField object while keyboard showing on UIWebView's textField.  (Bug ID: #11)\n        //    if (_textFieldView == nil)   return\n\n        //Restoring the contentOffset of the lastScrollView\n        if let lastScrollView = _lastScrollView {\n            \n            UIView.animate(withDuration: _animationDuration, delay: 0, options: UIViewAnimationOptions.beginFromCurrentState.union(_animationCurve), animations: { () -> Void in\n                \n                lastScrollView.contentInset = self._startingContentInsets\n                lastScrollView.scrollIndicatorInsets = self._startingScrollIndicatorInsets\n                \n                if lastScrollView.shouldRestoreScrollViewContentOffset == true {\n                    lastScrollView.contentOffset = self._startingContentOffset\n                }\n                \n                self.showLog(\"Restoring \\(lastScrollView._IQDescription()) contentInset to : \\(self._startingContentInsets) and contentOffset to : \\(self._startingContentOffset)\")\n\n                // TODO: restore scrollView state\n                // This is temporary solution. Have to implement the save and restore scrollView state\n                var superScrollView : UIScrollView? = lastScrollView\n\n                while let scrollView = superScrollView {\n\n                    let contentSize = CGSize(width: max(scrollView.contentSize.width, scrollView.frame.width), height: max(scrollView.contentSize.height, scrollView.frame.height))\n                    \n                    let minimumY = contentSize.height - scrollView.frame.height\n                    \n                    if minimumY < scrollView.contentOffset.y {\n                        scrollView.contentOffset = CGPoint(x: scrollView.contentOffset.x, y: minimumY)\n                        \n                        self.showLog(\"Restoring \\(scrollView._IQDescription()) contentOffset to : \\(self._startingContentOffset)\")\n                    }\n                    \n                    superScrollView = scrollView.superviewOfClassType(UIScrollView.self) as? UIScrollView\n                }\n                }) { (finished) -> Void in }\n        }\n        \n        //  Setting rootViewController frame to it's original position. //  (Bug ID: #18)\n        if _topViewBeginRect.equalTo(CGRect.zero) == false {\n            \n            if let rootViewController = _rootViewController {\n                \n                //frame size needs to be adjusted on iOS8 due to orientation API changes.\n                _topViewBeginRect.size = rootViewController.view.frame.size\n                \n                //Used UIViewAnimationOptionBeginFromCurrentState to minimize strange animations.\n                UIView.animate(withDuration: _animationDuration, delay: 0, options: UIViewAnimationOptions.beginFromCurrentState.union(_animationCurve), animations: { () -> Void in\n                    \n                    if let constraint = self._layoutGuideConstraint {\n                        \n                        constraint.constant = self._layoutGuideConstraintInitialConstant\n                        rootViewController.view.setNeedsLayout()\n                        rootViewController.view.layoutIfNeeded()\n                    }\n                    else {\n                        self.showLog(\"Restoring \\(rootViewController._IQDescription()) frame to : \\(self._topViewBeginRect)\")\n                        \n                        //  Setting it's new frame\n                        rootViewController.view.frame = self._topViewBeginRect\n                        \n#if swift(>=3.2)\n                        if #available(iOS 11, *) {\n                            rootViewController.additionalSafeAreaInsets = self._initialAdditionalSafeAreaInsets;\n                        }\n#endif\n\n                        self._privateMovedDistance = 0\n                        \n                        //Animating content if needed (Bug ID: #204)\n                        if self.layoutIfNeededOnUpdate == true {\n                            //Animating content (Bug ID: #160)\n                            rootViewController.view.setNeedsLayout()\n                            rootViewController.view.layoutIfNeeded()\n                        }\n                    }\n                    }) { (finished) -> Void in }\n                \n                _rootViewController = nil\n            }\n        } else if let constraint = self._layoutGuideConstraint {\n            \n            if let rootViewController = _rootViewController {\n                \n                UIView.animate(withDuration: _animationDuration, delay: 0, options: UIViewAnimationOptions.beginFromCurrentState.union(_animationCurve), animations: { () -> Void in\n                    \n                    constraint.constant = self._layoutGuideConstraintInitialConstant\n                    rootViewController.view.setNeedsLayout()\n                    rootViewController.view.layoutIfNeeded()\n                }) { (finished) -> Void in }\n            }\n        }\n        \n        //Reset all values\n        _lastScrollView = nil\n        _kbSize = CGSize.zero\n        _layoutGuideConstraint = nil\n        _layoutGuideConstraintInitialConstant = 0\n        _startingContentInsets = UIEdgeInsets.zero\n        _startingScrollIndicatorInsets = UIEdgeInsets.zero\n        _startingContentOffset = CGPoint.zero\n        //    topViewBeginRect = CGRectZero    //Commented due to #82\n\n        let elapsedTime = CACurrentMediaTime() - startTime\n        showLog(\"****** \\(#function) ended: \\(elapsedTime) seconds ******\")\n    }\n\n    @objc internal func keyboardDidHide(_ notification:Notification) {\n\n        let startTime = CACurrentMediaTime()\n        showLog(\"****** \\(#function) started ******\")\n        \n        _topViewBeginRect = CGRect.zero\n        \n#if swift(>=3.2)\n        if #available(iOS 11, *) {\n            _initialAdditionalSafeAreaInsets = .zero;\n        }\n#endif\n        \n        _kbSize = CGSize.zero\n\n        let elapsedTime = CACurrentMediaTime() - startTime\n        showLog(\"****** \\(#function) ended: \\(elapsedTime) seconds ******\")\n    }\n    \n    ///-------------------------------------------\n    /// MARK: UITextField/UITextView Notifications\n    ///-------------------------------------------\n\n    /**  UITextFieldTextDidBeginEditingNotification, UITextViewTextDidBeginEditingNotification. Fetching UITextFieldView object. */\n    @objc internal func textFieldViewDidBeginEditing(_ notification:Notification) {\n\n        let startTime = CACurrentMediaTime()\n        showLog(\"****** \\(#function) started ******\")\n\n        //  Getting object\n        _textFieldView = notification.object as? UIView\n        \n        if overrideKeyboardAppearance == true {\n            \n            if let textFieldView = _textFieldView as? UITextField {\n                //If keyboard appearance is not like the provided appearance\n                if textFieldView.keyboardAppearance != keyboardAppearance {\n                    //Setting textField keyboard appearance and reloading inputViews.\n                    textFieldView.keyboardAppearance = keyboardAppearance\n                    textFieldView.reloadInputViews()\n                }\n            } else if  let textFieldView = _textFieldView as? UITextView {\n                //If keyboard appearance is not like the provided appearance\n                if textFieldView.keyboardAppearance != keyboardAppearance {\n                    //Setting textField keyboard appearance and reloading inputViews.\n                    textFieldView.keyboardAppearance = keyboardAppearance\n                    textFieldView.reloadInputViews()\n                }\n            }\n        }\n        \n        //If autoToolbar enable, then add toolbar on all the UITextField/UITextView's if required.\n        if privateIsEnableAutoToolbar() == true {\n\n            //UITextView special case. Keyboard Notification is firing before textView notification so we need to resign it first and then again set it as first responder to add toolbar on it.\n            if _textFieldView is UITextView == true &&\n                _textFieldView?.inputAccessoryView == nil {\n                \n                UIView.animate(withDuration: 0.00001, delay: 0, options: UIViewAnimationOptions.beginFromCurrentState.union(_animationCurve), animations: { () -> Void in\n\n                    self.addToolbarIfRequired()\n                    \n                    }, completion: { (finished) -> Void in\n\n                        //On textView toolbar didn't appear on first time, so forcing textView to reload it's inputViews.\n                        self._textFieldView?.reloadInputViews()\n                })\n            } else {\n                //Adding toolbar\n                addToolbarIfRequired()\n            }\n        } else {\n            removeToolbarIfRequired()\n        }\n\n        resignFirstResponderGesture.isEnabled = privateShouldResignOnTouchOutside()\n        _textFieldView?.window?.addGestureRecognizer(resignFirstResponderGesture)    //   (Enhancement ID: #14)\n\n        if privateIsEnabled() == true {\n            if _topViewBeginRect.equalTo(CGRect.zero) == true {    //  (Bug ID: #5)\n                \n                //  keyboard is not showing(At the beginning only). We should save rootViewRect.\n                if let constraint = _textFieldView?.viewController()?.IQLayoutGuideConstraint {\n                    _layoutGuideConstraint = constraint\n                    _layoutGuideConstraintInitialConstant = constraint.constant\n                }\n                \n                _rootViewController = _textFieldView?.topMostController()\n                if _rootViewController == nil {\n                    _rootViewController = keyWindow()?.topMostWindowController()\n                }\n                \n                if let rootViewController = _rootViewController {\n                    \n                    _topViewBeginRect = rootViewController.view.frame\n                    \n#if swift(>=3.2)\n                    if #available(iOS 11, *) {\n                        _initialAdditionalSafeAreaInsets = rootViewController.additionalSafeAreaInsets;\n                    }\n#endif\n\n                    if _topViewBeginRect.origin.y != 0 &&\n                        shouldFixInteractivePopGestureRecognizer == true &&\n                        rootViewController is UINavigationController &&\n                        rootViewController.modalPresentationStyle != UIModalPresentationStyle.formSheet &&\n                        rootViewController.modalPresentationStyle != UIModalPresentationStyle.pageSheet {\n                        if let window = keyWindow() {\n                            _topViewBeginRect.origin.y = window.frame.size.height-rootViewController.view.frame.size.height\n                        } else {\n                            _topViewBeginRect.origin.y = 0\n                        }\n                    }\n                    \n                    showLog(\"Saving \\(rootViewController._IQDescription()) beginning frame : \\(_topViewBeginRect)\")\n                }\n            }\n            \n            //If _textFieldView is inside ignored responder then do nothing. (Bug ID: #37, #74, #76)\n            //See notes:- https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html If it is UIAlertView textField then do not affect anything (Bug ID: #70).\n            if _privateIsKeyboardShowing == true &&\n                _textFieldView != nil &&\n                _textFieldView?.isAlertViewTextField() == false {\n                \n                //  keyboard is already showing. adjust frame.\n                adjustFrame()\n            }\n        }\n\n        let elapsedTime = CACurrentMediaTime() - startTime\n        showLog(\"****** \\(#function) ended: \\(elapsedTime) seconds ******\")\n    }\n    \n    /**  UITextFieldTextDidEndEditingNotification, UITextViewTextDidEndEditingNotification. Removing fetched object. */\n    @objc internal func textFieldViewDidEndEditing(_ notification:Notification) {\n        \n        let startTime = CACurrentMediaTime()\n        showLog(\"****** \\(#function) started ******\")\n\n        //Removing gesture recognizer   (Enhancement ID: #14)\n        _textFieldView?.window?.removeGestureRecognizer(resignFirstResponderGesture)\n        \n        // We check if there's a change in original frame or not.\n        \n        if let textView = _textFieldView as? UITextView {\n\n            if isTextViewContentInsetChanged == true {\n                \n                UIView.animate(withDuration: _animationDuration, delay: 0, options: UIViewAnimationOptions.beginFromCurrentState.union(_animationCurve), animations: { () -> Void in\n                    \n                    self.isTextViewContentInsetChanged = false\n                    \n                    self.showLog(\"Restoring \\(textView._IQDescription()) textView.contentInset to : \\(self.startingTextViewContentInsets)\")\n                    \n                    //Setting textField to it's initial contentInset\n                    textView.contentInset = self.startingTextViewContentInsets\n                    textView.scrollIndicatorInsets = self.startingTextViewScrollIndicatorInsets\n\n                    }, completion: { (finished) -> Void in })\n            }\n        }\n        \n        //Setting object to nil\n        _textFieldView = nil\n\n        let elapsedTime = CACurrentMediaTime() - startTime\n        showLog(\"****** \\(#function) ended: \\(elapsedTime) seconds ******\")\n    }\n\n    ///------------------------------------------\n    /// MARK: UIStatusBar Notification methods\n    ///------------------------------------------\n    \n    /**  UIApplicationWillChangeStatusBarOrientationNotification. Need to set the textView to it's original position. If any frame changes made. (Bug ID: #92)*/\n    @objc internal func willChangeStatusBarOrientation(_ notification:Notification) {\n        \n        let startTime = CACurrentMediaTime()\n        showLog(\"****** \\(#function) started ******\")\n        \n        //If textViewContentInsetChanged is saved then restore it.\n        if let textView = _textFieldView as? UITextView {\n            \n            if isTextViewContentInsetChanged == true {\n                \n                UIView.animate(withDuration: _animationDuration, delay: 0, options: UIViewAnimationOptions.beginFromCurrentState.union(_animationCurve), animations: { () -> Void in\n                    \n                    self.isTextViewContentInsetChanged = false\n                    \n                    self.showLog(\"Restoring \\(textView._IQDescription()) textView.contentInset to : \\(self.startingTextViewContentInsets)\")\n                    \n                    //Setting textField to it's initial contentInset\n                    textView.contentInset = self.startingTextViewContentInsets\n                    textView.scrollIndicatorInsets = self.startingTextViewScrollIndicatorInsets\n                    \n                    }, completion: { (finished) -> Void in })\n            }\n        }\n\n        if privateIsEnabled() == false {\n            return\n        }\n        \n        #if swift(>=3.2)\n        if let rootViewController = _rootViewController {\n            if #available(iOS 11, *) {\n                if UIEdgeInsetsEqualToEdgeInsets(_initialAdditionalSafeAreaInsets, rootViewController.additionalSafeAreaInsets) {\n                    rootViewController.additionalSafeAreaInsets = _initialAdditionalSafeAreaInsets;\n                }\n            }\n        }\n        #endif\n\n        let elapsedTime = CACurrentMediaTime() - startTime\n        showLog(\"****** \\(#function) ended: \\(elapsedTime) seconds ******\")\n    }\n    \n    /**  UIApplicationDidChangeStatusBarFrameNotification. Need to refresh view position and update _topViewBeginRect. (Bug ID: #446)*/\n    @objc internal func didChangeStatusBarFrame(_ notification : Notification) -> Void {\n        \n        let oldStatusBarFrame = _statusBarFrame\n        \n        //  Getting keyboard animation duration\n        if let info = notification.userInfo {\n            if let newFrame = info[UIApplicationStatusBarFrameUserInfoKey] as? CGRect {\n                \n                _statusBarFrame = newFrame\n            }\n        }\n\n        if privateIsEnabled() == false {\n            return\n        }\n        \n        let startTime = CACurrentMediaTime()\n        showLog(\"****** \\(#function) started ******\")\n        \n        if _rootViewController != nil &&\n            !_topViewBeginRect.equalTo(_rootViewController!.view.frame) == true {\n\n            if let unwrappedRootController = _rootViewController {\n                _topViewBeginRect = unwrappedRootController.view.frame\n                \n#if swift(>=3.2)\n                if #available(iOS 11, *) {\n                    _initialAdditionalSafeAreaInsets = unwrappedRootController.additionalSafeAreaInsets;\n                }\n#endif\n                \n                if _topViewBeginRect.origin.y != 0 &&\n                    shouldFixInteractivePopGestureRecognizer == true &&\n                    unwrappedRootController is UINavigationController &&\n                    unwrappedRootController.modalPresentationStyle != UIModalPresentationStyle.formSheet &&\n                    unwrappedRootController.modalPresentationStyle != UIModalPresentationStyle.pageSheet {\n                    \n                    if let window = keyWindow() {\n                        _topViewBeginRect.origin.y = window.frame.size.height-unwrappedRootController.view.frame.size.height\n                    } else {\n                        _topViewBeginRect.origin.y = 0\n                    }\n                }\n                \n                showLog(\"Saving \\(unwrappedRootController._IQDescription()) beginning Frame: \\(_topViewBeginRect)\")\n            } else {\n                _topViewBeginRect = CGRect.zero\n            }\n        }\n        \n        //If _textFieldView is inside UITableViewController then let UITableViewController to handle it (Bug ID: #37) (Bug ID: #76) See note:- https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html If it is UIAlertView textField then do not affect anything (Bug ID: #70).\n        \n        if _privateIsKeyboardShowing == true &&\n            _textFieldView != nil &&\n            _statusBarFrame.size.equalTo(oldStatusBarFrame.size) == false &&\n            _textFieldView?.isAlertViewTextField() == false {\n            \n            //  keyboard is already showing. adjust frame.\n            adjustFrame()\n        }\n        \n        let elapsedTime = CACurrentMediaTime() - startTime\n        showLog(\"****** \\(#function) ended: \\(elapsedTime) seconds ******\")\n    }\n\n    ///------------------\n    /// MARK: AutoToolbar\n    ///------------------\n    \n    /**\tGet all UITextField/UITextView siblings of textFieldView. */\n    fileprivate func responderViews()-> [UIView]? {\n        \n        var superConsideredView : UIView?\n\n        //If find any consider responderView in it's upper hierarchy then will get deepResponderView.\n        for disabledClass in toolbarPreviousNextAllowedClasses {\n            \n            superConsideredView = _textFieldView?.superviewOfClassType(disabledClass)\n            \n            if superConsideredView != nil {\n                break\n            }\n        }\n    \n    //If there is a superConsideredView in view's hierarchy, then fetching all it's subview that responds. No sorting for superConsideredView, it's by subView position.    (Enhancement ID: #22)\n        if superConsideredView != nil {\n            return superConsideredView?.deepResponderViews()\n        } else {  //Otherwise fetching all the siblings\n            \n            if let textFields = _textFieldView?.responderSiblings() {\n                \n                //Sorting textFields according to behaviour\n                switch toolbarManageBehaviour {\n                    //If autoToolbar behaviour is bySubviews, then returning it.\n                case IQAutoToolbarManageBehaviour.bySubviews:   return textFields\n                    \n                    //If autoToolbar behaviour is by tag, then sorting it according to tag property.\n                case IQAutoToolbarManageBehaviour.byTag:    return textFields.sortedArrayByTag()\n                    \n                    //If autoToolbar behaviour is by tag, then sorting it according to tag property.\n                case IQAutoToolbarManageBehaviour.byPosition:    return textFields.sortedArrayByPosition()\n                }\n            } else {\n                return nil\n            }\n        }\n    }\n    \n    /** Add toolbar if it is required to add on textFields and it's siblings. */\n    fileprivate func addToolbarIfRequired() {\n        \n        let startTime = CACurrentMediaTime()\n        showLog(\"****** \\(#function) started ******\")\n\n        //\tGetting all the sibling textFields.\n        if let siblings = responderViews(), !siblings.isEmpty {\n            \n            showLog(\"Found \\(siblings.count) responder sibling(s)\")\n            \n            if let textField = _textFieldView {\n                //Either there is no inputAccessoryView or if accessoryView is not appropriate for current situation(There is Previous/Next/Done toolbar).\n                //setInputAccessoryView: check   (Bug ID: #307)\n                if textField.responds(to: #selector(setter: UITextField.inputAccessoryView)) {\n                    \n                    if textField.inputAccessoryView == nil ||\n                        textField.inputAccessoryView?.tag == IQKeyboardManager.kIQPreviousNextButtonToolbarTag ||\n                        textField.inputAccessoryView?.tag == IQKeyboardManager.kIQDoneButtonToolbarTag {\n                        \n                        //\tIf only one object is found, then adding only Done button.\n                        if (siblings.count == 1 && previousNextDisplayMode == .Default) || previousNextDisplayMode == .alwaysHide {\n                            \n                            if let doneBarButtonItemImage = toolbarDoneBarButtonItemImage {\n                                textField.addRightButtonOnKeyboardWithImage(doneBarButtonItemImage, target: self, action: #selector(self.doneAction(_:)), shouldShowPlaceholder: shouldShowToolbarPlaceholder)\n                            }\n                                //Supporting Custom Done button text (Enhancement ID: #209, #411, Bug ID: #376)\n                            else if let doneBarButtonItemText = toolbarDoneBarButtonItemText {\n                                textField.addRightButtonOnKeyboardWithText(doneBarButtonItemText, target: self, action: #selector(self.doneAction(_:)), shouldShowPlaceholder: shouldShowToolbarPlaceholder)\n                            } else {\n                                //Now adding textField placeholder text as title of IQToolbar  (Enhancement ID: #27)\n                                textField.addDoneOnKeyboardWithTarget(self, action: #selector(self.doneAction(_:)), shouldShowPlaceholder: shouldShowToolbarPlaceholder)\n                            }\n                            textField.inputAccessoryView?.tag = IQKeyboardManager.kIQDoneButtonToolbarTag //  (Bug ID: #78)\n                            \n                        } else if (siblings.count > 1 && previousNextDisplayMode == .Default) || previousNextDisplayMode == .alwaysShow {\n                            \n                            //Supporting Custom Done button image (Enhancement ID: #366)\n                            if let doneBarButtonItemImage = toolbarDoneBarButtonItemImage {\n                                textField.addPreviousNextRightOnKeyboardWithTarget(self, rightButtonImage: doneBarButtonItemImage, previousAction: #selector(self.previousAction(_:)), nextAction: #selector(self.nextAction(_:)), rightButtonAction: #selector(self.doneAction(_:)), shouldShowPlaceholder: shouldShowToolbarPlaceholder)\n                            }\n                                //Supporting Custom Done button text (Enhancement ID: #209, #411, Bug ID: #376)\n                            else if let doneBarButtonItemText = toolbarDoneBarButtonItemText {\n                                textField.addPreviousNextRightOnKeyboardWithTarget(self, rightButtonTitle: doneBarButtonItemText, previousAction: #selector(self.previousAction(_:)), nextAction: #selector(self.nextAction(_:)), rightButtonAction: #selector(self.doneAction(_:)), shouldShowPlaceholder: shouldShowToolbarPlaceholder)\n                            } else {\n                                //Now adding textField placeholder text as title of IQToolbar  (Enhancement ID: #27)\n                                textField.addPreviousNextDoneOnKeyboardWithTarget(self, previousAction: #selector(self.previousAction(_:)), nextAction: #selector(self.nextAction(_:)), doneAction: #selector(self.doneAction(_:)), shouldShowPlaceholder: shouldShowToolbarPlaceholder)\n                            }\n                            textField.inputAccessoryView?.tag = IQKeyboardManager.kIQPreviousNextButtonToolbarTag //  (Bug ID: #78)\n                        }\n\n                        let toolbar = textField.keyboardToolbar\n\n                        //  Setting toolbar to keyboard.\n                        if let _textField = textField as? UITextField {\n                            \n                            //Bar style according to keyboard appearance\n                            switch _textField.keyboardAppearance {\n                                \n                            case UIKeyboardAppearance.dark:\n                                toolbar.barStyle = UIBarStyle.black\n                                toolbar.tintColor = UIColor.white\n                                toolbar.barTintColor = nil\n                            default:\n                                toolbar.barStyle = UIBarStyle.default\n                                toolbar.barTintColor = toolbarBarTintColor\n                                \n                                //Setting toolbar tintColor //  (Enhancement ID: #30)\n                                if shouldToolbarUsesTextFieldTintColor {\n                                    toolbar.tintColor = _textField.tintColor\n                                } else if let tintColor = toolbarTintColor {\n                                    toolbar.tintColor = tintColor\n                                } else {\n                                    toolbar.tintColor = UIColor.black\n                                }\n                            }\n                        } else if let _textView = textField as? UITextView {\n                            \n                            //Bar style according to keyboard appearance\n                            switch _textView.keyboardAppearance {\n                                \n                            case UIKeyboardAppearance.dark:\n                                toolbar.barStyle = UIBarStyle.black\n                                toolbar.tintColor = UIColor.white\n                                toolbar.barTintColor = nil\n                            default:\n                                toolbar.barStyle = UIBarStyle.default\n                                toolbar.barTintColor = toolbarBarTintColor\n\n                                if shouldToolbarUsesTextFieldTintColor {\n                                    toolbar.tintColor = _textView.tintColor\n                                } else if let tintColor = toolbarTintColor {\n                                    toolbar.tintColor = tintColor\n                                } else {\n                                    toolbar.tintColor = UIColor.black\n                                }\n                            }\n                        }\n\n                        //Setting toolbar title font.   //  (Enhancement ID: #30)\n                        if shouldShowToolbarPlaceholder == true &&\n                            textField.shouldHideToolbarPlaceholder == false {\n                            \n                            //Updating placeholder font to toolbar.     //(Bug ID: #148, #272)\n                            if toolbar.titleBarButton.title == nil ||\n                                toolbar.titleBarButton.title != textField.drawingToolbarPlaceholder {\n                                toolbar.titleBarButton.title = textField.drawingToolbarPlaceholder\n                            }\n                            \n                            //Setting toolbar title font.   //  (Enhancement ID: #30)\n                            if placeholderFont != nil {\n                                toolbar.titleBarButton.titleFont = placeholderFont\n                            }\n                        } else {\n                            \n                            toolbar.titleBarButton.title = nil\n                        }\n                        \n                        //In case of UITableView (Special), the next/previous buttons has to be refreshed everytime.    (Bug ID: #56)\n                        //\tIf firstTextField, then previous should not be enabled.\n                        if siblings.first == textField {\n                            if (siblings.count == 1) {\n                                textField.keyboardToolbar.previousBarButton.isEnabled = false\n                                textField.keyboardToolbar.nextBarButton.isEnabled = false\n                            } else {\n                                textField.keyboardToolbar.previousBarButton.isEnabled = false\n                                textField.keyboardToolbar.nextBarButton.isEnabled = true\n                            }\n                        } else if siblings.last  == textField {   //\tIf lastTextField then next should not be enaled.\n                            textField.keyboardToolbar.previousBarButton.isEnabled = true\n                            textField.keyboardToolbar.nextBarButton.isEnabled = false\n                        } else {\n                            textField.keyboardToolbar.previousBarButton.isEnabled = true\n                            textField.keyboardToolbar.nextBarButton.isEnabled = true\n                        }\n                    }\n                }\n            }\n        }\n\n        let elapsedTime = CACurrentMediaTime() - startTime\n        showLog(\"****** \\(#function) ended: \\(elapsedTime) seconds ******\")\n    }\n    \n    /** Remove any toolbar if it is IQToolbar. */\n    fileprivate func removeToolbarIfRequired() {    //  (Bug ID: #18)\n        \n        let startTime = CACurrentMediaTime()\n        showLog(\"****** \\(#function) started ******\")\n\n        //\tGetting all the sibling textFields.\n        if let siblings = responderViews() {\n            \n            showLog(\"Found \\(siblings.count) responder sibling(s)\")\n\n            for view in siblings {\n                \n                if let toolbar = view.inputAccessoryView as? IQToolbar {\n\n                    //setInputAccessoryView: check   (Bug ID: #307)\n                    if view.responds(to: #selector(setter: UITextField.inputAccessoryView)) &&\n                        (toolbar.tag == IQKeyboardManager.kIQDoneButtonToolbarTag || toolbar.tag == IQKeyboardManager.kIQPreviousNextButtonToolbarTag) {\n                        \n                        if let textField = view as? UITextField {\n                            textField.inputAccessoryView = nil\n                            textField.reloadInputViews()\n                        } else if let textView = view as? UITextView {\n                            textView.inputAccessoryView = nil\n                            textView.reloadInputViews()\n                        }\n                    }\n                }\n            }\n        }\n\n        let elapsedTime = CACurrentMediaTime() - startTime\n        showLog(\"****** \\(#function) ended: \\(elapsedTime) seconds ******\")\n    }\n    \n    /**\treloadInputViews to reload toolbar buttons enable/disable state on the fly Enhancement ID #434. */\n    open func reloadInputViews() {\n        \n        //If enabled then adding toolbar.\n        if privateIsEnableAutoToolbar() == true {\n            self.addToolbarIfRequired()\n        } else {\n            self.removeToolbarIfRequired()\n        }\n    }\n    \n    ///------------------\n    /// MARK: Debugging & Developer options\n    ///------------------\n    \n    open var enableDebugging = false\n\n    /**\n     @warning Use below methods to completely enable/disable notifications registered by library internally. Please keep in mind that library is totally dependent on NSNotification of UITextField, UITextField, Keyboard etc. If you do unregisterAllNotifications then library will not work at all. You should only use below methods if you want to completedly disable all library functions. You should use below methods at your own risk.\n     */\n    open func registerAllNotifications() {\n\n        //  Registering for keyboard notification.\n        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow(_:)), name: Notification.Name.UIKeyboardWillShow, object: nil)\n        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardDidShow(_:)), name: Notification.Name.UIKeyboardDidShow, object: nil)\n        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide(_:)), name: Notification.Name.UIKeyboardWillHide, object: nil)\n        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardDidHide(_:)), name: Notification.Name.UIKeyboardDidHide, object: nil)\n        \n        //  Registering for UITextField notification.\n        registerTextFieldViewClass(UITextField.self, didBeginEditingNotificationName: Notification.Name.UITextFieldTextDidBeginEditing.rawValue, didEndEditingNotificationName: Notification.Name.UITextFieldTextDidEndEditing.rawValue)\n        \n        //  Registering for UITextView notification.\n        registerTextFieldViewClass(UITextView.self, didBeginEditingNotificationName: Notification.Name.UITextViewTextDidBeginEditing.rawValue, didEndEditingNotificationName: Notification.Name.UITextViewTextDidEndEditing.rawValue)\n        \n        //  Registering for orientation changes notification\n        NotificationCenter.default.addObserver(self, selector: #selector(self.willChangeStatusBarOrientation(_:)), name: Notification.Name.UIApplicationWillChangeStatusBarOrientation, object: UIApplication.shared)\n        \n        //  Registering for status bar frame change notification\n        NotificationCenter.default.addObserver(self, selector: #selector(self.didChangeStatusBarFrame(_:)), name: Notification.Name.UIApplicationDidChangeStatusBarFrame, object: UIApplication.shared)\n    }\n\n    open func unregisterAllNotifications() {\n        \n        //  Unregistering for keyboard notification.\n        NotificationCenter.default.removeObserver(self, name: Notification.Name.UIKeyboardWillShow, object: nil)\n        NotificationCenter.default.removeObserver(self, name: Notification.Name.UIKeyboardDidShow, object: nil)\n        NotificationCenter.default.removeObserver(self, name: Notification.Name.UIKeyboardWillHide, object: nil)\n        NotificationCenter.default.removeObserver(self, name: Notification.Name.UIKeyboardDidHide, object: nil)\n\n        //  Unregistering for UITextField notification.\n        unregisterTextFieldViewClass(UITextField.self, didBeginEditingNotificationName: Notification.Name.UITextFieldTextDidBeginEditing.rawValue, didEndEditingNotificationName: Notification.Name.UITextFieldTextDidEndEditing.rawValue)\n        \n        //  Unregistering for UITextView notification.\n        unregisterTextFieldViewClass(UITextView.self, didBeginEditingNotificationName: Notification.Name.UITextViewTextDidBeginEditing.rawValue, didEndEditingNotificationName: Notification.Name.UITextViewTextDidEndEditing.rawValue)\n        \n        //  Unregistering for orientation changes notification\n        NotificationCenter.default.removeObserver(self, name: Notification.Name.UIApplicationWillChangeStatusBarOrientation, object: UIApplication.shared)\n        \n        //  Unregistering for status bar frame change notification\n        NotificationCenter.default.removeObserver(self, name: Notification.Name.UIApplicationDidChangeStatusBarFrame, object: UIApplication.shared)\n    }\n\n    fileprivate func showLog(_ logString: String) {\n        \n        if enableDebugging {\n            print(\"IQKeyboardManager: \" + logString)\n        }\n    }\n}\n\n"
  },
  {
    "path": "Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardReturnKeyHandler.swift",
    "content": "//\n//  IQKeyboardReturnKeyHandler.swift\n// https://github.com/hackiftekhar/IQKeyboardManager\n// Copyright (c) 2013-16 Iftekhar Qurashi.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nimport Foundation\nimport UIKit\n\n/**\nManages the return key to work like next/done in a view hierarchy.\n*/\nopen class IQKeyboardReturnKeyHandler: NSObject , UITextFieldDelegate, UITextViewDelegate {\n    \n    \n    ///---------------\n    /// MARK: Settings\n    ///---------------\n    \n    /**\n    Delegate of textField/textView.\n    */\n    open weak var delegate: (UITextFieldDelegate & UITextViewDelegate)?\n    \n    /**\n    Set the last textfield return key type. Default is UIReturnKeyDefault.\n    */\n    open var lastTextFieldReturnKeyType : UIReturnKeyType = UIReturnKeyType.default {\n        \n        didSet {\n            \n            for infoDict in textFieldInfoCache {\n                \n                if let view = infoDict[kIQTextField] as? UIView {\n                    updateReturnKeyTypeOnTextField(view)\n                }\n            }\n        }\n    }\n    \n    ///--------------------------------------\n    /// MARK: Initialization/Deinitialization\n    ///--------------------------------------\n\n    public override init() {\n        super.init()\n    }\n    \n    /**\n    Add all the textFields available in UIViewController's view.\n    */\n    public init(controller : UIViewController) {\n        super.init()\n        \n        addResponderFromView(controller.view)\n    }\n\n    deinit {\n        \n        for infoDict in textFieldInfoCache {\n            \n            if let textField = infoDict[kIQTextField] as? UITextField {\n\n                if let returnKeyType = infoDict[kIQTextFieldReturnKeyType] as? UIReturnKeyType {\n                    textField.returnKeyType = returnKeyType\n                }\n                \n                textField.delegate = infoDict[kIQTextFieldDelegate] as? UITextFieldDelegate\n\n            } else if let textView = infoDict[kIQTextField] as? UITextView {\n\n                if let returnKeyType = infoDict[kIQTextFieldReturnKeyType] as? UIReturnKeyType {\n                    textView.returnKeyType = returnKeyType\n                }\n                \n                textView.delegate = infoDict[kIQTextFieldDelegate] as? UITextViewDelegate\n            }\n        }\n        \n        textFieldInfoCache.removeAll()\n    }\n    \n\n    ///------------------------\n    /// MARK: Private variables\n    ///------------------------\n    fileprivate var textFieldInfoCache          =   [[AnyHashable : Any]]()\n    fileprivate let kIQTextField                =   \"kIQTextField\"\n    fileprivate let kIQTextFieldDelegate        =   \"kIQTextFieldDelegate\"\n    fileprivate let kIQTextFieldReturnKeyType   =   \"kIQTextFieldReturnKeyType\"\n\n    \n    ///------------------------\n    /// MARK: Private Functions\n    ///------------------------\n    fileprivate func textFieldViewCachedInfo(_ textField : UIView) -> [AnyHashable : Any]? {\n        \n        for infoDict in textFieldInfoCache {\n            \n            if let view = infoDict[kIQTextField] as? UIView {\n\n                if view == textField {\n                    return infoDict\n                }\n            }\n        }\n        \n        return nil\n    }\n\n    fileprivate func updateReturnKeyTypeOnTextField(_ view : UIView)\n    {\n        var superConsideredView : UIView?\n        \n        //If find any consider responderView in it's upper hierarchy then will get deepResponderView. (Bug ID: #347)\n        for disabledClass in IQKeyboardManager.sharedManager().toolbarPreviousNextAllowedClasses {\n            \n            superConsideredView = view.superviewOfClassType(disabledClass)\n            \n            if superConsideredView != nil {\n                break\n            }\n        }\n\n        var textFields : [UIView]?\n        \n        //If there is a tableView in view's hierarchy, then fetching all it's subview that responds.\n        if let unwrappedTableView = superConsideredView {     //   (Enhancement ID: #22)\n            textFields = unwrappedTableView.deepResponderViews()\n        } else {  //Otherwise fetching all the siblings\n            \n            textFields = view.responderSiblings()\n            \n            //Sorting textFields according to behaviour\n            switch IQKeyboardManager.sharedManager().toolbarManageBehaviour {\n                //If needs to sort it by tag\n            case .byTag:        textFields = textFields?.sortedArrayByTag()\n                //If needs to sort it by Position\n            case .byPosition:   textFields = textFields?.sortedArrayByPosition()\n            default:    break\n            }\n        }\n        \n        if let lastView = textFields?.last {\n            \n            if let textField = view as? UITextField {\n                \n                //If it's the last textField in responder view, else next\n                textField.returnKeyType = (view == lastView)    ?   lastTextFieldReturnKeyType : UIReturnKeyType.next\n            } else if let textView = view as? UITextView {\n                \n                //If it's the last textField in responder view, else next\n                textView.returnKeyType = (view == lastView)    ?   lastTextFieldReturnKeyType : UIReturnKeyType.next\n            }\n        }\n    }\n    \n\n    ///----------------------------------------------\n    /// MARK: Registering/Unregistering textFieldView\n    ///----------------------------------------------\n\n    /**\n    Should pass UITextField/UITextView intance. Assign textFieldView delegate to self, change it's returnKeyType.\n    \n    @param textFieldView UITextField/UITextView object to register.\n    */\n    open func addTextFieldView(_ view : UIView) {\n        \n        var dictInfo = [AnyHashable : Any]()\n        \n        dictInfo[kIQTextField] = view\n        \n        if let textField = view as? UITextField {\n            \n            dictInfo[kIQTextFieldReturnKeyType] = textField.returnKeyType\n            \n            if let textFieldDelegate = textField.delegate {\n                dictInfo[kIQTextFieldDelegate] = textFieldDelegate\n            }\n            textField.delegate = self\n            \n        } else if let textView = view as? UITextView {\n            \n            dictInfo[kIQTextFieldReturnKeyType] = textView.returnKeyType\n            \n            if let textViewDelegate = textView.delegate {\n                dictInfo[kIQTextFieldDelegate] = textViewDelegate\n            }\n            \n            textView.delegate = self\n        }\n        \n        textFieldInfoCache.append(dictInfo)\n    }\n    \n    /**\n    Should pass UITextField/UITextView intance. Restore it's textFieldView delegate and it's returnKeyType.\n    \n    @param textFieldView UITextField/UITextView object to unregister.\n    */\n    open func removeTextFieldView(_ view : UIView) {\n        \n        if let infoDict = textFieldViewCachedInfo(view) {\n            \n            if let textField = view as? UITextField {\n                \n                if let returnKeyType = infoDict[kIQTextFieldReturnKeyType] as? UIReturnKeyType {\n                    textField.returnKeyType = returnKeyType\n                }\n                \n                textField.delegate = infoDict[kIQTextFieldDelegate] as? UITextFieldDelegate\n            } else if let textView = view as? UITextView {\n                \n                if let returnKeyType = infoDict[kIQTextFieldReturnKeyType] as? UIReturnKeyType {\n                    textView.returnKeyType = returnKeyType\n                }\n                \n                textView.delegate = infoDict[kIQTextFieldDelegate] as? UITextViewDelegate\n            }\n            \n            if let index = textFieldInfoCache.index(where: { $0[kIQTextField] as! UIView == view}) {\n\n                textFieldInfoCache.remove(at: index)\n            }\n        }\n    }\n    \n    /**\n    Add all the UITextField/UITextView responderView's.\n    \n    @param UIView object to register all it's responder subviews.\n    */\n    open func addResponderFromView(_ view : UIView) {\n        \n        let textFields = view.deepResponderViews()\n        \n        for textField in textFields {\n            \n            addTextFieldView(textField)\n        }\n    }\n    \n    /**\n    Remove all the UITextField/UITextView responderView's.\n    \n    @param UIView object to unregister all it's responder subviews.\n    */\n    open func removeResponderFromView(_ view : UIView) {\n        \n        let textFields = view.deepResponderViews()\n        \n        for textField in textFields {\n            \n            removeTextFieldView(textField)\n        }\n    }\n    \n    @discardableResult fileprivate func goToNextResponderOrResign(_ view : UIView) -> Bool {\n        \n        var superConsideredView : UIView?\n        \n        //If find any consider responderView in it's upper hierarchy then will get deepResponderView. (Bug ID: #347)\n        for disabledClass in IQKeyboardManager.sharedManager().toolbarPreviousNextAllowedClasses {\n            \n            superConsideredView = view.superviewOfClassType(disabledClass)\n            \n            if superConsideredView != nil {\n                break\n            }\n        }\n        \n        var textFields : [UIView]?\n        \n        //If there is a tableView in view's hierarchy, then fetching all it's subview that responds.\n        if let unwrappedTableView = superConsideredView {     //   (Enhancement ID: #22)\n            textFields = unwrappedTableView.deepResponderViews()\n        } else {  //Otherwise fetching all the siblings\n            \n            textFields = view.responderSiblings()\n            \n            //Sorting textFields according to behaviour\n            switch IQKeyboardManager.sharedManager().toolbarManageBehaviour {\n                //If needs to sort it by tag\n            case .byTag:        textFields = textFields?.sortedArrayByTag()\n                //If needs to sort it by Position\n            case .byPosition:   textFields = textFields?.sortedArrayByPosition()\n            default:\n                break\n            }\n        }\n\n        if let unwrappedTextFields = textFields {\n            \n            //Getting index of current textField.\n            if let index = unwrappedTextFields.index(of: view) {\n                //If it is not last textField. then it's next object becomeFirstResponder.\n                if index < (unwrappedTextFields.count - 1) {\n                    \n                    let nextTextField = unwrappedTextFields[index+1]\n                    nextTextField.becomeFirstResponder()\n                    return false\n                } else {\n                    \n                    view.resignFirstResponder()\n                    return true\n                }\n            } else {\n                return true\n            }\n        } else {\n            return true\n        }\n    }\n    \n\n    ///----------------------------------------------\n    /// MARK: UITextField/UITextView delegates\n    ///----------------------------------------------\n    \n    open func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {\n        \n        if delegate == nil {\n            \n            if let unwrapDelegate = textFieldViewCachedInfo(textField)?[kIQTextFieldDelegate] as? UITextFieldDelegate {\n                if unwrapDelegate.responds(to: #selector(UITextFieldDelegate.textFieldShouldBeginEditing(_:))) {\n                    return unwrapDelegate.textFieldShouldBeginEditing?(textField) == true\n                }\n            }\n        }\n        \n        return true\n    }\n    \n    open func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {\n        \n        if delegate == nil {\n            \n            if let unwrapDelegate = textFieldViewCachedInfo(textField)?[kIQTextFieldDelegate] as? UITextFieldDelegate {\n                if unwrapDelegate.responds(to: #selector(UITextFieldDelegate.textFieldShouldEndEditing(_:))) {\n                    return unwrapDelegate.textFieldShouldEndEditing?(textField) == true\n                }\n            }\n        }\n        \n        return true\n    }\n    \n    open func textFieldDidBeginEditing(_ textField: UITextField) {\n        updateReturnKeyTypeOnTextField(textField)\n        \n        var aDelegate : UITextFieldDelegate? = delegate\n        \n        if aDelegate == nil {\n            \n            if let dict = textFieldViewCachedInfo(textField) {\n                aDelegate = dict[kIQTextFieldDelegate] as? UITextFieldDelegate\n            }\n        }\n        \n        aDelegate?.textFieldDidBeginEditing?(textField)\n    }\n    \n    open func textFieldDidEndEditing(_ textField: UITextField) {\n        \n        var aDelegate : UITextFieldDelegate? = delegate\n        \n        if aDelegate == nil {\n            \n            if let dict = textFieldViewCachedInfo(textField) {\n                aDelegate = dict[kIQTextFieldDelegate] as? UITextFieldDelegate\n            }\n        }\n        \n        aDelegate?.textFieldDidEndEditing?(textField)\n    }\n    \n    @available(iOS 10.0, *)\n    open func textFieldDidEndEditing(_ textField: UITextField, reason: UITextFieldDidEndEditingReason) {\n\n        var aDelegate : UITextFieldDelegate? = delegate\n        \n        if aDelegate == nil {\n            \n            if let dict = textFieldViewCachedInfo(textField) {\n                aDelegate = dict[kIQTextFieldDelegate] as? UITextFieldDelegate\n            }\n        }\n        \n        aDelegate?.textFieldDidEndEditing?(textField, reason: reason)\n    }\n\n    open func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {\n        \n        if delegate == nil {\n            \n            if let unwrapDelegate = textFieldViewCachedInfo(textField)?[kIQTextFieldDelegate] as? UITextFieldDelegate {\n                if unwrapDelegate.responds(to: #selector(UITextFieldDelegate.textField(_:shouldChangeCharactersIn:replacementString:))) {\n                    return unwrapDelegate.textField?(textField, shouldChangeCharactersIn: range, replacementString: string) == true\n                }\n            }\n        }\n        return true\n    }\n    \n    open func textFieldShouldClear(_ textField: UITextField) -> Bool {\n        \n        if delegate == nil {\n            \n            if let unwrapDelegate = textFieldViewCachedInfo(textField)?[kIQTextFieldDelegate] as? UITextFieldDelegate {\n                if unwrapDelegate.responds(to: #selector(UITextFieldDelegate.textFieldShouldClear(_:))) {\n                    return unwrapDelegate.textFieldShouldClear?(textField) == true\n                }\n            }\n        }\n\n        return true\n    }\n    \n    \n    open func textFieldShouldReturn(_ textField: UITextField) -> Bool {\n        \n        var shouldReturn = true\n\n        if delegate == nil {\n            \n            if let unwrapDelegate = textFieldViewCachedInfo(textField)?[kIQTextFieldDelegate] as? UITextFieldDelegate {\n                if unwrapDelegate.responds(to: #selector(UITextFieldDelegate.textFieldShouldReturn(_:))) {\n                    shouldReturn = unwrapDelegate.textFieldShouldReturn?(textField) == true\n                }\n            }\n        }\n\n        if shouldReturn == true {\n            goToNextResponderOrResign(textField)\n            return true\n        } else {\n            return goToNextResponderOrResign(textField)\n        }\n    }\n    \n    \n    open func textViewShouldBeginEditing(_ textView: UITextView) -> Bool {\n        \n        if delegate == nil {\n            \n            if let unwrapDelegate = textFieldViewCachedInfo(textView)?[kIQTextFieldDelegate] as? UITextViewDelegate {\n                if unwrapDelegate.responds(to: #selector(UITextViewDelegate.textViewShouldBeginEditing(_:))) {\n                    return unwrapDelegate.textViewShouldBeginEditing?(textView) == true\n                }\n            }\n        }\n        \n        return true\n    }\n    \n    open func textViewShouldEndEditing(_ textView: UITextView) -> Bool {\n        \n        if delegate == nil {\n            \n            if let unwrapDelegate = textFieldViewCachedInfo(textView)?[kIQTextFieldDelegate] as? UITextViewDelegate {\n                if unwrapDelegate.responds(to: #selector(UITextViewDelegate.textViewShouldEndEditing(_:))) {\n                    return unwrapDelegate.textViewShouldEndEditing?(textView) == true\n                }\n            }\n        }\n        \n        return true\n    }\n    \n    open func textViewDidBeginEditing(_ textView: UITextView) {\n        updateReturnKeyTypeOnTextField(textView)\n        \n        var aDelegate : UITextViewDelegate? = delegate\n        \n        if aDelegate == nil {\n            \n            if let dict = textFieldViewCachedInfo(textView) {\n                aDelegate = dict[kIQTextFieldDelegate] as? UITextViewDelegate\n            }\n        }\n        \n        aDelegate?.textViewDidBeginEditing?(textView)\n    }\n    \n    open func textViewDidEndEditing(_ textView: UITextView) {\n        \n        var aDelegate : UITextViewDelegate? = delegate\n        \n        if aDelegate == nil {\n            \n            if let dict = textFieldViewCachedInfo(textView) {\n                aDelegate = dict[kIQTextFieldDelegate] as? UITextViewDelegate\n            }\n        }\n        \n        aDelegate?.textViewDidEndEditing?(textView)\n    }\n    \n    open func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {\n        \n        var shouldReturn = true\n        \n        if delegate == nil {\n            \n            if let unwrapDelegate = textFieldViewCachedInfo(textView)?[kIQTextFieldDelegate] as? UITextViewDelegate {\n                if unwrapDelegate.responds(to: #selector(UITextViewDelegate.textView(_:shouldChangeTextIn:replacementText:))) {\n                    shouldReturn = (unwrapDelegate.textView?(textView, shouldChangeTextIn: range, replacementText: text)) == true\n                }\n            }\n        }\n        \n        if shouldReturn == true && text == \"\\n\" {\n            shouldReturn = goToNextResponderOrResign(textView)\n        }\n        \n        return shouldReturn\n    }\n    \n    open func textViewDidChange(_ textView: UITextView) {\n        \n        var aDelegate : UITextViewDelegate? = delegate\n        \n        if aDelegate == nil {\n            \n            if let dict = textFieldViewCachedInfo(textView) {\n                aDelegate = dict[kIQTextFieldDelegate] as? UITextViewDelegate\n            }\n        }\n        \n        aDelegate?.textViewDidChange?(textView)\n    }\n    \n    open func textViewDidChangeSelection(_ textView: UITextView) {\n        \n        var aDelegate : UITextViewDelegate? = delegate\n        \n        if aDelegate == nil {\n            \n            if let dict = textFieldViewCachedInfo(textView) {\n                aDelegate = dict[kIQTextFieldDelegate] as? UITextViewDelegate\n            }\n        }\n        \n        aDelegate?.textViewDidChangeSelection?(textView)\n    }\n    \n    @available(iOS 10.0, *)\n    open func textView(_ aTextView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {\n        \n        if delegate == nil {\n            \n            if let unwrapDelegate = textFieldViewCachedInfo(aTextView)?[kIQTextFieldDelegate] as? UITextViewDelegate {\n                if unwrapDelegate.responds(to: #selector(textView as (UITextView, URL, NSRange, UITextItemInteraction) -> Bool)) {\n                    return unwrapDelegate.textView?(aTextView, shouldInteractWith: URL, in: characterRange, interaction: interaction) == true\n                }\n            }\n        }\n        \n        return true\n    }\n    \n    @available(iOS 10.0, *)\n    open func textView(_ aTextView: UITextView, shouldInteractWith textAttachment: NSTextAttachment, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool {\n        \n        if delegate == nil {\n            \n            if let unwrapDelegate = textFieldViewCachedInfo(aTextView)?[kIQTextFieldDelegate] as? UITextViewDelegate {\n                if unwrapDelegate.responds(to: #selector(textView as (UITextView, NSTextAttachment, NSRange, UITextItemInteraction) -> Bool)) {\n                    return unwrapDelegate.textView?(aTextView, shouldInteractWith: textAttachment, in: characterRange, interaction: interaction) == true\n                }\n            }\n        }\n        \n        return true\n    }\n    \n    @available(iOS, deprecated: 10.0)\n    open func textView(_ aTextView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {\n        \n        if delegate == nil {\n            \n            if let unwrapDelegate = textFieldViewCachedInfo(aTextView)?[kIQTextFieldDelegate] as? UITextViewDelegate {\n                if unwrapDelegate.responds(to: #selector(textView as (UITextView, URL, NSRange) -> Bool)) {\n                    return unwrapDelegate.textView?(aTextView, shouldInteractWith: URL, in: characterRange) == true\n                }\n            }\n        }\n        \n        return true\n    }\n    \n    @available(iOS, deprecated: 10.0)\n    open func textView(_ aTextView: UITextView, shouldInteractWith textAttachment: NSTextAttachment, in characterRange: NSRange) -> Bool {\n        \n        if delegate == nil {\n            \n            if let unwrapDelegate = textFieldViewCachedInfo(aTextView)?[kIQTextFieldDelegate] as? UITextViewDelegate {\n                if unwrapDelegate.responds(to: #selector(textView as (UITextView, NSTextAttachment, NSRange) -> Bool)) {\n                    return unwrapDelegate.textView?(aTextView, shouldInteractWith: textAttachment, in: characterRange) == true\n                }\n            }\n        }\n        \n        return true\n    }\n}\n"
  },
  {
    "path": "Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQTextView/IQTextView.swift",
    "content": "//\n//  IQTextView.swift\n// https://github.com/hackiftekhar/IQKeyboardManager\n// Copyright (c) 2013-16 Iftekhar Qurashi.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nimport UIKit\n\n/** @abstract UITextView with placeholder support   */\nopen class IQTextView : UITextView {\n\n    required public init?(coder aDecoder: NSCoder) {\n        super.init(coder: aDecoder)\n        NotificationCenter.default.addObserver(self, selector: #selector(self.refreshPlaceholder), name: Notification.Name.UITextViewTextDidChange, object: self)\n    }\n\n    override init(frame: CGRect, textContainer: NSTextContainer?) {\n        super.init(frame: frame, textContainer: textContainer)\n        NotificationCenter.default.addObserver(self, selector: #selector(self.refreshPlaceholder), name: Notification.Name.UITextViewTextDidChange, object: self)\n    }\n    \n    override open func awakeFromNib() {\n         super.awakeFromNib()\n        NotificationCenter.default.addObserver(self, selector: #selector(self.refreshPlaceholder), name: Notification.Name.UITextViewTextDidChange, object: self)\n    }\n    \n    deinit {\n        NotificationCenter.default.removeObserver(self)\n    }\n    \n    fileprivate var placeholderLabel: UILabel?\n    \n    /** @abstract To set textView's placeholder text. Default is ni.    */\n    @IBInspectable open var placeholder : String? {\n\n        get {\n            return placeholderLabel?.text\n        }\n \n        set {\n            \n            if placeholderLabel == nil {\n                \n                placeholderLabel = UILabel()\n                \n                if let unwrappedPlaceholderLabel = placeholderLabel {\n                    \n                    unwrappedPlaceholderLabel.autoresizingMask = [.flexibleWidth, .flexibleHeight]\n                    unwrappedPlaceholderLabel.lineBreakMode = .byWordWrapping\n                    unwrappedPlaceholderLabel.numberOfLines = 0\n                    unwrappedPlaceholderLabel.font = self.font\n                    unwrappedPlaceholderLabel.textAlignment = self.textAlignment\n                    unwrappedPlaceholderLabel.backgroundColor = UIColor.clear\n                    unwrappedPlaceholderLabel.textColor = UIColor(white: 0.7, alpha: 1.0)\n                    unwrappedPlaceholderLabel.alpha = 0\n                    addSubview(unwrappedPlaceholderLabel)\n                }\n            }\n            \n            placeholderLabel?.text = newValue\n            refreshPlaceholder()\n        }\n    }\n    \n    open override func layoutSubviews() {\n        super.layoutSubviews()\n        \n        if let unwrappedPlaceholderLabel = placeholderLabel {\n            \n            let offsetLeft = textContainerInset.left + textContainer.lineFragmentPadding\n            let offsetRight = textContainerInset.right + textContainer.lineFragmentPadding\n            let offsetTop = textContainerInset.top\n            let offsetBottom = textContainerInset.top\n\n            let expectedSize = unwrappedPlaceholderLabel.sizeThatFits(CGSize(width: self.frame.width-offsetLeft-offsetRight, height: self.frame.height-offsetTop-offsetBottom))\n\n            unwrappedPlaceholderLabel.frame = CGRect(x: offsetLeft, y: offsetTop, width: expectedSize.width, height: expectedSize.height)\n        }\n    }\n\n    @objc open func refreshPlaceholder() {\n        \n        if text.characters.count != 0 {\n            placeholderLabel?.alpha = 0\n        } else {\n            placeholderLabel?.alpha = 1\n        }\n    }\n    \n    override open var text: String! {\n        \n        didSet {\n            \n            refreshPlaceholder()\n\n        }\n    }\n    \n    override open var font : UIFont? {\n       \n        didSet {\n            \n            if let unwrappedFont = font {\n                placeholderLabel?.font = unwrappedFont\n            } else {\n                placeholderLabel?.font = UIFont.systemFont(ofSize: 12)\n            }\n        }\n    }\n    \n    override open var textAlignment: NSTextAlignment\n    {\n        didSet {\n            placeholderLabel?.textAlignment = textAlignment\n        }\n    }\n    \n    override open var delegate : UITextViewDelegate? {\n        \n        get {\n            refreshPlaceholder()\n            return super.delegate\n        }\n        \n        set {\n            super.delegate = newValue\n        }\n    }\n}\n\n\n"
  },
  {
    "path": "Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQBarButtonItem.swift",
    "content": "//\n//  IQBarButtonItem.swift\n// https://github.com/hackiftekhar/IQKeyboardManager\n// Copyright (c) 2013-16 Iftekhar Qurashi.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nimport UIKit\nimport Foundation\n\nopen class IQBarButtonItem: UIBarButtonItem {\n\n    private static var _classInitialize: Void = classInitialize()\n    \n    public override init() {\n        _ = IQBarButtonItem._classInitialize\n          super.init()\n      }\n\n    public required init?(coder aDecoder: NSCoder) {\n        _ = IQBarButtonItem._classInitialize\n           super.init(coder: aDecoder)\n       }\n\n   \n    private class func classInitialize() {\n\n        let  appearanceProxy = self.appearance()\n\n        let states : [UIControlState] = [.normal,.highlighted,.disabled,.selected,.application,.reserved];\n\n        for state in states {\n\n            appearanceProxy.setBackgroundImage(nil, for: state, barMetrics: .default)\n            appearanceProxy.setBackgroundImage(nil, for: state, style: .done, barMetrics: .default)\n            appearanceProxy.setBackgroundImage(nil, for: state, style: .plain, barMetrics: .default)\n            appearanceProxy.setBackButtonBackgroundImage(nil, for: state, barMetrics: .default)\n        }\n        \n        appearanceProxy.setTitlePositionAdjustment(UIOffset.zero, for: .default)\n        appearanceProxy.setBackgroundVerticalPositionAdjustment(0, for: .default)\n        appearanceProxy.setBackButtonTitlePositionAdjustment(UIOffset.zero, for: .default)\n        appearanceProxy.setBackButtonBackgroundVerticalPositionAdjustment(0, for: .default)\n    }\n    \n    open override var tintColor: UIColor? {\n        didSet {\n\n            #if swift(>=4)\n                var textAttributes = [NSAttributedStringKey : Any]()\n                \n                if let attributes = titleTextAttributes(for: .normal) {\n                \n                    for (key, value) in attributes {\n                \n                        textAttributes[NSAttributedStringKey.init(key)] = value\n                    }\n                }\n                \n                textAttributes[NSAttributedStringKey.foregroundColor] = tintColor\n                \n                setTitleTextAttributes(textAttributes, for: .normal)\n\n            #else\n\n                var textAttributes = [String:Any]()\n                \n                if let attributes = titleTextAttributes(for: .normal) {\n                    textAttributes = attributes\n                }\n                \n                textAttributes[NSForegroundColorAttributeName] = tintColor\n                \n                setTitleTextAttributes(textAttributes, for: .normal)\n\n            #endif\n        }\n    }\n\n    /**\n     Boolean to know if it's a system item or custom item, we are having a limitation that we cannot override a designated initializer, so we are manually setting this property once in initialization\n     */\n    @objc var isSystemItem = false\n    \n//    public override init(barButtonSystemItem systemItem: UIBarButtonSystemItem, target: Any?, action: Selector?) {\n//        return super.init(barButtonSystemItem: systemItem, target: target, action: action)\n//    }\n\n    /**\n     Additional target & action to do get callback action. Note that setting custom target & selector doesn't affect native functionality, this is just an additional target to get a callback.\n     \n     @param target Target object.\n     @param action Target Selector.\n     */\n    open func setTarget(_ target: AnyObject?, action: Selector?) {\n        invocation = (target, action)\n    }\n    \n    /**\n     Customized Invocation to be called when button is pressed. invocation is internally created using setTarget:action: method.\n     */\n    open var invocation : (target: AnyObject?, action: Selector?)\n    \n}\n"
  },
  {
    "path": "Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQPreviousNextView.swift",
    "content": "//\n// IQPreviousNextView.swift\n// https://github.com/hackiftekhar/IQKeyboardManager\n// Copyright (c) 2013-16 Iftekhar Qurashi.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport UIKit\n\nopen class IQPreviousNextView: UIView {\n\n}\n"
  },
  {
    "path": "Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQTitleBarButtonItem.swift",
    "content": "//\n//  IQTitleBarButtonItem.swift\n// https://github.com/hackiftekhar/IQKeyboardManager\n// Copyright (c) 2013-16 Iftekhar Qurashi.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nimport Foundation\nimport UIKit\n\nopen class IQTitleBarButtonItem: IQBarButtonItem {\n   \n    open var titleFont : UIFont? {\n    \n        didSet {\n            if let unwrappedFont = titleFont {\n                _titleButton?.titleLabel?.font = unwrappedFont\n            } else {\n                _titleButton?.titleLabel?.font = UIFont.systemFont(ofSize: 13)\n            }\n        }\n    }\n\n    override open var title: String? {\n        didSet {\n                _titleButton?.setTitle(title, for: UIControlState())\n        }\n    }\n    \n    /**\n     selectableTextColor to be used for displaying button text when button is enabled.\n     */\n    open var selectableTextColor : UIColor? {\n        \n        didSet {\n            if let color = selectableTextColor {\n                _titleButton?.setTitleColor(color, for:UIControlState())\n            } else {\n                _titleButton?.setTitleColor(UIColor.init(red: 0.0, green: 0.5, blue: 1.0, alpha: 1), for:UIControlState())\n            }\n        }\n    }\n\n    /**\n     Customized Invocation to be called on title button action. titleInvocation is internally created using setTitleTarget:action: method.\n     */\n    override open var invocation : (target: AnyObject?, action: Selector?) {\n\n        didSet {\n            \n            if (invocation.target == nil || invocation.action == nil)\n            {\n                self.isEnabled = false\n                _titleButton?.isEnabled = false\n                _titleButton?.removeTarget(nil, action: nil, for: .touchUpInside)\n            }\n            else\n            {\n                self.isEnabled = true\n                _titleButton?.isEnabled = true\n                _titleButton?.addTarget(invocation.target, action: invocation.action!, for: .touchUpInside)\n            }\n        }\n    }\n\n    fileprivate var _titleButton : UIButton?\n    fileprivate var _titleView : UIView?\n\n    override init() {\n        super.init()\n    }\n    \n    convenience init(title : String?) {\n\n        self.init(title: nil, style: UIBarButtonItemStyle.plain, target: nil, action: nil)\n        \n        _titleView = UIView()\n        _titleView?.backgroundColor = UIColor.clear\n        \n        _titleButton = UIButton(type: .system)\n        _titleButton?.isEnabled = false\n        _titleButton?.titleLabel?.numberOfLines = 3\n        _titleButton?.setTitleColor(UIColor.lightGray, for:.disabled)\n        _titleButton?.setTitleColor(UIColor.init(red: 0.0, green: 0.5, blue: 1.0, alpha: 1), for:UIControlState())\n        _titleButton?.backgroundColor = UIColor.clear\n        _titleButton?.titleLabel?.textAlignment = .center\n        _titleButton?.setTitle(title, for: UIControlState())\n        titleFont = UIFont.systemFont(ofSize: 13.0)\n        _titleButton?.titleLabel?.font = self.titleFont\n        _titleView?.addSubview(_titleButton!)\n        \n#if swift(>=3.2)\n        if #available(iOS 11, *) {\n            \n            var layoutDefaultLowPriority : UILayoutPriority\n            var layoutDefaultHighPriority : UILayoutPriority\n\n            #if swift(>=4.0)\n                let layoutPriorityLowValue = UILayoutPriority.defaultLow.rawValue-1\n                let layoutPriorityHighValue = UILayoutPriority.defaultHigh.rawValue-1\n                layoutDefaultLowPriority = UILayoutPriority(rawValue: layoutPriorityLowValue)\n                layoutDefaultHighPriority = UILayoutPriority(rawValue: layoutPriorityHighValue)\n            #else\n                layoutDefaultLowPriority = UILayoutPriorityDefaultLow-1\n                layoutDefaultHighPriority = UILayoutPriorityDefaultHigh-1\n            #endif\n            \n            _titleView?.translatesAutoresizingMaskIntoConstraints = false\n            _titleView?.setContentHuggingPriority(layoutDefaultLowPriority, for: .vertical)\n            _titleView?.setContentHuggingPriority(layoutDefaultLowPriority, for: .horizontal)\n            _titleView?.setContentCompressionResistancePriority(layoutDefaultHighPriority, for: .vertical)\n            _titleView?.setContentCompressionResistancePriority(layoutDefaultHighPriority, for: .horizontal)\n            \n            _titleButton?.translatesAutoresizingMaskIntoConstraints = false\n            _titleButton?.setContentHuggingPriority(layoutDefaultLowPriority, for: .vertical)\n            _titleButton?.setContentHuggingPriority(layoutDefaultLowPriority, for: .horizontal)\n            _titleButton?.setContentCompressionResistancePriority(layoutDefaultHighPriority, for: .vertical)\n            _titleButton?.setContentCompressionResistancePriority(layoutDefaultHighPriority, for: .horizontal)\n\n            let top = NSLayoutConstraint.init(item: _titleButton!, attribute: .top, relatedBy: .equal, toItem: _titleView, attribute: .top, multiplier: 1, constant: 0)\n            let bottom = NSLayoutConstraint.init(item: _titleButton!, attribute: .bottom, relatedBy: .equal, toItem: _titleView, attribute: .bottom, multiplier: 1, constant: 0)\n            let leading = NSLayoutConstraint.init(item: _titleButton!, attribute: .leading, relatedBy: .equal, toItem: _titleView, attribute: .leading, multiplier: 1, constant: 0)\n            let trailing = NSLayoutConstraint.init(item: _titleButton!, attribute: .trailing, relatedBy: .equal, toItem: _titleView, attribute: .trailing, multiplier: 1, constant: 0)\n            \n            _titleView?.addConstraints([top,bottom,leading,trailing])\n        } else {\n            _titleView?.autoresizingMask = [.flexibleWidth,.flexibleHeight]\n            _titleButton?.autoresizingMask = [.flexibleWidth,.flexibleHeight]\n        }\n#else\n    _titleView?.autoresizingMask = [.flexibleWidth,.flexibleHeight]\n    _titleButton?.autoresizingMask = [.flexibleWidth,.flexibleHeight]\n#endif\n\n        customView = _titleView\n    }\n\n    required public init?(coder aDecoder: NSCoder) {\n        super.init(coder: aDecoder)\n    }\n}\n"
  },
  {
    "path": "Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQToolbar.swift",
    "content": "//\n//  IQToolbar.swift\n// https://github.com/hackiftekhar/IQKeyboardManager\n// Copyright (c) 2013-16 Iftekhar Qurashi.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nimport UIKit\n\n/** @abstract   IQToolbar for IQKeyboardManager.    */\nopen class IQToolbar: UIToolbar , UIInputViewAudioFeedback {\n\n    private static var _classInitialize: Void = classInitialize()\n    \n    private class func classInitialize() {\n        \n        let  appearanceProxy = self.appearance()\n\n        appearanceProxy.barTintColor = nil\n        \n        let positions : [UIBarPosition] = [.any,.bottom,.top,.topAttached];\n\n        for position in positions {\n\n            appearanceProxy.setBackgroundImage(nil, forToolbarPosition: position, barMetrics: .default)\n            appearanceProxy.setShadowImage(nil, forToolbarPosition: .any)\n        }\n\n        //Background color\n        appearanceProxy.backgroundColor = nil\n    }\n    \n    /**\n     Previous bar button of toolbar.\n     */\n    private var privatePreviousBarButton: IQBarButtonItem?\n    open var previousBarButton : IQBarButtonItem {\n        get {\n            if privatePreviousBarButton == nil {\n                privatePreviousBarButton = IQBarButtonItem(image: nil, style: .plain, target: nil, action: nil)\n                privatePreviousBarButton?.accessibilityLabel = \"Toolbar Previous Button\"\n            }\n            return privatePreviousBarButton!\n        }\n        \n        set (newValue) {\n            privatePreviousBarButton = newValue\n        }\n    }\n    \n    /**\n     Next bar button of toolbar.\n     */\n    private var privateNextBarButton: IQBarButtonItem?\n    open var nextBarButton : IQBarButtonItem {\n        get {\n            if privateNextBarButton == nil {\n                privateNextBarButton = IQBarButtonItem(image: nil, style: .plain, target: nil, action: nil)\n                privateNextBarButton?.accessibilityLabel = \"Toolbar Next Button\"\n            }\n            return privateNextBarButton!\n        }\n        \n        set (newValue) {\n            privateNextBarButton = newValue\n        }\n    }\n    \n    /**\n     Title bar button of toolbar.\n     */\n    private var privateTitleBarButton: IQTitleBarButtonItem?\n    open var titleBarButton : IQTitleBarButtonItem {\n        get {\n            if privateTitleBarButton == nil {\n                privateTitleBarButton = IQTitleBarButtonItem(title: nil)\n                privateTitleBarButton?.accessibilityLabel = \"Toolbar Title Button\"\n            }\n            return privateTitleBarButton!\n        }\n        \n        set (newValue) {\n            privateTitleBarButton = newValue\n        }\n    }\n    \n    /**\n     Done bar button of toolbar.\n     */\n    private var privateDoneBarButton: IQBarButtonItem?\n    open var doneBarButton : IQBarButtonItem {\n        get {\n            if privateDoneBarButton == nil {\n                privateDoneBarButton = IQBarButtonItem(title: nil, style: .done, target: nil, action: nil)\n                privateDoneBarButton?.accessibilityLabel = \"Toolbar Done Button\"\n            }\n            return privateDoneBarButton!\n        }\n        \n        set (newValue) {\n            privateDoneBarButton = newValue\n        }\n    }\n\n    override init(frame: CGRect) {\n        _ = IQToolbar._classInitialize\n        super.init(frame: frame)\n        \n        sizeToFit()\n        autoresizingMask = UIViewAutoresizing.flexibleWidth\n        self.isTranslucent = true\n    }\n    \n    required public init?(coder aDecoder: NSCoder) {\n        _ = IQToolbar._classInitialize\n        super.init(coder: aDecoder)\n\n        sizeToFit()\n        autoresizingMask = UIViewAutoresizing.flexibleWidth\n        self.isTranslucent = true\n    }\n\n    override open func sizeThatFits(_ size: CGSize) -> CGSize {\n        var sizeThatFit = super.sizeThatFits(size)\n        sizeThatFit.height = 44\n        return sizeThatFit\n    }\n\n    override open var tintColor: UIColor! {\n        \n        didSet {\n            if let unwrappedItems = items {\n                for item in unwrappedItems {\n                    item.tintColor = tintColor\n                }\n            }\n        }\n    }\n    \n    override open var barStyle: UIBarStyle {\n        didSet {\n            \n            if barStyle == .default {\n                titleBarButton.selectableTextColor = UIColor.init(red: 0.0, green: 0.5, blue: 1.0, alpha: 1)\n            } else {\n                titleBarButton.selectableTextColor = UIColor.yellow\n            }\n        }\n    }\n    \n    override open func layoutSubviews() {\n\n        super.layoutSubviews()\n\n        //If running on Xcode9 (iOS11) only then we'll validate for iOS version, otherwise for older versions of Xcode (iOS10 and below) we'll just execute the tweak\n#if swift(>=3.2)\n\n        if #available(iOS 11, *) {\n            return\n        } else {\n            var leftRect = CGRect.null\n            var rightRect = CGRect.null\n            var isTitleBarButtonFound = false\n            \n            let sortedSubviews = self.subviews.sorted(by: { (view1 : UIView, view2 : UIView) -> Bool in\n                \n                let x1 = view1.frame.minX\n                let y1 = view1.frame.minY\n                let x2 = view2.frame.minX\n                let y2 = view2.frame.minY\n                \n                if x1 != x2 {\n                    return x1 < x2\n                } else {\n                    return y1 < y2\n                }\n            })\n            \n            for barButtonItemView in sortedSubviews {\n                \n                if isTitleBarButtonFound == true {\n                    rightRect = barButtonItemView.frame\n                    break\n                } else if type(of: barButtonItemView) === UIView.self {\n                    isTitleBarButtonFound = true\n                    //If it's UIToolbarButton or UIToolbarTextButton (which actually UIBarButtonItem)\n                } else if barButtonItemView.isKind(of: UIControl.self) == true {\n                    leftRect = barButtonItemView.frame\n                }\n            }\n            \n            var x : CGFloat = 16\n            \n            if (leftRect.isNull == false) {\n                x = leftRect.maxX + 16\n            }\n            \n            let width : CGFloat = self.frame.width - 32 - (leftRect.isNull ? 0 : leftRect.maxX) - (rightRect.isNull ? 0 : self.frame.width - rightRect.minX)\n            \n            \n            if let unwrappedItems = items {\n                for item in unwrappedItems {\n                    \n                    if let newItem = item as? IQTitleBarButtonItem {\n                        \n                        let titleRect = CGRect(x: x, y: 0, width: width, height: self.frame.size.height)\n                        newItem.customView?.frame = titleRect\n                        break\n                    }\n                }\n            }\n        }\n    \n#else\n\n        var leftRect = CGRect.null\n        var rightRect = CGRect.null\n        var isTitleBarButtonFound = false\n    \n        let sortedSubviews = self.subviews.sorted(by: { (view1 : UIView, view2 : UIView) -> Bool in\n        \n            let x1 = view1.frame.minX\n            let y1 = view1.frame.minY\n            let x2 = view2.frame.minX\n            let y2 = view2.frame.minY\n        \n            if x1 != x2 {\n                return x1 < x2\n            } else {\n                return y1 < y2\n            }\n        })\n    \n        for barButtonItemView in sortedSubviews {\n        \n            if isTitleBarButtonFound == true {\n                rightRect = barButtonItemView.frame\n                break\n            } else if type(of: barButtonItemView) === UIView.self {\n                isTitleBarButtonFound = true\n            //If it's UIToolbarButton or UIToolbarTextButton (which actually UIBarButtonItem)\n            } else if barButtonItemView.isKind(of: UIControl.self) == true {\n                leftRect = barButtonItemView.frame\n            }\n        }\n    \n        var x : CGFloat = 16\n    \n        if (leftRect.isNull == false) {\n            x = leftRect.maxX + 16\n        }\n    \n        let width : CGFloat = self.frame.width - 32 - (leftRect.isNull ? 0 : leftRect.maxX) - (rightRect.isNull ? 0 : self.frame.width - rightRect.minX)\n    \n    \n        if let unwrappedItems = items {\n            for item in unwrappedItems {\n            \n                if let newItem = item as? IQTitleBarButtonItem {\n                \n                    let titleRect = CGRect(x: x, y: 0, width: width, height: self.frame.size.height)\n                    newItem.customView?.frame = titleRect\n                    break\n                }\n            }\n        }\n#endif\n    }\n    \n    open var enableInputClicksWhenVisible: Bool {\n        return true\n    }\n}\n"
  },
  {
    "path": "Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQToolbar/IQUIView+IQKeyboardToolbar.swift",
    "content": "//\n//  IQUIView+IQKeyboardToolbar.swift\n// https://github.com/hackiftekhar/IQKeyboardManager\n// Copyright (c) 2013-16 Iftekhar Qurashi.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\nimport UIKit\nfileprivate func < <T : Comparable>(lhs: T?, rhs: T?) -> Bool {\n  switch (lhs, rhs) {\n  case let (l?, r?):\n    return l < r\n  case (nil, _?):\n    return true\n  default:\n    return false\n  }\n}\n\nfileprivate func > <T : Comparable>(lhs: T?, rhs: T?) -> Bool {\n  switch (lhs, rhs) {\n  case let (l?, r?):\n    return l > r\n  default:\n    return rhs < lhs\n  }\n}\n\nprivate var kIQShouldHideToolbarPlaceholder = \"kIQShouldHideToolbarPlaceholder\"\nprivate var kIQToolbarPlaceholder           = \"kIQToolbarPlaceholder\"\n\nprivate var kIQKeyboardToolbar              = \"kIQKeyboardToolbar\"\n\n/**\nUIView category methods to add IQToolbar on UIKeyboard.\n*/\npublic extension UIView {\n    \n    /**\n     IQToolbar references for better customization control.\n     */\n    public var keyboardToolbar: IQToolbar {\n        get {\n            var toolbar = inputAccessoryView as? IQToolbar\n            \n            if (toolbar == nil)\n            {\n                toolbar = objc_getAssociatedObject(self, &kIQKeyboardToolbar) as? IQToolbar\n            }\n            \n            if let unwrappedToolbar = toolbar {\n                \n                return unwrappedToolbar\n\n            } else {\n                \n                let newToolbar = IQToolbar()\n                \n                objc_setAssociatedObject(self, &kIQKeyboardToolbar, newToolbar, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n\n                return newToolbar\n            }\n        }\n    }\n    \n    ///-------------------------\n    /// MARK: Title\n    ///-------------------------\n    \n    /**\n    If `shouldHideToolbarPlaceholder` is YES, then title will not be added to the toolbar. Default to NO.\n    */\n    public var shouldHideToolbarPlaceholder: Bool {\n        get {\n            let aValue = objc_getAssociatedObject(self, &kIQShouldHideToolbarPlaceholder) as Any?\n            \n            if let unwrapedValue = aValue as? Bool {\n                return unwrapedValue\n            } else {\n                return false\n            }\n        }\n        set(newValue) {\n            objc_setAssociatedObject(self, &kIQShouldHideToolbarPlaceholder, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n            \n            self.keyboardToolbar.titleBarButton.title = self.drawingToolbarPlaceholder\n        }\n    }\n\n    @available(*,deprecated, message: \"This is renamed to `shouldHideToolbarPlaceholder` for more clear naming.\")\n    public var shouldHidePlaceholderText: Bool {\n        get {\n            return shouldHideToolbarPlaceholder\n        }\n        set(newValue) {\n            shouldHideToolbarPlaceholder = newValue\n        }\n    }\n    \n    /**\n     `toolbarPlaceholder` to override default `placeholder` text when drawing text on toolbar.\n     */\n    public var toolbarPlaceholder: String? {\n        get {\n            let aValue = objc_getAssociatedObject(self, &kIQToolbarPlaceholder) as? String\n            \n            return aValue\n        }\n        set(newValue) {\n            objc_setAssociatedObject(self, &kIQToolbarPlaceholder, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n            \n            self.keyboardToolbar.titleBarButton.title = self.drawingToolbarPlaceholder\n        }\n    }\n\n    @available(*,deprecated, message: \"This is renamed to `toolbarPlaceholder` for more clear naming.\")\n    public var placeholderText: String? {\n        get {\n            return toolbarPlaceholder\n        }\n        set(newValue) {\n            toolbarPlaceholder = newValue\n        }\n    }\n    \n    /**\n     `drawingToolbarPlaceholder` will be actual text used to draw on toolbar. This would either `placeholder` or `toolbarPlaceholder`.\n     */\n    public var drawingToolbarPlaceholder: String? {\n\n        if (self.shouldHideToolbarPlaceholder)\n        {\n            return nil\n        }\n        else if (self.toolbarPlaceholder?.isEmpty == false) {\n            return self.toolbarPlaceholder\n        }\n        else if self.responds(to: #selector(getter: UITextField.placeholder)) {\n            \n            if let textField = self as? UITextField {\n                return textField.placeholder\n            } else if let textView = self as? IQTextView {\n                return textView.placeholder\n            } else {\n                return nil\n            }\n        }\n        else {\n            return nil\n        }\n    }\n\n    @available(*,deprecated, message: \"This is renamed to `drawingToolbarPlaceholder` for more clear naming.\")\n    public var drawingPlaceholderText: String? {\n        \n        return drawingToolbarPlaceholder\n    }\n    \n    ///---------------------\n    /// MARK: Private helper\n    ///---------------------\n    \n    fileprivate static func flexibleBarButtonItem () -> IQBarButtonItem {\n        \n        struct Static {\n            static let nilButton = IQBarButtonItem(barButtonSystemItem:UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)\n        }\n        \n        Static.nilButton.isSystemItem = true\n        return Static.nilButton\n    }\n\n    ///------------\n    /// MARK: Done\n    ///------------\n    \n    /**\n    Helper function to add Done button on keyboard.\n    \n    @param target Target object for selector.\n    @param action Done button action name. Usually 'doneAction:(IQBarButtonItem*)item'.\n    */\n    public func addDoneOnKeyboardWithTarget(_ target : AnyObject?, action : Selector) {\n        \n        addDoneOnKeyboardWithTarget(target, action: action, titleText: nil)\n    }\n\n    /**\n    Helper function to add Done button on keyboard.\n    \n    @param target Target object for selector.\n    @param action Done button action name. Usually 'doneAction:(IQBarButtonItem*)item'.\n    @param titleText text to show as title in IQToolbar'.\n    */\n    public func addDoneOnKeyboardWithTarget (_ target : AnyObject?, action : Selector, titleText: String?) {\n        \n        //If can't set InputAccessoryView. Then return\n        if self.responds(to: #selector(setter: UITextField.inputAccessoryView)) {\n            \n            //  Creating a toolBar for phoneNumber keyboard\n            let toolbar = self.keyboardToolbar\n            \n            var items : [IQBarButtonItem] = []\n            \n            //Flexible space\n            items.append(UIView.flexibleBarButtonItem())\n\n            //Title button\n            toolbar.titleBarButton.title = shouldHideToolbarPlaceholder == true ? nil : titleText\n            \n            #if swift(>=3.2)\n                if #available(iOS 11, *) {}\n                else {\n                    toolbar.titleBarButton.customView?.frame = CGRect.zero\n                }\n            #else\n                toolbar.titleBarButton.customView?.frame = CGRect.zero\n            #endif\n\n            items.append(toolbar.titleBarButton)\n            \n            //Flexible space\n            items.append(UIView.flexibleBarButtonItem())\n\n            //Done button\n            var doneButton = toolbar.doneBarButton\n            if doneButton.isSystemItem == false {\n                doneButton = IQBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.done, target: target, action: action)\n                doneButton.isSystemItem = true\n                doneButton.invocation = toolbar.doneBarButton.invocation\n                doneButton.accessibilityLabel = toolbar.doneBarButton.accessibilityLabel\n                toolbar.doneBarButton = doneButton\n            }\n\n            items.append(doneButton)\n            \n            //  Adding button to toolBar.\n            toolbar.items = items\n            \n            //  Setting toolbar to keyboard.\n            if let textField = self as? UITextField {\n                textField.inputAccessoryView = toolbar\n\n                switch textField.keyboardAppearance {\n                case UIKeyboardAppearance.dark:\n                    toolbar.barStyle = UIBarStyle.black\n                default:\n                    toolbar.barStyle = UIBarStyle.default\n                }\n            } else if let textView = self as? UITextView {\n                textView.inputAccessoryView = toolbar\n\n                switch textView.keyboardAppearance {\n                case UIKeyboardAppearance.dark:\n                    toolbar.barStyle = UIBarStyle.black\n                default:\n                    toolbar.barStyle = UIBarStyle.default\n                }\n           }\n        }\n    }\n    \n    /**\n    Helper function to add Done button on keyboard.\n    \n    @param target Target object for selector.\n    @param action Done button action name. Usually 'doneAction:(IQBarButtonItem*)item'.\n    @param shouldShowPlaceholder A boolean to indicate whether to show textField placeholder on IQToolbar'.\n    */\n    public func addDoneOnKeyboardWithTarget (_ target : AnyObject?, action : Selector, shouldShowPlaceholder: Bool) {\n        \n        var title : String?\n        \n        if shouldShowPlaceholder == true {\n            title = self.drawingToolbarPlaceholder\n        }\n        \n        addDoneOnKeyboardWithTarget(target, action: action, titleText: title)\n    }\n    \n\n    ///------------\n    /// MARK: Right\n    ///------------\n\n    /**\n     Helper function to add Right button on keyboard.\n     \n     @param image Image icon to use as right button.\n     @param target Target object for selector.\n     @param action Right button action name. Usually 'doneAction:(IQBarButtonItem*)item'.\n     @param titleText text to show as title in IQToolbar'.\n     */\n    public func addRightButtonOnKeyboardWithImage (_ image : UIImage, target : AnyObject?, action : Selector, titleText: String?) {\n        \n        //If can't set InputAccessoryView. Then return\n        if self.responds(to: #selector(setter: UITextField.inputAccessoryView)) {\n            \n            //  Creating a toolBar for phoneNumber keyboard\n            let toolbar = self.keyboardToolbar\n            \n            var items : [IQBarButtonItem] = []\n            \n            //Flexible space\n            items.append(UIView.flexibleBarButtonItem())\n\n            //Title button\n            toolbar.titleBarButton.title = shouldHideToolbarPlaceholder == true ? nil : titleText\n\n            #if swift(>=3.2)\n                if #available(iOS 11, *) {}\n                else {\n                    toolbar.titleBarButton.customView?.frame = CGRect.zero\n                }\n            #else\n                toolbar.titleBarButton.customView?.frame = CGRect.zero\n            #endif\n\n            items.append(toolbar.titleBarButton)\n            \n            //Flexible space\n            items.append(UIView.flexibleBarButtonItem())\n            \n            //Right button\n            var doneButton = toolbar.doneBarButton\n            if doneButton.isSystemItem == false {\n                doneButton.title = nil\n                doneButton.image = image\n                doneButton.target = target\n                doneButton.action = action\n            }\n            else\n            {\n                doneButton = IQBarButtonItem(image: image, style: UIBarButtonItemStyle.done, target: target, action: action)\n                doneButton.invocation = toolbar.doneBarButton.invocation\n                doneButton.accessibilityLabel = toolbar.doneBarButton.accessibilityLabel\n                toolbar.doneBarButton = doneButton\n            }\n\n            items.append(doneButton)\n            \n            //  Adding button to toolBar.\n            toolbar.items = items\n\n            //  Setting toolbar to keyboard.\n            if let textField = self as? UITextField {\n                textField.inputAccessoryView = toolbar\n                \n                switch textField.keyboardAppearance {\n                case UIKeyboardAppearance.dark:\n                    toolbar.barStyle = UIBarStyle.black\n                default:\n                    toolbar.barStyle = UIBarStyle.default\n                }\n            } else if let textView = self as? UITextView {\n                textView.inputAccessoryView = toolbar\n                \n                switch textView.keyboardAppearance {\n                case UIKeyboardAppearance.dark:\n                    toolbar.barStyle = UIBarStyle.black\n                default:\n                    toolbar.barStyle = UIBarStyle.default\n                }\n            }\n        }\n    }\n    \n    /**\n     Helper function to add Right button on keyboard.\n     \n     @param image Image icon to use as right button.\n     @param target Target object for selector.\n     @param action Right button action name. Usually 'doneAction:(IQBarButtonItem*)item'.\n     @param shouldShowPlaceholder A boolean to indicate whether to show textField placeholder on IQToolbar'.\n     */\n    public func addRightButtonOnKeyboardWithImage (_ image : UIImage, target : AnyObject?, action : Selector, shouldShowPlaceholder: Bool) {\n        \n        var title : String?\n        \n        if shouldShowPlaceholder == true {\n            title = self.drawingToolbarPlaceholder\n        }\n        \n        addRightButtonOnKeyboardWithImage(image, target: target, action: action, titleText: title)\n    }\n    \n    /**\n    Helper function to add Right button on keyboard.\n    \n    @param text Title for rightBarButtonItem, usually 'Done'.\n    @param target Target object for selector.\n    @param action Right button action name. Usually 'doneAction:(IQBarButtonItem*)item'.\n    */\n    public func addRightButtonOnKeyboardWithText (_ text : String, target : AnyObject?, action : Selector) {\n        \n        addRightButtonOnKeyboardWithText(text, target: target, action: action, titleText: nil)\n    }\n    \n    /**\n    Helper function to add Right button on keyboard.\n    \n    @param text Title for rightBarButtonItem, usually 'Done'.\n    @param target Target object for selector.\n    @param action Right button action name. Usually 'doneAction:(IQBarButtonItem*)item'.\n    @param titleText text to show as title in IQToolbar'.\n    */\n    public func addRightButtonOnKeyboardWithText (_ text : String, target : AnyObject?, action : Selector, titleText: String?) {\n        \n        //If can't set InputAccessoryView. Then return\n        if self.responds(to: #selector(setter: UITextField.inputAccessoryView)) {\n\n            //  Creating a toolBar for phoneNumber keyboard\n            let toolbar = self.keyboardToolbar\n            \n            var items : [IQBarButtonItem] = []\n            \n            //Flexible space\n            items.append(UIView.flexibleBarButtonItem())\n\n            //Title button\n            toolbar.titleBarButton.title = shouldHideToolbarPlaceholder == true ? nil : titleText\n            \n            #if swift(>=3.2)\n                if #available(iOS 11, *) {}\n                else {\n                    toolbar.titleBarButton.customView?.frame = CGRect.zero\n                }\n            #else\n                toolbar.titleBarButton.customView?.frame = CGRect.zero\n            #endif\n\n            items.append(toolbar.titleBarButton)\n            \n            //Flexible space\n            items.append(UIView.flexibleBarButtonItem())\n            \n            //Right button\n            var doneButton = toolbar.doneBarButton\n            if doneButton.isSystemItem == false {\n                doneButton.title = text\n                doneButton.image = nil\n                doneButton.target = target\n                doneButton.action = action\n            }\n            else\n            {\n                doneButton = IQBarButtonItem(title: text, style: UIBarButtonItemStyle.done, target: target, action: action)\n                doneButton.invocation = toolbar.doneBarButton.invocation\n                doneButton.accessibilityLabel = toolbar.doneBarButton.accessibilityLabel\n                toolbar.doneBarButton = doneButton\n            }\n\n            items.append(doneButton)\n            \n            //  Adding button to toolBar.\n            toolbar.items = items\n\n            //  Setting toolbar to keyboard.\n            if let textField = self as? UITextField {\n                textField.inputAccessoryView = toolbar\n                \n                switch textField.keyboardAppearance {\n                case UIKeyboardAppearance.dark:\n                    toolbar.barStyle = UIBarStyle.black\n                default:\n                    toolbar.barStyle = UIBarStyle.default\n                }\n            } else if let textView = self as? UITextView {\n                textView.inputAccessoryView = toolbar\n                \n                switch textView.keyboardAppearance {\n                case UIKeyboardAppearance.dark:\n                    toolbar.barStyle = UIBarStyle.black\n                default:\n                    toolbar.barStyle = UIBarStyle.default\n                }\n            }\n        }\n    }\n    \n    /**\n    Helper function to add Right button on keyboard.\n    \n    @param text Title for rightBarButtonItem, usually 'Done'.\n    @param target Target object for selector.\n    @param action Right button action name. Usually 'doneAction:(IQBarButtonItem*)item'.\n    @param shouldShowPlaceholder A boolean to indicate whether to show textField placeholder on IQToolbar'.\n    */\n    public func addRightButtonOnKeyboardWithText (_ text : String, target : AnyObject?, action : Selector, shouldShowPlaceholder: Bool) {\n        \n        var title : String?\n\n        if shouldShowPlaceholder == true {\n            title = self.drawingToolbarPlaceholder\n        }\n        \n        addRightButtonOnKeyboardWithText(text, target: target, action: action, titleText: title)\n    }\n    \n\n    ///------------------\n    /// MARK: Cancel/Done\n    ///------------------\n    \n    /**\n    Helper function to add Cancel and Done button on keyboard.\n    \n    @param target Target object for selector.\n    @param cancelAction Cancel button action name. Usually 'cancelAction:(IQBarButtonItem*)item'.\n    @param doneAction Done button action name. Usually 'doneAction:(IQBarButtonItem*)item'.\n    */\n    public func addCancelDoneOnKeyboardWithTarget (_ target : AnyObject?, cancelAction : Selector, doneAction : Selector) {\n        \n        addCancelDoneOnKeyboardWithTarget(target, cancelAction: cancelAction, doneAction: doneAction, titleText: nil)\n    }\n\n    /**\n    Helper function to add Cancel and Done button on keyboard.\n    \n    @param target Target object for selector.\n    @param cancelAction Cancel button action name. Usually 'cancelAction:(IQBarButtonItem*)item'.\n    @param doneAction Done button action name. Usually 'doneAction:(IQBarButtonItem*)item'.\n    @param titleText text to show as title in IQToolbar'.\n    */\n    public func addCancelDoneOnKeyboardWithTarget (_ target : AnyObject?, cancelAction : Selector, doneAction : Selector, titleText: String?) {\n        \n        //If can't set InputAccessoryView. Then return\n        if self.responds(to: #selector(setter: UITextField.inputAccessoryView)) {\n            //  Creating a toolBar for phoneNumber keyboard\n            let toolbar = self.keyboardToolbar\n            \n            var items : [IQBarButtonItem] = []\n            \n            //Cancel button\n            var cancelButton = toolbar.previousBarButton\n            if cancelButton.isSystemItem == false {\n                cancelButton = IQBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.cancel, target: target, action: cancelAction)\n                cancelButton.isSystemItem = true\n                cancelButton.invocation = toolbar.previousBarButton.invocation\n                cancelButton.accessibilityLabel = toolbar.previousBarButton.accessibilityLabel\n                toolbar.previousBarButton = cancelButton\n            }\n\n            items.append(cancelButton)\n            \n            //Flexible space\n            items.append(UIView.flexibleBarButtonItem())\n            \n            //Title\n            toolbar.titleBarButton.title = shouldHideToolbarPlaceholder == true ? nil : titleText\n            \n            #if swift(>=3.2)\n                if #available(iOS 11, *) {}\n                else {\n                    toolbar.titleBarButton.customView?.frame = CGRect.zero\n                }\n            #else\n                toolbar.titleBarButton.customView?.frame = CGRect.zero\n            #endif\n\n            items.append(toolbar.titleBarButton)\n            \n            //Flexible space\n            items.append(UIView.flexibleBarButtonItem())\n            \n            //Done button\n            var doneButton = toolbar.doneBarButton\n            if doneButton.isSystemItem == false {\n                doneButton = IQBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.done, target: target, action: doneAction)\n                doneButton.isSystemItem = true\n                doneButton.invocation = toolbar.doneBarButton.invocation\n                doneButton.accessibilityLabel = toolbar.doneBarButton.accessibilityLabel\n                toolbar.doneBarButton = doneButton\n            }\n\n            items.append(doneButton)\n            \n            //  Adding button to toolBar.\n            toolbar.items = items\n\n            //  Setting toolbar to keyboard.\n            if let textField = self as? UITextField {\n                textField.inputAccessoryView = toolbar\n                \n                switch textField.keyboardAppearance {\n                case UIKeyboardAppearance.dark:\n                    toolbar.barStyle = UIBarStyle.black\n                default:\n                    toolbar.barStyle = UIBarStyle.default\n                }\n            } else if let textView = self as? UITextView {\n                textView.inputAccessoryView = toolbar\n                \n                switch textView.keyboardAppearance {\n                case UIKeyboardAppearance.dark:\n                    toolbar.barStyle = UIBarStyle.black\n                default:\n                    toolbar.barStyle = UIBarStyle.default\n                }\n            }\n        }\n    }\n    \n    /**\n    Helper function to add Cancel and Done button on keyboard.\n    \n    @param target Target object for selector.\n    @param cancelAction Cancel button action name. Usually 'cancelAction:(IQBarButtonItem*)item'.\n    @param doneAction Done button action name. Usually 'doneAction:(IQBarButtonItem*)item'.\n    @param shouldShowPlaceholder A boolean to indicate whether to show textField placeholder on IQToolbar'.\n    */\n    public func addCancelDoneOnKeyboardWithTarget (_ target : AnyObject?, cancelAction : Selector, doneAction : Selector, shouldShowPlaceholder: Bool) {\n        \n        var title : String?\n        \n        if shouldShowPlaceholder == true {\n            title = self.drawingToolbarPlaceholder\n        }\n        \n        addCancelDoneOnKeyboardWithTarget(target, cancelAction: cancelAction, doneAction: doneAction, titleText: title)\n    }\n    \n\n    ///-----------------\n    /// MARK: Right/Left\n    ///-----------------\n    \n    /**\n    Helper function to add Left and Right button on keyboard.\n    \n    @param target Target object for selector.\n    @param leftButtonTitle Title for leftBarButtonItem, usually 'Cancel'.\n    @param rightButtonTitle Title for rightBarButtonItem, usually 'Done'.\n    @param leftButtonAction Left button action name. Usually 'cancelAction:(IQBarButtonItem*)item'.\n    @param rightButtonAction Right button action name. Usually 'doneAction:(IQBarButtonItem*)item'.\n    */\n    public func addRightLeftOnKeyboardWithTarget( _ target : AnyObject?, leftButtonTitle : String, rightButtonTitle : String, rightButtonAction : Selector, leftButtonAction : Selector) {\n        \n        addRightLeftOnKeyboardWithTarget(target, leftButtonTitle: leftButtonTitle, rightButtonTitle: rightButtonTitle, rightButtonAction: rightButtonAction, leftButtonAction: leftButtonAction, titleText: nil)\n    }\n    \n    /**\n    Helper function to add Left and Right button on keyboard.\n    \n    @param target Target object for selector.\n    @param leftButtonTitle Title for leftBarButtonItem, usually 'Cancel'.\n    @param rightButtonTitle Title for rightBarButtonItem, usually 'Done'.\n    @param leftButtonAction Left button action name. Usually 'cancelAction:(IQBarButtonItem*)item'.\n    @param rightButtonAction Right button action name. Usually 'doneAction:(IQBarButtonItem*)item'.\n    @param titleText text to show as title in IQToolbar'.\n    */\n    public func addRightLeftOnKeyboardWithTarget( _ target : AnyObject?, leftButtonTitle : String, rightButtonTitle : String, rightButtonAction : Selector, leftButtonAction : Selector, titleText: String?) {\n        \n        //If can't set InputAccessoryView. Then return\n        if self.responds(to: #selector(setter: UITextField.inputAccessoryView)) {\n            //  Creating a toolBar for phoneNumber keyboard\n            let toolbar = self.keyboardToolbar\n            \n            var items : [IQBarButtonItem] = []\n            \n            //Left button\n            var cancelButton = toolbar.previousBarButton\n            if cancelButton.isSystemItem == false {\n                cancelButton.title = rightButtonTitle\n                cancelButton.image = nil\n                cancelButton.target = target\n                cancelButton.action = rightButtonAction\n            }\n            else\n            {\n                cancelButton = IQBarButtonItem(title: leftButtonTitle, style: UIBarButtonItemStyle.plain, target: target, action: leftButtonAction)\n                cancelButton.invocation = toolbar.previousBarButton.invocation\n                cancelButton.accessibilityLabel = toolbar.previousBarButton.accessibilityLabel\n                toolbar.previousBarButton = cancelButton\n            }\n\n            items.append(cancelButton)\n            \n            //Flexible space\n            items.append(UIView.flexibleBarButtonItem())\n            \n            //Title button\n            toolbar.titleBarButton.title = shouldHideToolbarPlaceholder == true ? nil : titleText\n            \n            #if swift(>=3.2)\n                if #available(iOS 11, *) {}\n                else {\n                    toolbar.titleBarButton.customView?.frame = CGRect.zero\n                }\n            #else\n                toolbar.titleBarButton.customView?.frame = CGRect.zero\n            #endif\n\n            items.append(toolbar.titleBarButton)\n            \n            //Flexible space\n            items.append(UIView.flexibleBarButtonItem())\n            \n            //Right button\n            var doneButton = toolbar.doneBarButton\n            if doneButton.isSystemItem == false {\n                doneButton.title = rightButtonTitle\n                doneButton.image = nil\n                doneButton.target = target\n                doneButton.action = rightButtonAction\n            }\n            else\n            {\n                doneButton = IQBarButtonItem(title: rightButtonTitle, style: UIBarButtonItemStyle.done, target: target, action: rightButtonAction)\n                doneButton.invocation = toolbar.doneBarButton.invocation\n                doneButton.accessibilityLabel = toolbar.doneBarButton.accessibilityLabel\n                toolbar.doneBarButton = doneButton\n            }\n\n            items.append(doneButton)\n            \n            //  Adding button to toolBar.\n            toolbar.items = items\n\n            //  Setting toolbar to keyboard.\n            if let textField = self as? UITextField {\n                textField.inputAccessoryView = toolbar\n                \n                switch textField.keyboardAppearance {\n                case UIKeyboardAppearance.dark:\n                    toolbar.barStyle = UIBarStyle.black\n                default:\n                    toolbar.barStyle = UIBarStyle.default\n                }\n            } else if let textView = self as? UITextView {\n                textView.inputAccessoryView = toolbar\n                \n                switch textView.keyboardAppearance {\n                case UIKeyboardAppearance.dark:\n                    toolbar.barStyle = UIBarStyle.black\n                default:\n                    toolbar.barStyle = UIBarStyle.default\n                }\n            }\n        }\n    }\n    \n    /**\n    Helper function to add Left and Right button on keyboard.\n    \n    @param target Target object for selector.\n    @param leftButtonTitle Title for leftBarButtonItem, usually 'Cancel'.\n    @param rightButtonTitle Title for rightBarButtonItem, usually 'Done'.\n    @param leftButtonAction Left button action name. Usually 'cancelAction:(IQBarButtonItem*)item'.\n    @param rightButtonAction Right button action name. Usually 'doneAction:(IQBarButtonItem*)item'.\n    @param shouldShowPlaceholder A boolean to indicate whether to show textField placeholder on IQToolbar'.\n    */\n    public func addRightLeftOnKeyboardWithTarget( _ target : AnyObject?, leftButtonTitle : String, rightButtonTitle : String, rightButtonAction : Selector, leftButtonAction : Selector, shouldShowPlaceholder: Bool) {\n        \n        var title : String?\n        \n        if shouldShowPlaceholder == true {\n            title = self.drawingToolbarPlaceholder\n        }\n        \n        addRightLeftOnKeyboardWithTarget(target, leftButtonTitle: leftButtonTitle, rightButtonTitle: rightButtonTitle, rightButtonAction: rightButtonAction, leftButtonAction: leftButtonAction, titleText: title)\n    }\n    \n    \n    ///-------------------------\n    /// MARK: Previous/Next/Done\n    ///-------------------------\n    \n    /**\n    Helper function to add ArrowNextPrevious and Done button on keyboard.\n    \n    @param target Target object for selector.\n    @param previousAction Previous button action name. Usually 'previousAction:(id)item'.\n    @param nextAction Next button action name. Usually 'nextAction:(id)item'.\n    @param doneAction Done button action name. Usually 'doneAction:(IQBarButtonItem*)item'.\n    */\n    public func addPreviousNextDoneOnKeyboardWithTarget ( _ target : AnyObject?, previousAction : Selector, nextAction : Selector, doneAction : Selector) {\n        \n        addPreviousNextDoneOnKeyboardWithTarget(target, previousAction: previousAction, nextAction: nextAction, doneAction: doneAction, titleText: nil)\n    }\n    \n    /**\n    Helper function to add ArrowNextPrevious and Done button on keyboard.\n    \n    @param target Target object for selector.\n    @param previousAction Previous button action name. Usually 'previousAction:(id)item'.\n    @param nextAction Next button action name. Usually 'nextAction:(id)item'.\n    @param doneAction Done button action name. Usually 'doneAction:(IQBarButtonItem*)item'.\n    @param titleText text to show as title in IQToolbar'.\n    */\n    public func addPreviousNextDoneOnKeyboardWithTarget ( _ target : AnyObject?, previousAction : Selector, nextAction : Selector, doneAction : Selector,  titleText: String?) {\n        \n        //If can't set InputAccessoryView. Then return\n        if self.responds(to: #selector(setter: UITextField.inputAccessoryView)) {\n            //  Creating a toolBar for phoneNumber keyboard\n            let toolbar = self.keyboardToolbar\n            \n            var items : [IQBarButtonItem] = []\n            \n            // Get the top level \"bundle\" which may actually be the framework\n            var bundle = Bundle(for: IQKeyboardManager.self)\n            \n            if let resourcePath = bundle.path(forResource: \"IQKeyboardManager\", ofType: \"bundle\") {\n                if let resourcesBundle = Bundle(path: resourcePath) {\n                    bundle = resourcesBundle\n                }\n            }\n            \n            var imageLeftArrow : UIImage!\n            var imageRightArrow : UIImage!\n            \n            if #available(iOS 10, *) {\n                imageLeftArrow = UIImage(named: \"IQButtonBarArrowUp\", in: bundle, compatibleWith: nil)\n                imageRightArrow = UIImage(named: \"IQButtonBarArrowDown\", in: bundle, compatibleWith: nil)\n            } else {\n                imageLeftArrow = UIImage(named: \"IQButtonBarArrowLeft\", in: bundle, compatibleWith: nil)\n                imageRightArrow = UIImage(named: \"IQButtonBarArrowRight\", in: bundle, compatibleWith: nil)\n            }\n\n            //Support for RTL languages like Arabic, Persia etc... (Bug ID: #448)\n            if #available(iOS 9, *) {\n                imageLeftArrow = imageLeftArrow?.imageFlippedForRightToLeftLayoutDirection()\n                imageRightArrow = imageRightArrow?.imageFlippedForRightToLeftLayoutDirection()\n            }\n\n            var prev = toolbar.previousBarButton\n            if prev.isSystemItem == false {\n                prev.title = nil\n                prev.image = imageLeftArrow\n                prev.target = target\n                prev.action = previousAction\n            }\n            else\n            {\n                prev = IQBarButtonItem(image: imageLeftArrow, style: UIBarButtonItemStyle.plain, target: target, action: previousAction)\n                prev.invocation = toolbar.previousBarButton.invocation\n                prev.accessibilityLabel = toolbar.previousBarButton.accessibilityLabel\n                toolbar.previousBarButton = prev\n            }\n            \n            \n            var next = toolbar.nextBarButton\n            if next.isSystemItem == false {\n                next.title = nil\n                next.image = imageRightArrow\n                next.target = target\n                next.action = nextAction\n            }\n            else\n            {\n                next = IQBarButtonItem(image: imageRightArrow, style: UIBarButtonItemStyle.plain, target: target, action: nextAction)\n                next.invocation = toolbar.nextBarButton.invocation\n                next.accessibilityLabel = toolbar.nextBarButton.accessibilityLabel\n                toolbar.nextBarButton = next\n            }\n\n            //Previous button\n            items.append(prev)\n\n            //Fixed space\n            let fixed = IQBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.fixedSpace, target: nil, action: nil)\n            fixed.isSystemItem = true\n            if #available(iOS 10, *) {\n                fixed.width = 6\n            } else {\n                fixed.width = 20\n            }\n            items.append(fixed)\n\n            //Next button\n            items.append(next)\n            \n            //Flexible space\n            items.append(UIView.flexibleBarButtonItem())\n            \n            //Title button\n            toolbar.titleBarButton.title = shouldHideToolbarPlaceholder == true ? nil : titleText\n            \n            #if swift(>=3.2)\n                if #available(iOS 11, *) {}\n                else {\n                    toolbar.titleBarButton.customView?.frame = CGRect.zero\n                }\n            #else\n                toolbar.titleBarButton.customView?.frame = CGRect.zero\n            #endif\n\n            items.append(toolbar.titleBarButton)\n            \n            //Flexible space\n            items.append(UIView.flexibleBarButtonItem())\n            \n            //Done button\n            var doneButton = toolbar.doneBarButton\n            if doneButton.isSystemItem == false {\n                doneButton = IQBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.done, target: target, action: doneAction)\n                doneButton.isSystemItem = true\n                doneButton.invocation = toolbar.doneBarButton.invocation\n                doneButton.accessibilityLabel = toolbar.doneBarButton.accessibilityLabel\n                toolbar.doneBarButton = doneButton\n            }\n\n            items.append(doneButton)\n            \n            //  Adding button to toolBar.\n            toolbar.items = items\n\n            //  Setting toolbar to keyboard.\n            if let textField = self as? UITextField {\n                textField.inputAccessoryView = toolbar\n                \n                switch textField.keyboardAppearance {\n                case UIKeyboardAppearance.dark:\n                    toolbar.barStyle = UIBarStyle.black\n                default:\n                    toolbar.barStyle = UIBarStyle.default\n                }\n            } else if let textView = self as? UITextView {\n                textView.inputAccessoryView = toolbar\n                \n                switch textView.keyboardAppearance {\n                case UIKeyboardAppearance.dark:\n                    toolbar.barStyle = UIBarStyle.black\n                default:\n                    toolbar.barStyle = UIBarStyle.default\n                }\n            }\n        }\n    }\n    \n    /**\n    Helper function to add ArrowNextPrevious and Done button on keyboard.\n    \n    @param target Target object for selector.\n    @param previousAction Previous button action name. Usually 'previousAction:(id)item'.\n    @param nextAction Next button action name. Usually 'nextAction:(id)item'.\n    @param doneAction Done button action name. Usually 'doneAction:(IQBarButtonItem*)item'.\n    @param shouldShowPlaceholder A boolean to indicate whether to show textField placeholder on IQToolbar'.\n    */\n    public func addPreviousNextDoneOnKeyboardWithTarget ( _ target : AnyObject?, previousAction : Selector, nextAction : Selector, doneAction : Selector, shouldShowPlaceholder: Bool) {\n        \n        var title : String?\n        \n        if shouldShowPlaceholder == true {\n            title = self.drawingToolbarPlaceholder\n        }\n        \n        addPreviousNextDoneOnKeyboardWithTarget(target, previousAction: previousAction, nextAction: nextAction, doneAction: doneAction, titleText: title)\n    }\n    \n    ///--------------------------\n    /// MARK: Previous/Next/Right\n    ///--------------------------\n    \n    /**\n    Helper function to add ArrowNextPrevious and Right button on keyboard.\n    \n    @param target Target object for selector.\n    @param rightButtonTitle Title for rightBarButtonItem, usually 'Done'.\n    @param previousAction Previous button action name. Usually 'previousAction:(id)item'.\n    @param nextAction Next button action name. Usually 'nextAction:(id)item'.\n    @param rightButtonAction RightBarButton action name. Usually 'doneAction:(IQBarButtonItem*)item'.\n    @param titleText text to show as title in IQToolbar'.\n    */\n    public func addPreviousNextRightOnKeyboardWithTarget( _ target : AnyObject?, rightButtonImage : UIImage, previousAction : Selector, nextAction : Selector, rightButtonAction : Selector, titleText : String?) {\n        \n        //If can't set InputAccessoryView. Then return\n        if self.responds(to: #selector(setter: UITextField.inputAccessoryView)) {\n            //  Creating a toolBar for phoneNumber keyboard\n            let toolbar = self.keyboardToolbar\n            \n            var items : [IQBarButtonItem] = []\n            \n            // Get the top level \"bundle\" which may actually be the framework\n            var bundle = Bundle(for: IQKeyboardManager.self)\n            \n            if let resourcePath = bundle.path(forResource: \"IQKeyboardManager\", ofType: \"bundle\") {\n                if let resourcesBundle = Bundle(path: resourcePath) {\n                    bundle = resourcesBundle\n                }\n            }\n            \n            var imageLeftArrow : UIImage!\n            var imageRightArrow : UIImage!\n            \n            if #available(iOS 10, *) {\n                imageLeftArrow = UIImage(named: \"IQButtonBarArrowUp\", in: bundle, compatibleWith: nil)\n                imageRightArrow = UIImage(named: \"IQButtonBarArrowDown\", in: bundle, compatibleWith: nil)\n            } else {\n                imageLeftArrow = UIImage(named: \"IQButtonBarArrowLeft\", in: bundle, compatibleWith: nil)\n                imageRightArrow = UIImage(named: \"IQButtonBarArrowRight\", in: bundle, compatibleWith: nil)\n            }\n            \n            //Support for RTL languages like Arabic, Persia etc... (Bug ID: #448)\n            if #available(iOS 9, *) {\n                imageLeftArrow = imageLeftArrow?.imageFlippedForRightToLeftLayoutDirection()\n                imageRightArrow = imageRightArrow?.imageFlippedForRightToLeftLayoutDirection()\n            }\n            \n            \n            var prev = toolbar.previousBarButton\n            if prev.isSystemItem == false {\n                prev.title = nil\n                prev.image = imageLeftArrow\n                prev.target = target\n                prev.action = previousAction\n            }\n            else\n            {\n                prev = IQBarButtonItem(image: imageLeftArrow, style: UIBarButtonItemStyle.plain, target: target, action: previousAction)\n                prev.invocation = toolbar.previousBarButton.invocation\n                prev.accessibilityLabel = toolbar.previousBarButton.accessibilityLabel\n                toolbar.previousBarButton = prev\n            }\n            \n            \n            var next = toolbar.nextBarButton\n            if next.isSystemItem == false {\n                next.title = nil\n                next.image = imageRightArrow\n                next.target = target\n                next.action = nextAction\n            }\n            else\n            {\n                next = IQBarButtonItem(image: imageRightArrow, style: UIBarButtonItemStyle.plain, target: target, action: nextAction)\n                next.invocation = toolbar.nextBarButton.invocation\n                next.accessibilityLabel = toolbar.nextBarButton.accessibilityLabel\n                toolbar.nextBarButton = next\n            }\n            \n            //Previous button\n            items.append(prev)\n            \n            //Fixed space\n            let fixed = IQBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.fixedSpace, target: nil, action: nil)\n            fixed.isSystemItem = true\n            if #available(iOS 10, *) {\n                fixed.width = 6\n            } else {\n                fixed.width = 20\n            }\n            items.append(fixed)\n            \n            //Next button\n            items.append(next)\n            \n            //Flexible space\n            items.append(UIView.flexibleBarButtonItem())\n            \n            //Title button\n            toolbar.titleBarButton.title = shouldHideToolbarPlaceholder == true ? nil : titleText\n            \n            #if swift(>=3.2)\n                if #available(iOS 11, *) {}\n                else {\n                    toolbar.titleBarButton.customView?.frame = CGRect.zero\n                }\n            #else\n                toolbar.titleBarButton.customView?.frame = CGRect.zero\n            #endif\n\n            items.append(toolbar.titleBarButton)\n            \n            //Flexible space\n            items.append(UIView.flexibleBarButtonItem())\n            \n            //Right button\n            var doneButton = toolbar.doneBarButton\n            if doneButton.isSystemItem == false {\n                doneButton.title = nil\n                doneButton.image = rightButtonImage\n                doneButton.target = target\n                doneButton.action = rightButtonAction\n            }\n            else\n            {\n                doneButton = IQBarButtonItem(image: rightButtonImage, style: UIBarButtonItemStyle.done, target: target, action: rightButtonAction)\n                doneButton.invocation = toolbar.doneBarButton.invocation\n                doneButton.accessibilityLabel = toolbar.doneBarButton.accessibilityLabel\n                toolbar.doneBarButton = doneButton\n            }\n\n            items.append(doneButton)\n            \n            //  Adding button to toolBar.\n            toolbar.items = items\n\n            //  Setting toolbar to keyboard.\n            if let textField = self as? UITextField {\n                textField.inputAccessoryView = toolbar\n                \n                switch textField.keyboardAppearance {\n                case UIKeyboardAppearance.dark:\n                    toolbar.barStyle = UIBarStyle.black\n                default:\n                    toolbar.barStyle = UIBarStyle.default\n                }\n            } else if let textView = self as? UITextView {\n                textView.inputAccessoryView = toolbar\n                \n                switch textView.keyboardAppearance {\n                case UIKeyboardAppearance.dark:\n                    toolbar.barStyle = UIBarStyle.black\n                default:\n                    toolbar.barStyle = UIBarStyle.default\n                }\n            }\n        }\n    }\n    \n    //    /**\n    //    Helper function to add ArrowNextPrevious and Right button on keyboard.\n    //\n    //    @param target Target object for selector.\n    //    @param rightButtonTitle Title for rightBarButtonItem, usually 'Done'.\n    //    @param previousAction Previous button action name. Usually 'previousAction:(id)item'.\n    //    @param nextAction Next button action name. Usually 'nextAction:(id)item'.\n    //    @param rightButtonAction RightBarButton action name. Usually 'doneAction:(IQBarButtonItem*)item'.\n    //    @param shouldShowPlaceholder A boolean to indicate whether to show textField placeholder on IQToolbar'.\n    //    */\n    public func addPreviousNextRightOnKeyboardWithTarget( _ target : AnyObject?, rightButtonImage : UIImage, previousAction : Selector, nextAction : Selector, rightButtonAction : Selector, shouldShowPlaceholder : Bool) {\n        \n        var title : String?\n        \n        if shouldShowPlaceholder == true {\n            title = self.drawingToolbarPlaceholder\n        }\n        \n        addPreviousNextRightOnKeyboardWithTarget(target, rightButtonImage: rightButtonImage, previousAction: previousAction, nextAction: nextAction, rightButtonAction: rightButtonAction, titleText: title)\n    }\n    \n    \n    /**\n    Helper function to add ArrowNextPrevious and Right button on keyboard.\n    \n    @param target Target object for selector.\n    @param rightButtonTitle Title for rightBarButtonItem, usually 'Done'.\n    @param previousAction Previous button action name. Usually 'previousAction:(id)item'.\n    @param nextAction Next button action name. Usually 'nextAction:(id)item'.\n    @param rightButtonAction RightBarButton action name. Usually 'doneAction:(IQBarButtonItem*)item'.\n    */\n    public func addPreviousNextRightOnKeyboardWithTarget( _ target : AnyObject?, rightButtonTitle : String, previousAction : Selector, nextAction : Selector, rightButtonAction : Selector) {\n        \n        addPreviousNextRightOnKeyboardWithTarget(target, rightButtonTitle: rightButtonTitle, previousAction: previousAction, nextAction: nextAction, rightButtonAction: rightButtonAction, titleText: nil)\n    }\n    \n    /**\n    Helper function to add ArrowNextPrevious and Right button on keyboard.\n    \n    @param target Target object for selector.\n    @param rightButtonTitle Title for rightBarButtonItem, usually 'Done'.\n    @param previousAction Previous button action name. Usually 'previousAction:(id)item'.\n    @param nextAction Next button action name. Usually 'nextAction:(id)item'.\n    @param rightButtonAction RightBarButton action name. Usually 'doneAction:(IQBarButtonItem*)item'.\n    @param titleText text to show as title in IQToolbar'.\n    */\n    public func addPreviousNextRightOnKeyboardWithTarget( _ target : AnyObject?, rightButtonTitle : String, previousAction : Selector, nextAction : Selector, rightButtonAction : Selector, titleText : String?) {\n        \n        //If can't set InputAccessoryView. Then return\n        if self.responds(to: #selector(setter: UITextField.inputAccessoryView)) {\n            //  Creating a toolBar for phoneNumber keyboard\n            let toolbar = self.keyboardToolbar\n            \n            var items : [IQBarButtonItem] = []\n            \n            // Get the top level \"bundle\" which may actually be the framework\n            var bundle = Bundle(for: IQKeyboardManager.self)\n            \n            if let resourcePath = bundle.path(forResource: \"IQKeyboardManager\", ofType: \"bundle\") {\n                if let resourcesBundle = Bundle(path: resourcePath) {\n                    bundle = resourcesBundle\n                }\n            }\n            \n            var imageLeftArrow : UIImage!\n            var imageRightArrow : UIImage!\n            \n            if #available(iOS 10, *) {\n                imageLeftArrow = UIImage(named: \"IQButtonBarArrowUp\", in: bundle, compatibleWith: nil)\n                imageRightArrow = UIImage(named: \"IQButtonBarArrowDown\", in: bundle, compatibleWith: nil)\n            } else {\n                imageLeftArrow = UIImage(named: \"IQButtonBarArrowLeft\", in: bundle, compatibleWith: nil)\n                imageRightArrow = UIImage(named: \"IQButtonBarArrowRight\", in: bundle, compatibleWith: nil)\n            }\n            \n            //Support for RTL languages like Arabic, Persia etc... (Bug ID: #448)\n            if #available(iOS 9, *) {\n                imageLeftArrow = imageLeftArrow?.imageFlippedForRightToLeftLayoutDirection()\n                imageRightArrow = imageRightArrow?.imageFlippedForRightToLeftLayoutDirection()\n            }\n            \n            var prev = toolbar.previousBarButton\n            if prev.isSystemItem == false {\n                prev.title = nil\n                prev.image = imageLeftArrow\n                prev.target = target\n                prev.action = previousAction\n            }\n            else\n            {\n                prev = IQBarButtonItem(image: imageLeftArrow, style: UIBarButtonItemStyle.plain, target: target, action: previousAction)\n                prev.invocation = toolbar.previousBarButton.invocation\n                prev.accessibilityLabel = toolbar.previousBarButton.accessibilityLabel\n                toolbar.previousBarButton = prev\n            }\n            \n            \n            var next = toolbar.nextBarButton\n            if next.isSystemItem == false {\n                next.title = nil\n                next.image = imageRightArrow\n                next.target = target\n                next.action = nextAction\n            }\n            else\n            {\n                next = IQBarButtonItem(image: imageRightArrow, style: UIBarButtonItemStyle.plain, target: target, action: nextAction)\n                next.invocation = toolbar.nextBarButton.invocation\n                next.accessibilityLabel = toolbar.nextBarButton.accessibilityLabel\n                toolbar.nextBarButton = next\n            }\n            \n            //Previous button\n            items.append(prev)\n\n            //Fixed space\n            let fixed = IQBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.fixedSpace, target: nil, action: nil)\n            fixed.isSystemItem = true\n            if #available(iOS 10, *) {\n                fixed.width = 6\n            } else {\n                fixed.width = 20\n            }\n            items.append(fixed)\n\n            //Next button\n            items.append(next)\n            \n            //Flexible space\n            items.append(UIView.flexibleBarButtonItem())\n            \n            //Title button\n            toolbar.titleBarButton.title = shouldHideToolbarPlaceholder == true ? nil : titleText\n            \n            #if swift(>=3.2)\n                if #available(iOS 11, *) {}\n                else {\n                    toolbar.titleBarButton.customView?.frame = CGRect.zero\n                }\n            #else\n                toolbar.titleBarButton.customView?.frame = CGRect.zero\n            #endif\n\n            items.append(toolbar.titleBarButton)\n            \n            //Flexible space\n            items.append(UIView.flexibleBarButtonItem())\n            \n            //Right button\n            var doneButton = toolbar.doneBarButton\n            if doneButton.isSystemItem == false {\n                doneButton.title = rightButtonTitle\n                doneButton.image = nil\n                doneButton.target = target\n                doneButton.action = rightButtonAction\n            }\n            else\n            {\n                doneButton = IQBarButtonItem(title: rightButtonTitle, style: UIBarButtonItemStyle.done, target: target, action: rightButtonAction)\n                doneButton.invocation = toolbar.doneBarButton.invocation\n                doneButton.accessibilityLabel = toolbar.doneBarButton.accessibilityLabel\n                toolbar.doneBarButton = doneButton\n            }\n\n            items.append(doneButton)\n            \n            //  Adding button to toolBar.\n            toolbar.items = items\n\n            //  Setting toolbar to keyboard.\n            if let textField = self as? UITextField {\n                textField.inputAccessoryView = toolbar\n                \n                switch textField.keyboardAppearance {\n                case UIKeyboardAppearance.dark:\n                    toolbar.barStyle = UIBarStyle.black\n                default:\n                    toolbar.barStyle = UIBarStyle.default\n                }\n            } else if let textView = self as? UITextView {\n                textView.inputAccessoryView = toolbar\n                \n                switch textView.keyboardAppearance {\n                case UIKeyboardAppearance.dark:\n                    toolbar.barStyle = UIBarStyle.black\n                default:\n                    toolbar.barStyle = UIBarStyle.default\n                }\n            }\n        }\n    }\n    \n//    /**\n//    Helper function to add ArrowNextPrevious and Right button on keyboard.\n//    \n//    @param target Target object for selector.\n//    @param rightButtonTitle Title for rightBarButtonItem, usually 'Done'.\n//    @param previousAction Previous button action name. Usually 'previousAction:(id)item'.\n//    @param nextAction Next button action name. Usually 'nextAction:(id)item'.\n//    @param rightButtonAction RightBarButton action name. Usually 'doneAction:(IQBarButtonItem*)item'.\n//    @param shouldShowPlaceholder A boolean to indicate whether to show textField placeholder on IQToolbar'.\n//    */\n    public func addPreviousNextRightOnKeyboardWithTarget( _ target : AnyObject?, rightButtonTitle : String, previousAction : Selector, nextAction : Selector, rightButtonAction : Selector, shouldShowPlaceholder : Bool) {\n        \n        var title : String?\n        \n        if shouldShowPlaceholder == true {\n            title = self.drawingToolbarPlaceholder\n        }\n        \n        addPreviousNextRightOnKeyboardWithTarget(target, rightButtonTitle: rightButtonTitle, previousAction: previousAction, nextAction: nextAction, rightButtonAction: rightButtonAction, titleText: title)\n    }\n}\n\n"
  },
  {
    "path": "Pods/IQKeyboardManagerSwift/LICENSE.md",
    "content": "IQKeyboardManager license\n=========================\n\nThe MIT License (MIT)\n\nCopyright (c) 2013-16 Iftekhar Qurashi\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Pods/IQKeyboardManagerSwift/README.md",
    "content": "<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Demo/Resources/icon.png\" alt=\"Icon\"/>\n</p>\n<H1 align=\"center\">IQKeyboardManager</H1>\n<p align=\"center\">\n  <img src=\"https://img.shields.io/github/license/hackiftekhar/IQKeyboardManager.svg\"\n  alt=\"GitHub license\"/>\n\n\n[![Build Status](https://travis-ci.org/hackiftekhar/IQKeyboardManager.svg)](https://travis-ci.org/hackiftekhar/IQKeyboardManager)\n[![Coverage Status](http://img.shields.io/coveralls/hackiftekhar/IQKeyboardManager/master.svg)](https://coveralls.io/r/hackiftekhar/IQKeyboardManager?branch=master)\n[![Code Health](https://landscape.io/github/hackiftekhar/IQKeyboardManager/master/landscape.svg?style=flat)](https://landscape.io/github/hackiftekhar/IQKeyboardManager/master)\n\n\nOften while developing an app, We ran into an issues where the iPhone keyboard slide up and cover the `UITextField/UITextView`. `IQKeyboardManager` allows you to prevent issues of the keyboard sliding up and cover `UITextField/UITextView` without needing you to enter any code and no additional setup required. To use `IQKeyboardManager` you simply need to add source files to your project.\n\n\n#### Key Features\n\n[![Issue Stats](http://issuestats.com/github/hackiftekhar/iqkeyboardmanager/badge/pr?style=flat)](http://issuestats.com/github/hackiftekhar/iqkeyboardmanager)\n[![Issue Stats](http://issuestats.com/github/hackiftekhar/iqkeyboardmanager/badge/issue?style=flat)](http://issuestats.com/github/hackiftekhar/iqkeyboardmanager)\n\n1) `**CODELESS**, Zero Lines Of Code`\n\n2) `Works Automatically`\n\n3) `No More UIScrollView`\n\n4) `No More Subclasses`\n\n5) `No More Manual Work`\n\n6) `No More #imports`\n\n`IQKeyboardManager` works on all orientations, and with the toolbar. There are also nice optional features allowing you to customize the distance from the text field, add the next/previous done button as a keyboard UIToolbar, play sounds when the user navigations through the form and more.\n\n\n## Screenshot\n[![IQKeyboardManager](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/v3.3.0/Screenshot/IQKeyboardManagerScreenshot.png)](http://youtu.be/6nhLw6hju2A)\n[![Settings](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/v3.3.0/Screenshot/IQKeyboardManagerSettings.png)](http://youtu.be/6nhLw6hju2A)\n\n## GIF animation\n[![IQKeyboardManager](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/v3.3.0/Screenshot/IQKeyboardManager.gif)](http://youtu.be/6nhLw6hju2A)\n\n## Video\n\n<a href=\"http://youtu.be/WAYc2Qj-OQg\" target=\"_blank\"><img src=\"http://img.youtube.com/vi/WAYc2Qj-OQg/0.jpg\"\nalt=\"IQKeyboardManager Demo Video\" width=\"480\" height=\"360\" border=\"10\" /></a>\n\n## Warning\n\n- **If you're planning to build SDK/library/framework and wants to handle UITextField/UITextView with IQKeyboardManager then you're totally going on wrong way.** I would never suggest to add IQKeyboardManager as dependency/adding/shipping with any third-party library, instead of adding IQKeyboardManager you should implement your custom solution to achieve same result. IQKeyboardManager is totally designed for projects to help developers for their convenience, it's not designed for adding/dependency/shipping with any third-party library, because **doing this could block adoption by other developers for their projects as well(who are not using IQKeyboardManager and implemented their custom solution to handle UITextField/UITextView thought the project).**\n- If IQKeybaordManager conflicts with other third-party library, then it's developer responsibility to enable/disable IQKeyboardManager when presenting/dismissing third-party library UI. Third-party libraries are not responsible to handle IQKeyboardManager.\n\n## Requirements\n[![Platform iOS](https://img.shields.io/badge/Platform-iOS-blue.svg?style=fla)]()\n\n|                        | Language | Minimum iOS Target | Minimum Xcode Version |\n|------------------------|----------|--------------------|-----------------------|\n| IQKeyboardManager      | Obj-C    | iOS 8.0            | Xcode 8.2.1           |\n| IQKeyboardManagerSwift | Swift    | iOS 8.0            | Xcode 8.2.1           |\n| Demo Project           |          |                    | Xcode 9.0             |\n\n**Note**\n- 3.3.7 is the last iOS 7 supported version.\n\n#### Swift versions support\n\n| Swift       | Xcode | IQKeyboardManagerSwift |\n|-------------|-------|------------------------|\n| 4.X         | 9.0   | >= 5.0.0               |\n| 4.0         | 9.0   | 5.0.0                  |\n| 3.1         | 8.3   | 4.0.10                 |\n| 3.0 (3.0.2) | 8.2   | 4.0.8                  |\n| 2.2 or 2.3  | 7.3   | 4.0.5                  |\n| 2.1.1       | 7.2   | 4.0.0                  |\n| 2.0         | 7.0   | 3.3.3.1                |\n\n**Note**\n- `5.0.0` is backward compatible till Swift 3.\n\nInstallation\n==========================\n\n#### Installation with CocoaPods\n\n[![CocoaPods](https://img.shields.io/cocoapods/v/IQKeyboardManager.svg)](http://cocoadocs.org/docsets/IQKeyboardManager)\n\n***IQKeyboardManager (Objective-C):*** IQKeyboardManager is available through [CocoaPods](http://cocoapods.org), to install\nit simply add the following line to your Podfile: ([#9](https://github.com/hackiftekhar/IQKeyboardManager/issues/9))\n\n```ruby\n`pod 'IQKeyboardManager'` #iOS8 and later\n\n`pod 'IQKeyboardManager', '3.3.7'` #iOS7\n```\n\n***IQKeyboardManager (Swift):*** IQKeyboardManagerSwift is available through [CocoaPods](http://cocoapods.org), to install\nit simply add the following line to your Podfile: ([#236](https://github.com/hackiftekhar/IQKeyboardManager/issues/236))\n\n*Swift 4.0 (Xcode 9.0)*\n\n```ruby\npod 'IQKeyboardManagerSwift'\n```\n\n*Or you can choose version you need based on Swift support table from [Requirements](README.md#requirements)*\n\n```ruby\npod 'IQKeyboardManagerSwift', '5.0.0'\n```\n\nIn AppDelegate.swift, just import IQKeyboardManagerSwift framework and enable IQKeyboardManager.\n\n```swift\nimport IQKeyboardManagerSwift\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n    var window: UIWindow?\n\n    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {\n\n      IQKeyboardManager.sharedManager().enable = true\n\n      return true\n    }\n}\n```\n\n#### Installation with Carthage\n\n[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks.\n\nYou can install Carthage with [Homebrew](http://brew.sh/) using the following command:\n\n```bash\n$ brew update\n$ brew install carthage\n```\n\nTo integrate `IQKeyboardManger` or `IQKeyboardManagerSwift` into your Xcode project using Carthage, specify it in your `Cartfile`:\n\n```ogdl\ngithub \"hackiftekhar/IQKeyboardManager\"\n```\n\nRun `carthage` to build the frameworks and drag the appropriate framework (`IQKeyboardManager.framework` or `IQKeyboardManagerSwift.framework`) into your Xcode project according to your need. Make sure to add only one framework and not both.\n\n\n#### Installation with Source Code\n\n[![Github tag](https://img.shields.io/github/tag/hackiftekhar/iqkeyboardmanager.svg)]()\n\n\n\n***IQKeyboardManager (Objective-C):*** Just ***drag and drop*** `IQKeyboardManager` directory from demo project to your project. That's it.\n\n***IQKeyboardManager (Swift):*** ***Drag and drop*** `IQKeyboardManagerSwift` directory from demo project to your project\n\nIn AppDelegate.swift, just enable IQKeyboardManager.\n\n```swift\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n    var window: UIWindow?\n\n    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {\n\n      IQKeyboardManager.sharedManager().enable = true\n\n      return true\n    }\n}\n```\n\n\n## Known Issues\n\nYou can find known issues list [here](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/KNOWN%20ISSUES.md).\n\nManual Management:\n---\n\nYou can find some manual management tweaks & examples [here](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/MANUAL%20MANAGEMENT.md).\n\n\n\n## Flow Diagram\n[![IQKeyboardManager CFD](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/IQKeyboardManagerFlowDiagram.jpg)](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/IQKeyboardManagerFlowDiagram.jpg)\n\nIf you would like to see detailed Flow diagram then see [here](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/v3.3.0/Screenshot/IQKeyboardManagerCFD.jpg).\n\n\n\n## Properties and functions usage\n\nYou can find some documentation about properties, methods and their uses [here](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/PROPERTIES%20%26%20FUNCTIONS.md).\n\n\nLICENSE\n---\nDistributed under the MIT License.\n\nContributions\n---\nAny contribution is more than welcome! You can contribute through pull requests and issues on GitHub.\n\nAuthor\n---\nIf you wish to contact me, email at: hack.iftekhar@gmail.com\n"
  },
  {
    "path": "Pods/Kingfisher/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2017 Wei Wang\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "Pods/Kingfisher/README.md",
    "content": "<p align=\"center\">\n\n<img src=\"https://raw.githubusercontent.com/onevcat/Kingfisher/master/images/logo.png\" alt=\"Kingfisher\" title=\"Kingfisher\" width=\"557\"/>\n\n</p>\n\n<p align=\"center\">\n<a href=\"https://travis-ci.org/onevcat/Kingfisher\"><img src=\"https://img.shields.io/travis/onevcat/Kingfisher/master.svg\"></a>\n<a href=\"https://github.com/Carthage/Carthage/\"><img src=\"https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat\"></a>\n<a href=\"http://onevcat.github.io/Kingfisher/\"><img src=\"https://img.shields.io/cocoapods/v/Kingfisher.svg?style=flat\"></a>\n<a href=\"https://raw.githubusercontent.com/onevcat/Kingfisher/master/LICENSE\"><img src=\"https://img.shields.io/cocoapods/l/Kingfisher.svg?style=flat\"></a>\n<a href=\"http://onevcat.github.io/Kingfisher/\"><img src=\"https://img.shields.io/cocoapods/p/Kingfisher.svg?style=flat\"></a>\n<a href=\"https://codebeat.co/projects/github-com-onevcat-kingfisher\"><img alt=\"codebeat badge\" src=\"https://codebeat.co/assets/svg/badges/A-398b39-669406e9e1b136187b91af587d4092b0160370f271f66a651f444b990c2730e9.svg\" /></a>\n<a href=\"#backers\" alt=\"sponsors on Open Collective\"><img src=\"https://opencollective.com/Kingfisher/backers/badge.svg\" /></a>\n<a href=\"#sponsors\" alt=\"Sponsors on Open Collective\"><img src=\"https://opencollective.com/Kingfisher/sponsors/badge.svg\" /></a>\n</p>\n\nKingfisher is a lightweight, pure-Swift library for downloading and caching images from the web. This project is heavily inspired by the popular [SDWebImage](https://github.com/rs/SDWebImage). It provides you a chance to use a pure-Swift alternative in your next app.\n\n## Features\n\n- [x] Asynchronous image downloading and caching.\n- [x] `URLSession`-based networking. Basic image processors and filters supplied.\n- [x] Multiple-layer cache for both memory and disk.\n- [x] Cancelable downloading and processing tasks to improve performance.\n- [x] Independent components. Use the downloader or caching system separately as you need.\n- [x] Prefetching images and showing them from cache later when necessary.\n- [x] Extensions for `UIImageView`, `NSImage` and `UIButton` to directly set an image from a URL.\n- [x] Built-in transition animation when setting images.\n- [x] Customizable placeholder while loading images.\n- [x] Extensible image processing and image format support.\n\nThe simplest use-case is setting an image to an image view with the `UIImageView` extension:\n\n```swift\nlet url = URL(string: \"url_of_your_image\")\nimageView.kf.setImage(with: url)\n```\n\nKingfisher will download the image from `url`, send it to both the memory cache and the disk cache, and display it in `imageView`. When you use the same code later, the image will be retrieved from cache and shown immediately.\n\n## Requirements\n\n- iOS 8.0+ / macOS 10.10+ / tvOS 9.0+ / watchOS 2.0+\n- Swift 4 (Kingfisher 4.x), Swift 3 (Kingfisher 3.x)\n\nMain development of Kingfisher is based on Swift 4. Only critical bug fixes will be applied to Kingfisher 3.x.\n\n- Kingfisher 4.0 Migration - Kingfisher 3.x should be source compatible to Kingfisher 4. The reason for a major update is that we need to specify the Swift version explicitly for Xcode. All deprecated methods in Kingfisher 3 has been removed, so please ensure you have no warning left before you migrate from Kingfisher 3 to Kingfisher 4. If you have any trouble in migrating, please open an issue to discuss.\n- [Kingfisher 3.0 Migration Guide](https://github.com/onevcat/Kingfisher/wiki/Kingfisher-3.0-Migration-Guide) - If you are upgrading to Kingfisher 3.x from an earlier version, please read this for more information.\n\n## Next Steps\n\nWe prepared a [wiki page](https://github.com/onevcat/Kingfisher/wiki). You can find tons of useful things there.\n\n* [Installation Guide](https://github.com/onevcat/Kingfisher/wiki/Installation-Guide) - Follow it to integrate Kingfisher into your project.\n* [Cheat Sheet](https://github.com/onevcat/Kingfisher/wiki/Cheat-Sheet)- Curious about what Kingfisher could do and how would it look like when used in your project? See this page for useful code snippets. If you are already familiar with Kingfisher, you could also learn new tricks to improve the way you use Kingfisher! \n* [API Reference](http://onevcat.github.io/Kingfisher/) - Lastly, please remember to read the full whenever you may need a more detailed reference.\n\n## Other\n\n### Future of Kingfisher\n\nI want to keep Kingfisher lightweight. This framework will focus on providing a simple solution for downloading and caching images. This doesn’t mean the framework can’t be improved. Kingfisher is far from perfect, so necessary and useful updates will be made to make it better.\n\n### Developments and Tests\n\nAny contributing and pull requests are warmly welcome. However, before you plan to implement some features or try to fix an uncertain issue, it is recommended to open a discussion first. \n\nThe test images are contained in another project to keep this project repo fast and slim. You could run `./setup.sh` in the root folder of Kingfisher to clone the test images when you need to run the tests target. It would be appreciated if your pull requests could build and with all tests green. :)\n\n### About the logo\n\nThe logo of Kingfisher is inspired by [Tangram (七巧板)](http://en.wikipedia.org/wiki/Tangram), a dissection puzzle consisting of seven flat shapes from China. I believe she's a kingfisher bird instead of a swift, but someone insists that she is a pigeon. I guess I should give her a name. Hi, guys, do you have any suggestions?\n\n### Contact\n\nFollow and contact me on [Twitter](http://twitter.com/onevcat) or [Sina Weibo](http://weibo.com/onevcat). If you find an issue, just [open a ticket](https://github.com/onevcat/Kingfisher/issues/new). Pull requests are warmly welcome as well.\n\n## Contributors\n\nThis project exists thanks to all the people who contribute. [[Contribute]](https://github.com/onevcat/Kingfisher/blob/master/CONTRIBUTING.md).\n<a href=\"https://github.com/onevcat/Kingfisher/graphs/contributors\"><img src=\"https://opencollective.com/Kingfisher/contributors.svg?width=890\" /></a>\n\n\n## Backers\n\nThank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/Kingfisher#backer)]\n\n<a href=\"https://opencollective.com/Kingfisher#backers\" target=\"_blank\"><img src=\"https://opencollective.com/Kingfisher/backers.svg?width=890\"></a>\n\n\n## Sponsors\n\nSupport this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/Kingfisher#sponsor)]\n\n<a href=\"https://opencollective.com/Kingfisher/sponsor/0/website\" target=\"_blank\"><img src=\"https://opencollective.com/Kingfisher/sponsor/0/avatar.svg\"></a>\n<a href=\"https://opencollective.com/Kingfisher/sponsor/1/website\" target=\"_blank\"><img src=\"https://opencollective.com/Kingfisher/sponsor/1/avatar.svg\"></a>\n<a href=\"https://opencollective.com/Kingfisher/sponsor/2/website\" target=\"_blank\"><img src=\"https://opencollective.com/Kingfisher/sponsor/2/avatar.svg\"></a>\n<a href=\"https://opencollective.com/Kingfisher/sponsor/3/website\" target=\"_blank\"><img src=\"https://opencollective.com/Kingfisher/sponsor/3/avatar.svg\"></a>\n<a href=\"https://opencollective.com/Kingfisher/sponsor/4/website\" target=\"_blank\"><img src=\"https://opencollective.com/Kingfisher/sponsor/4/avatar.svg\"></a>\n<a href=\"https://opencollective.com/Kingfisher/sponsor/5/website\" target=\"_blank\"><img src=\"https://opencollective.com/Kingfisher/sponsor/5/avatar.svg\"></a>\n<a href=\"https://opencollective.com/Kingfisher/sponsor/6/website\" target=\"_blank\"><img src=\"https://opencollective.com/Kingfisher/sponsor/6/avatar.svg\"></a>\n<a href=\"https://opencollective.com/Kingfisher/sponsor/7/website\" target=\"_blank\"><img src=\"https://opencollective.com/Kingfisher/sponsor/7/avatar.svg\"></a>\n<a href=\"https://opencollective.com/Kingfisher/sponsor/8/website\" target=\"_blank\"><img src=\"https://opencollective.com/Kingfisher/sponsor/8/avatar.svg\"></a>\n<a href=\"https://opencollective.com/Kingfisher/sponsor/9/website\" target=\"_blank\"><img src=\"https://opencollective.com/Kingfisher/sponsor/9/avatar.svg\"></a>\n\n\n\n### License\n\nKingfisher is released under the MIT license. See LICENSE for details.\n\n\n"
  },
  {
    "path": "Pods/Kingfisher/Sources/AnimatedImageView.swift",
    "content": "//\n//  AnimatableImageView.swift\n//  Kingfisher\n//\n//  Created by bl4ckra1sond3tre on 4/22/16.\n//\n//  The AnimatableImageView, AnimatedFrame and Animator is a modified version of \n//  some classes from kaishin's Gifu project (https://github.com/kaishin/Gifu)\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2017 Reda Lemeden.\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of\n//  this software and associated documentation files (the \"Software\"), to deal in\n//  the Software without restriction, including without limitation the rights to\n//  use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n//  the Software, and to permit persons to whom the Software is furnished to do so,\n//  subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all\n//  copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n//  FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n//  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n//  IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n//  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//  The name and characters used in the demo of this software are property of their\n//  respective owners.\n\nimport UIKit\nimport ImageIO\n\n/// `AnimatedImageView` is a subclass of `UIImageView` for displaying animated image.\nopen class AnimatedImageView: UIImageView {\n    \n    /// Proxy object for prevending a reference cycle between the CADDisplayLink and AnimatedImageView.\n    class TargetProxy {\n        private weak var target: AnimatedImageView?\n        \n        init(target: AnimatedImageView) {\n            self.target = target\n        }\n        \n        @objc func onScreenUpdate() {\n            target?.updateFrame()\n        }\n    }\n    \n    // MARK: - Public property\n    /// Whether automatically play the animation when the view become visible. Default is true.\n    public var autoPlayAnimatedImage = true\n    \n    /// The size of the frame cache.\n    public var framePreloadCount = 10\n    \n    /// Specifies whether the GIF frames should be pre-scaled to save memory. Default is true.\n    public var needsPrescaling = true\n    \n    /// The animation timer's run loop mode. Default is `NSRunLoopCommonModes`. Set this property to `NSDefaultRunLoopMode` will make the animation pause during UIScrollView scrolling.\n    public var runLoopMode = RunLoopMode.commonModes {\n        willSet {\n            if runLoopMode == newValue {\n                return\n            } else {\n                stopAnimating()\n                displayLink.remove(from: .main, forMode: runLoopMode)\n                displayLink.add(to: .main, forMode: newValue)\n                startAnimating()\n            }\n        }\n    }\n    \n    // MARK: - Private property\n    /// `Animator` instance that holds the frames of a specific image in memory.\n    private var animator: Animator?\n    \n    /// A flag to avoid invalidating the displayLink on deinit if it was never created, because displayLink is so lazy. :D\n    private var isDisplayLinkInitialized: Bool = false\n    \n    /// A display link that keeps calling the `updateFrame` method on every screen refresh.\n    private lazy var displayLink: CADisplayLink = {\n        self.isDisplayLinkInitialized = true\n        let displayLink = CADisplayLink(target: TargetProxy(target: self), selector: #selector(TargetProxy.onScreenUpdate))\n        displayLink.add(to: .main, forMode: self.runLoopMode)\n        displayLink.isPaused = true\n        return displayLink\n    }()\n    \n    // MARK: - Override\n    override open var image: Image? {\n        didSet {\n            if image != oldValue {\n                reset()\n            }\n            setNeedsDisplay()\n            layer.setNeedsDisplay()\n        }\n    }\n    \n    deinit {\n        if isDisplayLinkInitialized {\n            displayLink.invalidate()\n        }\n    }\n    \n    override open var isAnimating: Bool {\n        if isDisplayLinkInitialized {\n            return !displayLink.isPaused\n        } else {\n            return super.isAnimating\n        }\n    }\n    \n    /// Starts the animation.\n    override open func startAnimating() {\n        if self.isAnimating {\n            return\n        } else {\n            displayLink.isPaused = false\n        }\n    }\n    \n    /// Stops the animation.\n    override open func stopAnimating() {\n        super.stopAnimating()\n        if isDisplayLinkInitialized {\n            displayLink.isPaused = true\n        }\n    }\n    \n    override open func display(_ layer: CALayer) {\n        if let currentFrame = animator?.currentFrame {\n            layer.contents = currentFrame.cgImage\n        } else {\n            layer.contents = image?.cgImage\n        }\n    }\n    \n    override open func didMoveToWindow() {\n        super.didMoveToWindow()\n        didMove()\n    }\n    \n    override open func didMoveToSuperview() {\n        super.didMoveToSuperview()\n        didMove()\n    }\n\n    // This is for back compatibility that using regular UIImageView to show animated image.\n    override func shouldPreloadAllAnimation() -> Bool {\n        return false\n    }\n\n    // MARK: - Private method\n    /// Reset the animator.\n    private func reset() {\n        animator = nil\n        if let imageSource = image?.kf.imageSource?.imageRef {\n            animator = Animator(imageSource: imageSource, contentMode: contentMode, size: bounds.size, framePreloadCount: framePreloadCount)\n            animator?.needsPrescaling = needsPrescaling\n            animator?.prepareFramesAsynchronously()\n        }\n        didMove()\n    }\n    \n    private func didMove() {\n        if autoPlayAnimatedImage && animator != nil {\n            if let _ = superview, let _ = window {\n                startAnimating()\n            } else {\n                stopAnimating()\n            }\n        }\n    }\n    \n    /// Update the current frame with the displayLink duration.\n    private func updateFrame() {\n        let duration: CFTimeInterval\n\n        // CA based display link is opt-out from ProMotion by default.\n        // So the duration and its FPS might not match. \n        // See [#718](https://github.com/onevcat/Kingfisher/issues/718)\n        if #available(iOS 10.0, tvOS 10.0, *) {\n            // By setting CADisableMinimumFrameDuration to YES in Info.plist may \n            // cause the preferredFramesPerSecond being 0\n            if displayLink.preferredFramesPerSecond == 0 {\n                duration = displayLink.duration\n            } else {\n                // Some devices (like iPad Pro 10.5) will have a different FPS.\n                duration = 1.0 / Double(displayLink.preferredFramesPerSecond)\n            }\n        } else {\n            duration = displayLink.duration\n        }\n    \n        if animator?.updateCurrentFrame(duration: duration) ?? false {\n            layer.setNeedsDisplay()\n        }\n    }\n}\n\n/// Keeps a reference to an `Image` instance and its duration as a GIF frame.\nstruct AnimatedFrame {\n    var image: Image?\n    let duration: TimeInterval\n    \n    static let null: AnimatedFrame = AnimatedFrame(image: .none, duration: 0.0)\n}\n\n// MARK: - Animator\nclass Animator {\n    // MARK: Private property\n    fileprivate let size: CGSize\n    fileprivate let maxFrameCount: Int\n    fileprivate let imageSource: CGImageSource\n    \n    fileprivate var animatedFrames = [AnimatedFrame]()\n    fileprivate let maxTimeStep: TimeInterval = 1.0\n    fileprivate var frameCount = 0\n    fileprivate var currentFrameIndex = 0\n    fileprivate var currentPreloadIndex = 0\n    fileprivate var timeSinceLastFrameChange: TimeInterval = 0.0\n    fileprivate var needsPrescaling = true\n    \n    /// Loop count of animated image.\n    private var loopCount = 0\n    \n    var currentFrame: UIImage? {\n        return frame(at: currentFrameIndex)\n    }\n    \n    var contentMode = UIViewContentMode.scaleToFill\n    \n    private lazy var preloadQueue: DispatchQueue = {\n        return DispatchQueue(label: \"com.onevcat.Kingfisher.Animator.preloadQueue\")\n    }()\n    \n    /**\n     Init an animator with image source reference.\n     \n     - parameter imageSource: The reference of animated image.\n     - parameter contentMode: Content mode of AnimatedImageView.\n     - parameter size: Size of AnimatedImageView.\n     - parameter framePreloadCount: Frame cache size.\n     \n     - returns: The animator object.\n     */\n    init(imageSource source: CGImageSource, contentMode mode: UIViewContentMode, size: CGSize, framePreloadCount count: Int) {\n        self.imageSource = source\n        self.contentMode = mode\n        self.size = size\n        self.maxFrameCount = count\n    }\n    \n    func frame(at index: Int) -> Image? {\n        return animatedFrames[safe: index]?.image\n    }\n    \n    func prepareFramesAsynchronously() {\n        preloadQueue.async { [weak self] in\n            self?.prepareFrames()\n        }\n    }\n    \n    private func prepareFrames() {\n        frameCount = CGImageSourceGetCount(imageSource)\n        \n        if let properties = CGImageSourceCopyProperties(imageSource, nil),\n            let gifInfo = (properties as NSDictionary)[kCGImagePropertyGIFDictionary as String] as? NSDictionary,\n            let loopCount = gifInfo[kCGImagePropertyGIFLoopCount as String] as? Int\n        {\n            self.loopCount = loopCount\n        }\n        \n        let frameToProcess = min(frameCount, maxFrameCount)\n        animatedFrames.reserveCapacity(frameToProcess)\n        animatedFrames = (0..<frameToProcess).reduce([]) { $0 + pure(prepareFrame(at: $1))}\n        currentPreloadIndex = (frameToProcess + 1) % frameCount\n    }\n    \n    private func prepareFrame(at index: Int) -> AnimatedFrame {\n        \n        guard let imageRef = CGImageSourceCreateImageAtIndex(imageSource, index, nil) else {\n            return AnimatedFrame.null\n        }\n        \n        let defaultGIFFrameDuration = 0.100\n        let frameDuration = imageSource.kf.gifProperties(at: index).map {\n            gifInfo -> Double in\n            \n            let unclampedDelayTime = gifInfo[kCGImagePropertyGIFUnclampedDelayTime as String] as Double?\n            let delayTime = gifInfo[kCGImagePropertyGIFDelayTime as String] as Double?\n            let duration = unclampedDelayTime ?? delayTime ?? 0.0\n            \n            /**\n             http://opensource.apple.com/source/WebCore/WebCore-7600.1.25/platform/graphics/cg/ImageSourceCG.cpp\n             Many annoying ads specify a 0 duration to make an image flash as quickly as\n             possible. We follow Safari and Firefox's behavior and use a duration of 100 ms\n             for any frames that specify a duration of <= 10 ms.\n             See <rdar://problem/7689300> and <http://webkit.org/b/36082> for more information.\n             \n             See also: http://nullsleep.tumblr.com/post/16524517190/animated-gif-minimum-frame-delay-browser.\n             */\n            return duration > 0.011 ? duration : defaultGIFFrameDuration\n        } ?? defaultGIFFrameDuration\n        \n        let image = Image(cgImage: imageRef)\n        let scaledImage: Image?\n        \n        if needsPrescaling {\n            scaledImage = image.kf.resize(to: size, for: contentMode)\n        } else {\n            scaledImage = image\n        }\n        \n        return AnimatedFrame(image: scaledImage, duration: frameDuration)\n    }\n    \n    /**\n     Updates the current frame if necessary using the frame timer and the duration of each frame in `animatedFrames`.\n     */\n    func updateCurrentFrame(duration: CFTimeInterval) -> Bool {\n        timeSinceLastFrameChange += min(maxTimeStep, duration)\n        guard let frameDuration = animatedFrames[safe: currentFrameIndex]?.duration, frameDuration <= timeSinceLastFrameChange else {\n            return false\n        }\n        \n        timeSinceLastFrameChange -= frameDuration\n        \n        let lastFrameIndex = currentFrameIndex\n        currentFrameIndex += 1\n        currentFrameIndex = currentFrameIndex % animatedFrames.count\n        \n        if animatedFrames.count < frameCount {\n            preloadFrameAsynchronously(at: lastFrameIndex)\n        }\n        return true\n    }\n    \n    private func preloadFrameAsynchronously(at index: Int) {\n        preloadQueue.async { [weak self] in\n            self?.preloadFrame(at: index)\n        }\n    }\n    \n    private func preloadFrame(at index: Int) {\n        animatedFrames[index] = prepareFrame(at: currentPreloadIndex)\n        currentPreloadIndex += 1\n        currentPreloadIndex = currentPreloadIndex % frameCount\n    }\n}\n\nextension CGImageSource: KingfisherCompatible { }\nextension Kingfisher where Base: CGImageSource {\n    func gifProperties(at index: Int) -> [String: Double]? {\n        let properties = CGImageSourceCopyPropertiesAtIndex(base, index, nil) as Dictionary?\n        return properties?[kCGImagePropertyGIFDictionary] as? [String: Double]\n    }\n}\n\nextension Array {\n    subscript(safe index: Int) -> Element? {\n        return indices ~= index ? self[index] : nil\n    }\n}\n\nprivate func pure<T>(_ value: T) -> [T] {\n    return [value]\n}\n"
  },
  {
    "path": "Pods/Kingfisher/Sources/Box.swift",
    "content": "//\n//  Box.swift\n//  Kingfisher\n//\n//  Created by WANG WEI on 2016/09/12.\n//  Copyright © 2016年 Wei Wang. All rights reserved.\n//\n\nimport Foundation\n\nclass Box<T> {\n    let value: T\n    init(value: T) {\n        self.value = value\n    }\n}\n"
  },
  {
    "path": "Pods/Kingfisher/Sources/CacheSerializer.swift",
    "content": "//\n//  CacheSerializer.swift\n//  Kingfisher\n//\n//  Created by Wei Wang on 2016/09/02.\n//\n//  Copyright (c) 2017 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\n/// An `CacheSerializer` would be used to convert some data to an image object for \n/// retrieving from disk cache and vice versa for storing to disk cache.\npublic protocol CacheSerializer {\n    \n    /// Get the serialized data from a provided image\n    /// and optional original data for caching to disk.\n    ///\n    ///\n    /// - parameter image:    The image needed to be serialized.\n    /// - parameter original: The original data which is just downloaded. \n    ///                       If the image is retrieved from cache instead of\n    ///                       downloaded, it will be `nil`.\n    ///\n    /// - returns: A data which will be stored to cache, or `nil` when no valid\n    ///            data could be serialized.\n    func data(with image: Image, original: Data?) -> Data?\n    \n    /// Get an image deserialized from provided data.\n    ///\n    /// - parameter data:    The data from which an image should be deserialized.\n    /// - parameter options: Options for deserialization.\n    ///\n    /// - returns: An image deserialized or `nil` when no valid image \n    ///            could be deserialized.\n    func image(with data: Data, options: KingfisherOptionsInfo?) -> Image?\n}\n\n\n/// `DefaultCacheSerializer` is a basic `CacheSerializer` used in default cache of\n/// Kingfisher. It could serialize and deserialize PNG, JEPG and GIF images. For \n/// image other than these formats, a normalized `pngRepresentation` will be used.\npublic struct DefaultCacheSerializer: CacheSerializer {\n    \n    public static let `default` = DefaultCacheSerializer()\n    private init() {}\n    \n    public func data(with image: Image, original: Data?) -> Data? {\n        let imageFormat = original?.kf.imageFormat ?? .unknown\n\n        let data: Data?\n        switch imageFormat {\n        case .PNG: data = image.kf.pngRepresentation()\n        case .JPEG: data = image.kf.jpegRepresentation(compressionQuality: 1.0)\n        case .GIF: data = image.kf.gifRepresentation()\n        case .unknown: data = original ?? image.kf.normalized.kf.pngRepresentation()\n        }\n\n        return data\n    }\n    \n    public func image(with data: Data, options: KingfisherOptionsInfo?) -> Image? {\n        let options = options ?? KingfisherEmptyOptionsInfo\n        return Kingfisher<Image>.image(\n            data: data,\n            scale: options.scaleFactor,\n            preloadAllAnimationData: options.preloadAllAnimationData,\n            onlyFirstFrame: options.onlyLoadFirstFrame)\n    }\n}\n"
  },
  {
    "path": "Pods/Kingfisher/Sources/Filter.swift",
    "content": "//\n//  Filter.swift\n//  Kingfisher\n//\n//  Created by Wei Wang on 2016/08/31.\n//\n//  Copyright (c) 2017 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n\n\nimport CoreImage\nimport Accelerate\n\n// Reuse the same CI Context for all CI drawing.\nprivate let ciContext = CIContext(options: nil)\n\n/// Transformer method which will be used in to provide a `Filter`.\npublic typealias Transformer = (CIImage) -> CIImage?\n\n/// Supply a filter to create an `ImageProcessor`.\npublic protocol CIImageProcessor: ImageProcessor {\n    var filter: Filter { get }\n}\n\nextension CIImageProcessor {\n    public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {\n        switch item {\n        case .image(let image):\n            return image.kf.apply(filter)\n        case .data(_):\n            return (DefaultImageProcessor.default >> self).process(item: item, options: options)\n        }\n    }\n}\n\n/// Wrapper for a `Transformer` of CIImage filters.\npublic struct Filter {\n    \n    let transform: Transformer\n\n    public init(tranform: @escaping Transformer) {\n        self.transform = tranform\n    }\n    \n    /// Tint filter which will apply a tint color to images.\n    public static var tint: (Color) -> Filter = {\n        color in\n        Filter { input in\n            let colorFilter = CIFilter(name: \"CIConstantColorGenerator\")!\n            colorFilter.setValue(CIColor(color: color), forKey: kCIInputColorKey)\n            \n            let colorImage = colorFilter.outputImage\n            let filter = CIFilter(name: \"CISourceOverCompositing\")!\n            filter.setValue(colorImage, forKey: kCIInputImageKey)\n            filter.setValue(input, forKey: kCIInputBackgroundImageKey)\n            #if swift(>=4.0)\n            return filter.outputImage?.cropped(to: input.extent)\n            #else\n            return filter.outputImage?.cropping(to: input.extent)\n            #endif\n        }\n    }\n    \n    public typealias ColorElement = (CGFloat, CGFloat, CGFloat, CGFloat)\n    \n    /// Color control filter which will apply color control change to images.\n    public static var colorControl: (ColorElement) -> Filter = { arg -> Filter in\n        let (brightness, contrast, saturation, inputEV) = arg\n        return Filter { input in\n            let paramsColor = [kCIInputBrightnessKey: brightness,\n                               kCIInputContrastKey: contrast,\n                               kCIInputSaturationKey: saturation]\n            \n            let paramsExposure = [kCIInputEVKey: inputEV]\n            #if swift(>=4.0)\n            let blackAndWhite = input.applyingFilter(\"CIColorControls\", parameters: paramsColor)\n            return blackAndWhite.applyingFilter(\"CIExposureAdjust\", parameters: paramsExposure)\n            #else\n            let blackAndWhite = input.applyingFilter(\"CIColorControls\", withInputParameters: paramsColor)\n            return blackAndWhite.applyingFilter(\"CIExposureAdjust\", withInputParameters: paramsExposure)\n            #endif\n        }\n        \n    }\n}\n\nextension Kingfisher where Base: Image {\n    /// Apply a `Filter` containing `CIImage` transformer to `self`.\n    ///\n    /// - parameter filter: The filter used to transform `self`.\n    ///\n    /// - returns: A transformed image by input `Filter`.\n    ///\n    /// - Note: Only CG-based images are supported. If any error happens during transforming, `self` will be returned.\n    public func apply(_ filter: Filter) -> Image {\n        \n        guard let cgImage = cgImage else {\n            assertionFailure(\"[Kingfisher] Tint image only works for CG-based image.\")\n            return base\n        }\n        \n        let inputImage = CIImage(cgImage: cgImage)\n        guard let outputImage = filter.transform(inputImage) else {\n            return base\n        }\n        \n        guard let result = ciContext.createCGImage(outputImage, from: outputImage.extent) else {\n            assertionFailure(\"[Kingfisher] Can not make an tint image within context.\")\n            return base\n        }\n        \n        #if os(macOS)\n            return fixedForRetinaPixel(cgImage: result, to: size)\n        #else\n            return Image(cgImage: result, scale: base.scale, orientation: base.imageOrientation)\n        #endif\n    }\n\n}\n"
  },
  {
    "path": "Pods/Kingfisher/Sources/FormatIndicatedCacheSerializer.swift",
    "content": "//\n//  RequestModifier.swift\n//  Kingfisher\n//\n//  Created by Junyu Kuang on 5/28/17.\n//\n//  Copyright (c) 2017 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\n/// `FormatIndicatedCacheSerializer` let you indicate an image format for serialized caches.\n///\n/// It could serialize and deserialize PNG, JEPG and GIF images. For\n/// image other than these formats, a normalized `pngRepresentation` will be used.\n///\n/// Example:\n/// ````\n/// private let profileImageSize = CGSize(width: 44, height: 44)\n///\n/// private let imageProcessor = RoundCornerImageProcessor(\n///     cornerRadius: profileImageSize.width / 2, targetSize: profileImageSize)\n///\n/// private let optionsInfo: KingfisherOptionsInfo = [\n///     .cacheSerializer(FormatIndicatedCacheSerializer.png), \n///     .backgroundDecode, .processor(imageProcessor), .scaleFactor(UIScreen.main.scale)]\n///\n/// extension UIImageView {\n///    func setProfileImage(with url: URL) {\n///        // Image will always cached as PNG format to preserve alpha channel for round rect.\n///        _ = kf.setImage(with: url, options: optionsInfo)\n///    }\n///}\n/// ````\npublic struct FormatIndicatedCacheSerializer: CacheSerializer {\n    \n    public static let png = FormatIndicatedCacheSerializer(imageFormat: .PNG)\n    public static let jpeg = FormatIndicatedCacheSerializer(imageFormat: .JPEG)\n    public static let gif = FormatIndicatedCacheSerializer(imageFormat: .GIF)\n    \n    /// The indicated image format.\n    private let imageFormat: ImageFormat\n    \n    public func data(with image: Image, original: Data?) -> Data? {\n        \n        func imageData(withFormat imageFormat: ImageFormat) -> Data? {\n            switch imageFormat {\n            case .PNG: return image.kf.pngRepresentation()\n            case .JPEG: return image.kf.jpegRepresentation(compressionQuality: 1.0)\n            case .GIF: return image.kf.gifRepresentation()\n            case .unknown: return nil\n            }\n        }\n        \n        // generate data with indicated image format\n        if let data = imageData(withFormat: imageFormat) {\n            return data\n        }\n        \n        let originalFormat = original?.kf.imageFormat ?? .unknown\n        \n        // generate data with original image's format\n        if originalFormat != imageFormat, let data = imageData(withFormat: originalFormat) {\n            return data\n        }\n        \n        return original ?? image.kf.normalized.kf.pngRepresentation()\n    }\n    \n    /// Same implementation as `DefaultCacheSerializer`.\n    public func image(with data: Data, options: KingfisherOptionsInfo?) -> Image? {\n        let options = options ?? KingfisherEmptyOptionsInfo\n        return Kingfisher<Image>.image(\n            data: data,\n            scale: options.scaleFactor,\n            preloadAllAnimationData: options.preloadAllAnimationData,\n            onlyFirstFrame: options.onlyLoadFirstFrame)\n    }\n}\n"
  },
  {
    "path": "Pods/Kingfisher/Sources/Image.swift",
    "content": "//\n//  Image.swift\n//  Kingfisher\n//\n//  Created by Wei Wang on 16/1/6.\n//\n//  Copyright (c) 2017 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n\n#if os(macOS)\nimport AppKit\nprivate var imagesKey: Void?\nprivate var durationKey: Void?\n#else\nimport UIKit\nimport MobileCoreServices\nprivate var imageSourceKey: Void?\n#endif\nprivate var animatedImageDataKey: Void?\n\nimport ImageIO\nimport CoreGraphics\n\n#if !os(watchOS)\nimport Accelerate\nimport CoreImage\n#endif\n\n// MARK: - Image Properties\nextension Kingfisher where Base: Image {\n    fileprivate(set) var animatedImageData: Data? {\n        get {\n            return objc_getAssociatedObject(base, &animatedImageDataKey) as? Data\n        }\n        set {\n            objc_setAssociatedObject(base, &animatedImageDataKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n        }\n    }\n    \n    #if os(macOS)\n    var cgImage: CGImage? {\n        return base.cgImage(forProposedRect: nil, context: nil, hints: nil)\n    }\n    \n    var scale: CGFloat {\n        return 1.0\n    }\n    \n    fileprivate(set) var images: [Image]? {\n        get {\n            return objc_getAssociatedObject(base, &imagesKey) as? [Image]\n        }\n        set {\n            objc_setAssociatedObject(base, &imagesKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n        }\n    }\n    \n    fileprivate(set) var duration: TimeInterval {\n        get {\n            return objc_getAssociatedObject(base, &durationKey) as? TimeInterval ?? 0.0\n        }\n        set {\n            objc_setAssociatedObject(base, &durationKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n        }\n    }\n    \n    var size: CGSize {\n        return base.representations.reduce(CGSize.zero, { size, rep in\n            return CGSize(width: max(size.width, CGFloat(rep.pixelsWide)), height: max(size.height, CGFloat(rep.pixelsHigh)))\n        })\n    }\n    \n    #else\n    var cgImage: CGImage? {\n        return base.cgImage\n    }\n    \n    var scale: CGFloat {\n        return base.scale\n    }\n    \n    var images: [Image]? {\n        return base.images\n    }\n    \n    var duration: TimeInterval {\n        return base.duration\n    }\n    \n    fileprivate(set) var imageSource: ImageSource? {\n        get {\n            return objc_getAssociatedObject(base, &imageSourceKey) as? ImageSource\n        }\n        set {\n            objc_setAssociatedObject(base, &imageSourceKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n        }\n    }\n    \n    var size: CGSize {\n        return base.size\n    }\n    #endif\n}\n\n// MARK: - Image Conversion\nextension Kingfisher where Base: Image {\n    #if os(macOS)\n    static func image(cgImage: CGImage, scale: CGFloat, refImage: Image?) -> Image {\n        return Image(cgImage: cgImage, size: CGSize.zero)\n    }\n    \n    /**\n     Normalize the image. This method does nothing in OS X.\n     \n     - returns: The image itself.\n     */\n    public var normalized: Image {\n        return base\n    }\n    \n    static func animated(with images: [Image], forDuration forDurationduration: TimeInterval) -> Image? {\n        return nil\n    }\n    #else\n    static func image(cgImage: CGImage, scale: CGFloat, refImage: Image?) -> Image {\n        if let refImage = refImage {\n            return Image(cgImage: cgImage, scale: scale, orientation: refImage.imageOrientation)\n        } else {\n            return Image(cgImage: cgImage, scale: scale, orientation: .up)\n        }\n    }\n    \n    /**\n     Normalize the image. This method will try to redraw an image with orientation and scale considered.\n     \n     - returns: The normalized image with orientation set to up and correct scale.\n     */\n    public var normalized: Image {\n        // prevent animated image (GIF) lose it's images\n        guard images == nil else { return base }\n        // No need to do anything if already up\n        guard base.imageOrientation != .up else { return base }\n    \n        return draw(cgImage: nil, to: size) {\n            base.draw(in: CGRect(origin: CGPoint.zero, size: size))\n        }\n    }\n    \n    static func animated(with images: [Image], forDuration duration: TimeInterval) -> Image? {\n        return .animatedImage(with: images, duration: duration)\n    }\n    #endif\n}\n\n// MARK: - Image Representation\nextension Kingfisher where Base: Image {\n    // MARK: - PNG\n    public func pngRepresentation() -> Data? {\n        #if os(macOS)\n            guard let cgimage = cgImage else {\n                return nil\n            }\n            let rep = NSBitmapImageRep(cgImage: cgimage)\n            return rep.representation(using: .png, properties: [:])\n        #else\n            return UIImagePNGRepresentation(base)\n        #endif\n    }\n    \n    // MARK: - JPEG\n    public func jpegRepresentation(compressionQuality: CGFloat) -> Data? {\n        #if os(macOS)\n            guard let cgImage = cgImage else {\n                return nil\n            }\n            let rep = NSBitmapImageRep(cgImage: cgImage)\n            return rep.representation(using:.jpeg, properties: [.compressionFactor: compressionQuality])\n        #else\n            return UIImageJPEGRepresentation(base, compressionQuality)\n        #endif\n    }\n    \n    // MARK: - GIF\n    public func gifRepresentation() -> Data? {\n        return animatedImageData\n    }\n}\n\n// MARK: - Create images from data\nextension Kingfisher where Base: Image {\n    static func animated(with data: Data, scale: CGFloat = 1.0, duration: TimeInterval = 0.0, preloadAll: Bool, onlyFirstFrame: Bool = false) -> Image? {\n        \n        func decode(from imageSource: CGImageSource, for options: NSDictionary) -> ([Image], TimeInterval)? {\n            \n            //Calculates frame duration for a gif frame out of the kCGImagePropertyGIFDictionary dictionary\n            func frameDuration(from gifInfo: NSDictionary?) -> Double {\n                let gifDefaultFrameDuration = 0.100\n                \n                guard let gifInfo = gifInfo else {\n                    return gifDefaultFrameDuration\n                }\n                \n                let unclampedDelayTime = gifInfo[kCGImagePropertyGIFUnclampedDelayTime as String] as? NSNumber\n                let delayTime = gifInfo[kCGImagePropertyGIFDelayTime as String] as? NSNumber\n                let duration = unclampedDelayTime ?? delayTime\n                \n                guard let frameDuration = duration else { return gifDefaultFrameDuration }\n                \n                return frameDuration.doubleValue > 0.011 ? frameDuration.doubleValue : gifDefaultFrameDuration\n            }\n            \n            let frameCount = CGImageSourceGetCount(imageSource)\n            var images = [Image]()\n            var gifDuration = 0.0\n            for i in 0 ..< frameCount {\n                \n                guard let imageRef = CGImageSourceCreateImageAtIndex(imageSource, i, options) else {\n                    return nil\n                }\n\n                if frameCount == 1 {\n                    // Single frame\n                    gifDuration = Double.infinity\n                } else {\n                    \n                    // Animated GIF\n                    guard let properties = CGImageSourceCopyPropertiesAtIndex(imageSource, i, nil) else {\n                        return nil\n                    }\n\n                    let gifInfo = (properties as NSDictionary)[kCGImagePropertyGIFDictionary as String] as? NSDictionary\n                    gifDuration += frameDuration(from: gifInfo)\n                }\n                \n                images.append(Kingfisher<Image>.image(cgImage: imageRef, scale: scale, refImage: nil))\n                \n                if onlyFirstFrame { break }\n            }\n            \n            return (images, gifDuration)\n        }\n        \n        // Start of kf.animatedImageWithGIFData\n        let options: NSDictionary = [kCGImageSourceShouldCache as String: true, kCGImageSourceTypeIdentifierHint as String: kUTTypeGIF]\n        guard let imageSource = CGImageSourceCreateWithData(data as CFData, options) else {\n            return nil\n        }\n        \n        #if os(macOS)\n            guard let (images, gifDuration) = decode(from: imageSource, for: options) else {\n                return nil\n            }\n            let image: Image?\n            if onlyFirstFrame {\n                image = images.first\n            } else {\n                image = Image(data: data)\n                image?.kf.images = images\n                image?.kf.duration = gifDuration\n            }\n            image?.kf.animatedImageData = data\n            return image\n        #else\n            \n            let image: Image?\n            if preloadAll || onlyFirstFrame {\n                guard let (images, gifDuration) = decode(from: imageSource, for: options) else { return nil }\n                image = onlyFirstFrame ? images.first : Kingfisher<Image>.animated(with: images, forDuration: duration <= 0.0 ? gifDuration : duration)\n            } else {\n                image = Image(data: data)\n                image?.kf.imageSource = ImageSource(ref: imageSource)\n            }\n            image?.kf.animatedImageData = data\n            return image\n        #endif\n    }\n\n    static func image(data: Data, scale: CGFloat, preloadAllAnimationData: Bool, onlyFirstFrame: Bool) -> Image? {\n        var image: Image?\n\n        #if os(macOS)\n            switch data.kf.imageFormat {\n            case .JPEG:\n                image = Image(data: data)\n            case .PNG:\n                image = Image(data: data)\n            case .GIF:\n                image = Kingfisher<Image>.animated(\n                    with: data,\n                    scale: scale,\n                    duration: 0.0,\n                    preloadAll: preloadAllAnimationData,\n                    onlyFirstFrame: onlyFirstFrame)\n            case .unknown:\n                image = Image(data: data)\n            }\n        #else\n            switch data.kf.imageFormat {\n            case .JPEG:\n                image = Image(data: data, scale: scale)\n            case .PNG:\n                image = Image(data: data, scale: scale)\n            case .GIF:\n                image = Kingfisher<Image>.animated(\n                    with: data,\n                    scale: scale,\n                    duration: 0.0,\n                    preloadAll: preloadAllAnimationData,\n                    onlyFirstFrame: onlyFirstFrame)\n            case .unknown:\n                image = Image(data: data, scale: scale)\n            }\n        #endif\n\n        return image\n    }\n}\n\n// MARK: - Image Transforming\nextension Kingfisher where Base: Image {\n\n    // MARK: - Round Corner\n    /// Create a round corner image based on `self`.\n    ///\n    /// - parameter radius:          The round corner radius of creating image.\n    /// - parameter size:            The target size of creating image.\n    /// - parameter corners:         The target corners which will be applied rounding.\n    /// - parameter backgroundColor: The background color for the output image\n    ///\n    /// - returns: An image with round corner of `self`.\n    ///\n    /// - Note: This method only works for CG-based image.\n    public func image(withRoundRadius radius: CGFloat,\n                      fit size: CGSize,\n                      roundingCorners corners: RectCorner = .all,\n                      backgroundColor: Color? = nil) -> Image\n    {   \n        guard let cgImage = cgImage else {\n            assertionFailure(\"[Kingfisher] Round corner image only works for CG-based image.\")\n            return base\n        }\n        \n        let rect = CGRect(origin: CGPoint(x: 0, y: 0), size: size)\n        return draw(cgImage: cgImage, to: size) {\n            #if os(macOS)\n                if let backgroundColor = backgroundColor {\n                    let rectPath = NSBezierPath(rect: rect)\n                    backgroundColor.setFill()\n                    rectPath.fill()\n                }\n\n                let path = NSBezierPath(roundedRect: rect, byRoundingCorners: corners, radius: radius)\n                path.windingRule = .evenOddWindingRule\n                path.addClip()\n                base.draw(in: rect)\n            #else\n                guard let context = UIGraphicsGetCurrentContext() else {\n                    assertionFailure(\"[Kingfisher] Failed to create CG context for image.\")\n                    return\n                }\n\n                if let backgroundColor = backgroundColor {\n                    let rectPath = UIBezierPath(rect: rect)\n                    backgroundColor.setFill()\n                    rectPath.fill()\n                }\n\n                let path = UIBezierPath(roundedRect: rect,\n                                        byRoundingCorners: corners.uiRectCorner,\n                                        cornerRadii: CGSize(width: radius, height: radius)).cgPath\n                context.addPath(path)\n                context.clip()\n                base.draw(in: rect)\n            #endif\n        }\n    }\n    \n    #if os(iOS) || os(tvOS)\n    func resize(to size: CGSize, for contentMode: UIViewContentMode) -> Image {\n        switch contentMode {\n        case .scaleAspectFit:\n            return resize(to: size, for: .aspectFit)\n        case .scaleAspectFill:\n            return resize(to: size, for: .aspectFill)\n        default:\n            return resize(to: size)\n        }\n    }\n    #endif\n    \n    // MARK: - Resize\n    /// Resize `self` to an image of new size.\n    ///\n    /// - parameter size: The target size.\n    ///\n    /// - returns: An image with new size.\n    ///\n    /// - Note: This method only works for CG-based image.\n    public func resize(to size: CGSize) -> Image {\n        \n        guard let cgImage = cgImage else {\n            assertionFailure(\"[Kingfisher] Resize only works for CG-based image.\")\n            return base\n        }\n        \n        let rect = CGRect(origin: CGPoint(x: 0, y: 0), size: size)\n        return draw(cgImage: cgImage, to: size) {\n            #if os(macOS)\n                base.draw(in: rect, from: NSRect.zero, operation: .copy, fraction: 1.0)\n            #else\n                base.draw(in: rect)\n            #endif\n        }\n    }\n    \n    /// Resize `self` to an image of new size, respecting the content mode.\n    ///\n    /// - Parameters:\n    ///   - size: The target size.\n    ///   - contentMode: Content mode of output image should be.\n    /// - Returns: An image with new size.\n    public func resize(to size: CGSize, for contentMode: ContentMode) -> Image {\n        switch contentMode {\n        case .aspectFit:\n            let newSize = self.size.kf.constrained(size)\n            return resize(to: newSize)\n        case .aspectFill:\n            let newSize = self.size.kf.filling(size)\n            return resize(to: newSize)\n        default:\n            return resize(to: size)\n        }\n    }\n    \n    public func crop(to size: CGSize, anchorOn anchor: CGPoint) -> Image {\n        guard let cgImage = cgImage else {\n            assertionFailure(\"[Kingfisher] Crop only works for CG-based image.\")\n            return base\n        }\n        \n        let rect = self.size.kf.constrainedRect(for: size, anchor: anchor)\n        guard let image = cgImage.cropping(to: rect.scaled(scale)) else {\n            assertionFailure(\"[Kingfisher] Cropping image failed.\")\n            return base\n        }\n        \n        return Kingfisher.image(cgImage: image, scale: scale, refImage: base)\n    }\n    \n    // MARK: - Blur\n    \n    /// Create an image with blur effect based on `self`.\n    ///\n    /// - parameter radius: The blur radius should be used when creating blur effect.\n    ///\n    /// - returns: An image with blur effect applied.\n    ///\n    /// - Note: This method only works for CG-based image.\n    public func blurred(withRadius radius: CGFloat) -> Image {\n        #if os(watchOS)\n            return base\n        #else\n            guard let cgImage = cgImage else {\n                assertionFailure(\"[Kingfisher] Blur only works for CG-based image.\")\n                return base\n            }\n            \n            // http://www.w3.org/TR/SVG/filters.html#feGaussianBlurElement\n            // let d = floor(s * 3*sqrt(2*pi)/4 + 0.5)\n            // if d is odd, use three box-blurs of size 'd', centered on the output pixel.\n            let s = Float(max(radius, 2.0))\n            // We will do blur on a resized image (*0.5), so the blur radius could be half as well.\n            \n            // Fix the slow compiling time for Swift 3. \n            // See https://github.com/onevcat/Kingfisher/issues/611\n            let pi2 = 2 * Float.pi\n            let sqrtPi2 = sqrt(pi2)\n            var targetRadius = floor(s * 3.0 * sqrtPi2 / 4.0 + 0.5)\n            \n            if targetRadius.isEven {\n                targetRadius += 1\n            }\n            \n            let iterations: Int\n            if radius < 0.5 {\n                iterations = 1\n            } else if radius < 1.5 {\n                iterations = 2\n            } else {\n                iterations = 3\n            }\n            \n            let w = Int(size.width)\n            let h = Int(size.height)\n            let rowBytes = Int(CGFloat(cgImage.bytesPerRow))\n            \n            func createEffectBuffer(_ context: CGContext) -> vImage_Buffer {\n                let data = context.data\n                let width = vImagePixelCount(context.width)\n                let height = vImagePixelCount(context.height)\n                let rowBytes = context.bytesPerRow\n                \n                return vImage_Buffer(data: data, height: height, width: width, rowBytes: rowBytes)\n            }\n\n            guard let context = beginContext(size: size, scale: scale) else {\n                assertionFailure(\"[Kingfisher] Failed to create CG context for blurring image.\")\n                return base\n            }\n            defer { endContext() }\n\n            context.draw(cgImage, in: CGRect(x: 0, y: 0, width: w, height: h))\n            \n            var inBuffer = createEffectBuffer(context)\n            \n            guard let outContext = beginContext(size: size, scale: scale) else {\n                assertionFailure(\"[Kingfisher] Failed to create CG context for blurring image.\")\n                return base\n            }\n            defer { endContext() }\n            var outBuffer = createEffectBuffer(outContext)\n            \n            for _ in 0 ..< iterations {\n                vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, nil, 0, 0, UInt32(targetRadius), UInt32(targetRadius), nil, vImage_Flags(kvImageEdgeExtend))\n                (inBuffer, outBuffer) = (outBuffer, inBuffer)\n            }\n            \n            #if os(macOS)\n                let result = outContext.makeImage().flatMap { fixedForRetinaPixel(cgImage: $0, to: size) }\n            #else\n                let result = outContext.makeImage().flatMap { Image(cgImage: $0, scale: base.scale, orientation: base.imageOrientation) }\n            #endif\n            guard let blurredImage = result else {\n                assertionFailure(\"[Kingfisher] Can not make an blurred image within this context.\")\n                return base\n            }\n            \n            return blurredImage\n        #endif\n    }\n    \n    // MARK: - Overlay\n    \n    /// Create an image from `self` with a color overlay layer.\n    ///\n    /// - parameter color:    The color should be use to overlay.\n    /// - parameter fraction: Fraction of input color. From 0.0 to 1.0. 0.0 means solid color, 1.0 means transparent overlay.\n    ///\n    /// - returns: An image with a color overlay applied.\n    ///\n    /// - Note: This method only works for CG-based image.\n    public func overlaying(with color: Color, fraction: CGFloat) -> Image {\n        \n        guard let cgImage = cgImage else {\n            assertionFailure(\"[Kingfisher] Overlaying only works for CG-based image.\")\n            return base\n        }\n        \n        let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)\n        return draw(cgImage: cgImage, to: rect.size) {\n            #if os(macOS)\n                base.draw(in: rect)\n                if fraction > 0 {\n                    color.withAlphaComponent(1 - fraction).set()\n                    rect.fill(using: .sourceAtop)\n                }\n            #else\n                color.set()\n                UIRectFill(rect)\n                base.draw(in: rect, blendMode: .destinationIn, alpha: 1.0)\n                \n                if fraction > 0 {\n                    base.draw(in: rect, blendMode: .sourceAtop, alpha: fraction)\n                }\n            #endif\n        }\n    }\n    \n    // MARK: - Tint\n    \n    /// Create an image from `self` with a color tint.\n    ///\n    /// - parameter color: The color should be used to tint `self`\n    ///\n    /// - returns: An image with a color tint applied.\n    public func tinted(with color: Color) -> Image {\n        #if os(watchOS)\n            return base\n        #else\n            return apply(.tint(color))\n        #endif\n    }\n    \n    // MARK: - Color Control\n    \n    /// Create an image from `self` with color control.\n    ///\n    /// - parameter brightness: Brightness changing to image.\n    /// - parameter contrast:   Contrast changing to image.\n    /// - parameter saturation: Saturation changing to image.\n    /// - parameter inputEV:    InputEV changing to image.\n    ///\n    /// - returns: An image with color control applied.\n    public func adjusted(brightness: CGFloat, contrast: CGFloat, saturation: CGFloat, inputEV: CGFloat) -> Image {\n        #if os(watchOS)\n            return base\n        #else\n            return apply(.colorControl((brightness, contrast, saturation, inputEV)))\n        #endif\n    }\n}\n\n// MARK: - Decode\nextension Kingfisher where Base: Image {\n    var decoded: Image {\n        return decoded(scale: scale)\n    }\n    \n    func decoded(scale: CGFloat) -> Image {\n        // prevent animated image (GIF) lose it's images\n        #if os(iOS)\n            if imageSource != nil { return base }\n        #else\n            if images != nil { return base }\n        #endif\n        \n        guard let imageRef = self.cgImage else {\n            assertionFailure(\"[Kingfisher] Decoding only works for CG-based image.\")\n            return base\n        }\n        \n        // Draw CGImage in a plain context with scale of 1.0.\n        guard let context = beginContext(size: CGSize(width: imageRef.width, height: imageRef.height), scale: 1.0) else {\n            assertionFailure(\"[Kingfisher] Decoding fails to create a valid context.\")\n            return base\n        }\n        \n        defer { endContext() }\n        \n        let rect = CGRect(x: 0, y: 0, width: CGFloat(imageRef.width), height: CGFloat(imageRef.height))\n        context.draw(imageRef, in: rect)\n        let decompressedImageRef = context.makeImage()\n        return Kingfisher<Image>.image(cgImage: decompressedImageRef!, scale: scale, refImage: base)\n    }\n}\n\n/// Reference the source image reference\nclass ImageSource {\n    var imageRef: CGImageSource?\n    init(ref: CGImageSource) {\n        self.imageRef = ref\n    }\n}\n\n// MARK: - Image format\nprivate struct ImageHeaderData {\n    static var PNG: [UInt8] = [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]\n    static var JPEG_SOI: [UInt8] = [0xFF, 0xD8]\n    static var JPEG_IF: [UInt8] = [0xFF]\n    static var GIF: [UInt8] = [0x47, 0x49, 0x46]\n}\n\nenum ImageFormat {\n    case unknown, PNG, JPEG, GIF\n}\n\n\n// MARK: - Misc Helpers\npublic struct DataProxy {\n    fileprivate let base: Data\n    init(proxy: Data) {\n        base = proxy\n    }\n}\n\nextension Data: KingfisherCompatible {\n    public typealias CompatibleType = DataProxy\n    public var kf: DataProxy {\n        return DataProxy(proxy: self)\n    }\n}\n\nextension DataProxy {\n    var imageFormat: ImageFormat {\n        var buffer = [UInt8](repeating: 0, count: 8)\n        (base as NSData).getBytes(&buffer, length: 8)\n        if buffer == ImageHeaderData.PNG {\n            return .PNG\n        } else if buffer[0] == ImageHeaderData.JPEG_SOI[0] &&\n            buffer[1] == ImageHeaderData.JPEG_SOI[1] &&\n            buffer[2] == ImageHeaderData.JPEG_IF[0]\n        {\n            return .JPEG\n        } else if buffer[0] == ImageHeaderData.GIF[0] &&\n            buffer[1] == ImageHeaderData.GIF[1] &&\n            buffer[2] == ImageHeaderData.GIF[2]\n        {\n            return .GIF\n        }\n\n        return .unknown\n    }\n}\n\npublic struct CGSizeProxy {\n    fileprivate let base: CGSize\n    init(proxy: CGSize) {\n        base = proxy\n    }\n}\n\nextension CGSize: KingfisherCompatible {\n    public typealias CompatibleType = CGSizeProxy\n    public var kf: CGSizeProxy {\n        return CGSizeProxy(proxy: self)\n    }\n}\n\nextension CGSizeProxy {\n    func constrained(_ size: CGSize) -> CGSize {\n        let aspectWidth = round(aspectRatio * size.height)\n        let aspectHeight = round(size.width / aspectRatio)\n\n        return aspectWidth > size.width ? CGSize(width: size.width, height: aspectHeight) : CGSize(width: aspectWidth, height: size.height)\n    }\n\n    func filling(_ size: CGSize) -> CGSize {\n        let aspectWidth = round(aspectRatio * size.height)\n        let aspectHeight = round(size.width / aspectRatio)\n\n        return aspectWidth < size.width ? CGSize(width: size.width, height: aspectHeight) : CGSize(width: aspectWidth, height: size.height)\n    }\n\n    private var aspectRatio: CGFloat {\n        return base.height == 0.0 ? 1.0 : base.width / base.height\n    }\n    \n    \n    func constrainedRect(for size: CGSize, anchor: CGPoint) -> CGRect {\n        \n        let unifiedAnchor = CGPoint(x: anchor.x.clamped(to: 0.0...1.0),\n                                    y: anchor.y.clamped(to: 0.0...1.0))\n        \n        let x = unifiedAnchor.x * base.width - unifiedAnchor.x * size.width\n        let y = unifiedAnchor.y * base.height - unifiedAnchor.y * size.height\n        let r = CGRect(x: x, y: y, width: size.width, height: size.height)\n        \n        let ori = CGRect(origin: CGPoint.zero, size: base)\n        return ori.intersection(r)\n    }\n}\n\nextension CGRect {\n    func scaled(_ scale: CGFloat) -> CGRect {\n        return CGRect(x: origin.x * scale, y: origin.y * scale,\n                      width: size.width * scale, height: size.height * scale)\n    }\n}\n\nextension Comparable {\n    func clamped(to limits: ClosedRange<Self>) -> Self {\n        return min(max(self, limits.lowerBound), limits.upperBound)\n    }\n}\n\nextension Kingfisher where Base: Image {\n    \n    func beginContext(size: CGSize, scale: CGFloat) -> CGContext? {\n        #if os(macOS)\n            guard let rep = NSBitmapImageRep(\n                bitmapDataPlanes: nil,\n                pixelsWide: Int(size.width),\n                pixelsHigh: Int(size.height),\n                bitsPerSample: cgImage?.bitsPerComponent ?? 8,\n                samplesPerPixel: 4,\n                hasAlpha: true,\n                isPlanar: false,\n                colorSpaceName: .calibratedRGB,\n                bytesPerRow: 0,\n                bitsPerPixel: 0) else\n            {\n                assertionFailure(\"[Kingfisher] Image representation cannot be created.\")\n                return nil\n            }\n            rep.size = size\n            NSGraphicsContext.saveGraphicsState()\n            guard let context = NSGraphicsContext(bitmapImageRep: rep) else {\n                assertionFailure(\"[Kingfisher] Image contenxt cannot be created.\")\n                return nil\n            }\n            \n            NSGraphicsContext.current = context\n            return context.cgContext\n        #else\n            UIGraphicsBeginImageContextWithOptions(size, false, scale)\n            let context = UIGraphicsGetCurrentContext()\n            context?.scaleBy(x: 1.0, y: -1.0)\n            context?.translateBy(x: 0, y: -size.height)\n            return context\n        #endif\n    }\n    \n    func endContext() {\n        #if os(macOS)\n            NSGraphicsContext.restoreGraphicsState()\n        #else\n            UIGraphicsEndImageContext()\n        #endif\n    }\n    \n    func draw(cgImage: CGImage?, to size: CGSize, draw: ()->()) -> Image {\n        #if os(macOS)\n        guard let rep = NSBitmapImageRep(\n            bitmapDataPlanes: nil,\n            pixelsWide: Int(size.width),\n            pixelsHigh: Int(size.height),\n            bitsPerSample: cgImage?.bitsPerComponent ?? 8,\n            samplesPerPixel: 4,\n            hasAlpha: true,\n            isPlanar: false,\n            colorSpaceName: .calibratedRGB,\n            bytesPerRow: 0,\n            bitsPerPixel: 0) else\n        {\n            assertionFailure(\"[Kingfisher] Image representation cannot be created.\")\n            return base\n        }\n        rep.size = size\n        \n        NSGraphicsContext.saveGraphicsState()\n        \n        let context = NSGraphicsContext(bitmapImageRep: rep)\n        NSGraphicsContext.current = context\n        draw()\n        NSGraphicsContext.restoreGraphicsState()\n        \n        let outputImage = Image(size: size)\n        outputImage.addRepresentation(rep)\n        return outputImage\n        #else\n            \n        UIGraphicsBeginImageContextWithOptions(size, false, scale)\n        defer { UIGraphicsEndImageContext() }\n        draw()\n        return UIGraphicsGetImageFromCurrentImageContext() ?? base\n        \n        #endif\n    }\n    \n    #if os(macOS)\n    func fixedForRetinaPixel(cgImage: CGImage, to size: CGSize) -> Image {\n        \n        let image = Image(cgImage: cgImage, size: base.size)\n        let rect = CGRect(origin: CGPoint(x: 0, y: 0), size: size)\n        \n        return draw(cgImage: cgImage, to: self.size) {\n            image.draw(in: rect, from: NSRect.zero, operation: .copy, fraction: 1.0)\n        }\n    }\n    #endif\n}\n\nextension Float {\n    var isEven: Bool {\n        return truncatingRemainder(dividingBy: 2.0) == 0\n    }\n}\n\n#if os(macOS)\nextension NSBezierPath {\n    convenience init(roundedRect rect: NSRect, topLeftRadius: CGFloat, topRightRadius: CGFloat,\n         bottomLeftRadius: CGFloat, bottomRightRadius: CGFloat)\n    {\n        self.init()\n        \n        let maxCorner = min(rect.width, rect.height) / 2\n        \n        let radiusTopLeft = min(maxCorner, max(0, topLeftRadius))\n        let radiustopRight = min(maxCorner, max(0, topRightRadius))\n        let radiusbottomLeft = min(maxCorner, max(0, bottomLeftRadius))\n        let radiusbottomRight = min(maxCorner, max(0, bottomRightRadius))\n        \n        guard !NSIsEmptyRect(rect) else {\n            return\n        }\n        \n        let topLeft = NSMakePoint(NSMinX(rect), NSMaxY(rect));\n        let topRight = NSMakePoint(NSMaxX(rect), NSMaxY(rect));\n        let bottomRight = NSMakePoint(NSMaxX(rect), NSMinY(rect));\n        \n        move(to: NSMakePoint(NSMidX(rect), NSMaxY(rect)))\n        appendArc(from: topLeft, to: rect.origin, radius: radiusTopLeft)\n        appendArc(from: rect.origin, to: bottomRight, radius: radiusbottomLeft)\n        appendArc(from: bottomRight, to: topRight, radius: radiusbottomRight)\n        appendArc(from: topRight, to: topLeft, radius: radiustopRight)\n        close()\n    }\n    \n    convenience init(roundedRect rect: NSRect, byRoundingCorners corners: RectCorner, radius: CGFloat) {\n        let radiusTopLeft = corners.contains(.topLeft) ? radius : 0\n        let radiusTopRight = corners.contains(.topRight) ? radius : 0\n        let radiusBottomLeft = corners.contains(.bottomLeft) ? radius : 0\n        let radiusBottomRight = corners.contains(.bottomRight) ? radius : 0\n        \n        self.init(roundedRect: rect, topLeftRadius: radiusTopLeft, topRightRadius: radiusTopRight,\n                  bottomLeftRadius: radiusBottomLeft, bottomRightRadius: radiusBottomRight)\n    }\n}\n    \n#else\nextension RectCorner {\n    var uiRectCorner: UIRectCorner {\n        \n        var result: UIRectCorner = []\n        \n        if self.contains(.topLeft) { result.insert(.topLeft) }\n        if self.contains(.topRight) { result.insert(.topRight) }\n        if self.contains(.bottomLeft) { result.insert(.bottomLeft) }\n        if self.contains(.bottomRight) { result.insert(.bottomRight) }\n        \n        return result\n    }\n}\n#endif\n\n"
  },
  {
    "path": "Pods/Kingfisher/Sources/ImageCache.swift",
    "content": "//\n//  ImageCache.swift\n//  Kingfisher\n//\n//  Created by Wei Wang on 15/4/6.\n//\n//  Copyright (c) 2017 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\npublic extension Notification.Name {\n    /**\n     This notification will be sent when the disk cache got cleaned either there are cached files expired or the total size exceeding the max allowed size. The manually invoking of `clearDiskCache` method will not trigger this notification.\n     \n     The `object` of this notification is the `ImageCache` object which sends the notification.\n     \n     A list of removed hashes (files) could be retrieved by accessing the array under `KingfisherDiskCacheCleanedHashKey` key in `userInfo` of the notification object you received. By checking the array, you could know the hash codes of files are removed.\n     \n     The main purpose of this notification is supplying a chance to maintain some necessary information on the cached files. See [this wiki](https://github.com/onevcat/Kingfisher/wiki/How-to-implement-ETag-based-304-(Not-Modified)-handling-in-Kingfisher) for a use case on it.\n     */\n    public static var KingfisherDidCleanDiskCache = Notification.Name.init(\"com.onevcat.Kingfisher.KingfisherDidCleanDiskCache\")\n}\n\n/**\nKey for array of cleaned hashes in `userInfo` of `KingfisherDidCleanDiskCacheNotification`.\n*/\npublic let KingfisherDiskCacheCleanedHashKey = \"com.onevcat.Kingfisher.cleanedHash\"\n\n/// It represents a task of retrieving image. You can call `cancel` on it to stop the process.\npublic typealias RetrieveImageDiskTask = DispatchWorkItem\n\n/**\nCache type of a cached image.\n\n- None:   The image is not cached yet when retrieving it.\n- Memory: The image is cached in memory.\n- Disk:   The image is cached in disk.\n*/\npublic enum CacheType {\n    case none, memory, disk\n    \n    public var cached: Bool {\n        switch self {\n        case .memory, .disk: return true\n        case .none: return false\n        }\n    }\n}\n\n/// `ImageCache` represents both the memory and disk cache system of Kingfisher. \n/// While a default image cache object will be used if you prefer the extension methods of Kingfisher, \n/// you can create your own cache object and configure it as your need. You could use an `ImageCache`\n/// object to manipulate memory and disk cache for Kingfisher.\nopen class ImageCache {\n\n    //Memory\n    fileprivate let memoryCache = NSCache<NSString, AnyObject>()\n    \n    /// The largest cache cost of memory cache. The total cost is pixel count of \n    /// all cached images in memory.\n    /// Default is unlimited. Memory cache will be purged automatically when a \n    /// memory warning notification is received.\n    open var maxMemoryCost: UInt = 0 {\n        didSet {\n            self.memoryCache.totalCostLimit = Int(maxMemoryCost)\n        }\n    }\n    \n    //Disk\n    fileprivate let ioQueue: DispatchQueue\n    fileprivate var fileManager: FileManager!\n    \n    ///The disk cache location.\n    open let diskCachePath: String\n  \n    /// The default file extension appended to cached files.\n    open var pathExtension: String?\n    \n    /// The longest time duration in second of the cache being stored in disk. \n    /// Default is 1 week (60 * 60 * 24 * 7 seconds).\n    /// Setting this to a negative value will make the disk cache never expiring.\n    open var maxCachePeriodInSecond: TimeInterval = 60 * 60 * 24 * 7 //Cache exists for 1 week\n    \n    /// The largest disk size can be taken for the cache. It is the total \n    /// allocated size of cached files in bytes.\n    /// Default is no limit.\n    open var maxDiskCacheSize: UInt = 0\n    \n    fileprivate let processQueue: DispatchQueue\n    \n    /// The default cache.\n    public static let `default` = ImageCache(name: \"default\")\n    \n    /// Closure that defines the disk cache path from a given path and cacheName.\n    public typealias DiskCachePathClosure = (String?, String) -> String\n    \n    /// The default DiskCachePathClosure\n    public final class func defaultDiskCachePathClosure(path: String?, cacheName: String) -> String {\n        let dstPath = path ?? NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first!\n        return (dstPath as NSString).appendingPathComponent(cacheName)\n    }\n    \n    /**\n    Init method. Passing a name for the cache. It represents a cache folder in the memory and disk.\n    \n    - parameter name: Name of the cache. It will be used as the memory cache name and the disk cache folder name \n                      appending to the cache path. This value should not be an empty string.\n    - parameter path: Optional - Location of cache path on disk. If `nil` is passed in (the default value),\n                      the `.cachesDirectory` in of your app will be used.\n    - parameter diskCachePathClosure: Closure that takes in an optional initial path string and generates\n                      the final disk cache path. You could use it to fully customize your cache path.\n    \n    - returns: The cache object.\n    */\n    public init(name: String,\n                path: String? = nil,\n                diskCachePathClosure: DiskCachePathClosure = ImageCache.defaultDiskCachePathClosure)\n    {\n        \n        if name.isEmpty {\n            fatalError(\"[Kingfisher] You should specify a name for the cache. A cache with empty name is not permitted.\")\n        }\n        \n        let cacheName = \"com.onevcat.Kingfisher.ImageCache.\\(name)\"\n        memoryCache.name = cacheName\n        \n        diskCachePath = diskCachePathClosure(path, cacheName)\n        \n        let ioQueueName = \"com.onevcat.Kingfisher.ImageCache.ioQueue.\\(name)\"\n        ioQueue = DispatchQueue(label: ioQueueName)\n        \n        let processQueueName = \"com.onevcat.Kingfisher.ImageCache.processQueue.\\(name)\"\n        processQueue = DispatchQueue(label: processQueueName, attributes: .concurrent)\n        \n        ioQueue.sync { fileManager = FileManager() }\n        \n#if !os(macOS) && !os(watchOS)\n        NotificationCenter.default.addObserver(\n            self, selector: #selector(clearMemoryCache), name: .UIApplicationDidReceiveMemoryWarning, object: nil)\n        NotificationCenter.default.addObserver(\n            self, selector: #selector(cleanExpiredDiskCache), name: .UIApplicationWillTerminate, object: nil)\n        NotificationCenter.default.addObserver(\n            self, selector: #selector(backgroundCleanExpiredDiskCache), name: .UIApplicationDidEnterBackground, object: nil)\n#endif\n    }\n    \n    deinit {\n        NotificationCenter.default.removeObserver(self)\n    }\n\n\n    // MARK: - Store & Remove\n\n    /**\n    Store an image to cache. It will be saved to both memory and disk. It is an async operation.\n    \n    - parameter image:             The image to be stored.\n    - parameter original:          The original data of the image.\n                                   Kingfisher will use it to check the format of the image and optimize cache size on disk.\n                                   If `nil` is supplied, the image data will be saved as a normalized PNG file.\n                                   It is strongly suggested to supply it whenever possible, to get a better performance and disk usage.\n    - parameter key:               Key for the image.\n    - parameter identifier:        The identifier of processor used. If you are using a processor for the image, pass the identifier of\n                                   processor to it.\n                                   This identifier will be used to generate a corresponding key for the combination of `key` and processor.\n    - parameter toDisk:            Whether this image should be cached to disk or not. If false, the image will be only cached in memory.\n    - parameter completionHandler: Called when store operation completes.\n    */\n    open func store(_ image: Image,\n                      original: Data? = nil,\n                      forKey key: String,\n                      processorIdentifier identifier: String = \"\",\n                      cacheSerializer serializer: CacheSerializer = DefaultCacheSerializer.default,\n                      toDisk: Bool = true,\n                      completionHandler: (() -> Void)? = nil)\n    {\n        \n        let computedKey = key.computedKey(with: identifier)\n        memoryCache.setObject(image, forKey: computedKey as NSString, cost: image.kf.imageCost)\n\n        func callHandlerInMainQueue() {\n            if let handler = completionHandler {\n                DispatchQueue.main.async {\n                    handler()\n                }\n            }\n        }\n        \n        if toDisk {\n            ioQueue.async {\n                \n                if let data = serializer.data(with: image, original: original) {\n                    if !self.fileManager.fileExists(atPath: self.diskCachePath) {\n                        do {\n                            try self.fileManager.createDirectory(atPath: self.diskCachePath, withIntermediateDirectories: true, attributes: nil)\n                        } catch _ {}\n                    }\n                    \n                    self.fileManager.createFile(atPath: self.cachePath(forComputedKey: computedKey), contents: data, attributes: nil)\n                }\n                callHandlerInMainQueue()\n            }\n        } else {\n            callHandlerInMainQueue()\n        }\n    }\n    \n    /**\n    Remove the image for key for the cache. It will be opted out from both memory and disk. \n    It is an async operation.\n    \n    - parameter key:               Key for the image.\n    - parameter identifier:        The identifier of processor used. If you are using a processor for the image, pass the identifier of processor to it.\n                                   This identifier will be used to generate a corresponding key for the combination of `key` and processor.\n    - parameter fromDisk:          Whether this image should be removed from disk or not. If false, the image will be only removed from memory.\n    - parameter completionHandler: Called when removal operation completes.\n    */\n    open func removeImage(forKey key: String,\n                          processorIdentifier identifier: String = \"\",\n                          fromDisk: Bool = true,\n                          completionHandler: (() -> Void)? = nil)\n    {\n        let computedKey = key.computedKey(with: identifier)\n        memoryCache.removeObject(forKey: computedKey as NSString)\n        \n        func callHandlerInMainQueue() {\n            if let handler = completionHandler {\n                DispatchQueue.main.async {\n                    handler()\n                }\n            }\n        }\n        \n        if fromDisk {\n            ioQueue.async{\n                do {\n                    try self.fileManager.removeItem(atPath: self.cachePath(forComputedKey: computedKey))\n                } catch _ {}\n                callHandlerInMainQueue()\n            }\n        } else {\n            callHandlerInMainQueue()\n        }\n    }\n\n    // MARK: - Get data from cache\n\n    /**\n    Get an image for a key from memory or disk.\n    \n    - parameter key:               Key for the image.\n    - parameter options:           Options of retrieving image. If you need to retrieve an image which was \n                                   stored with a specified `ImageProcessor`, pass the processor in the option too.\n    - parameter completionHandler: Called when getting operation completes with image result and cached type of \n                                   this image. If there is no such key cached, the image will be `nil`.\n    \n    - returns: The retrieving task.\n    */\n    @discardableResult\n    open func retrieveImage(forKey key: String,\n                               options: KingfisherOptionsInfo?,\n                     completionHandler: ((Image?, CacheType) -> ())?) -> RetrieveImageDiskTask?\n    {\n        // No completion handler. Not start working and early return.\n        guard let completionHandler = completionHandler else {\n            return nil\n        }\n        \n        var block: RetrieveImageDiskTask?\n        let options = options ?? KingfisherEmptyOptionsInfo\n        \n        if let image = self.retrieveImageInMemoryCache(forKey: key, options: options) {\n            options.callbackDispatchQueue.safeAsync {\n                completionHandler(image, .memory)\n            }\n        } else if options.fromMemoryCacheOrRefresh { // Only allows to get images from memory cache.\n            options.callbackDispatchQueue.safeAsync {\n                completionHandler(nil, .none)\n            }\n        } else {\n            var sSelf: ImageCache! = self\n            block = DispatchWorkItem(block: {\n                // Begin to load image from disk\n                if let image = sSelf.retrieveImageInDiskCache(forKey: key, options: options) {\n                    if options.backgroundDecode {\n                        sSelf.processQueue.async {\n                            let result = image.kf.decoded\n                            \n                            sSelf.store(result,\n                                        forKey: key,\n                                        processorIdentifier: options.processor.identifier,\n                                        cacheSerializer: options.cacheSerializer,\n                                        toDisk: false,\n                                        completionHandler: nil)\n                            options.callbackDispatchQueue.safeAsync {\n                                completionHandler(result, .memory)\n                                sSelf = nil\n                            }\n                        }\n                    } else {\n                        sSelf.store(image,\n                                    forKey: key,\n                                    processorIdentifier: options.processor.identifier,\n                                    cacheSerializer: options.cacheSerializer,\n                                    toDisk: false,\n                                    completionHandler: nil\n                        )\n                        options.callbackDispatchQueue.safeAsync {\n                            completionHandler(image, .disk)\n                            sSelf = nil\n                        }\n                    }\n                } else {\n                    // No image found from either memory or disk\n                    options.callbackDispatchQueue.safeAsync {\n                        completionHandler(nil, .none)\n                        sSelf = nil\n                    }\n                }\n            })\n            \n            sSelf.ioQueue.async(execute: block!)\n        }\n    \n        return block\n    }\n    \n    /**\n    Get an image for a key from memory.\n    \n    - parameter key:     Key for the image.\n    - parameter options: Options of retrieving image. If you need to retrieve an image which was \n                         stored with a specified `ImageProcessor`, pass the processor in the option too.\n    - returns: The image object if it is cached, or `nil` if there is no such key in the cache.\n    */\n    open func retrieveImageInMemoryCache(forKey key: String, options: KingfisherOptionsInfo? = nil) -> Image? {\n        \n        let options = options ?? KingfisherEmptyOptionsInfo\n        let computedKey = key.computedKey(with: options.processor.identifier)\n        \n        return memoryCache.object(forKey: computedKey as NSString) as? Image\n    }\n    \n    /**\n    Get an image for a key from disk.\n    \n    - parameter key:     Key for the image.\n    - parameter options: Options of retrieving image. If you need to retrieve an image which was\n                         stored with a specified `ImageProcessor`, pass the processor in the option too.\n\n    - returns: The image object if it is cached, or `nil` if there is no such key in the cache.\n    */\n    open func retrieveImageInDiskCache(forKey key: String, options: KingfisherOptionsInfo? = nil) -> Image? {\n        \n        let options = options ?? KingfisherEmptyOptionsInfo\n        let computedKey = key.computedKey(with: options.processor.identifier)\n        \n        return diskImage(forComputedKey: computedKey, serializer: options.cacheSerializer, options: options)\n    }\n\n\n    // MARK: - Clear & Clean\n\n    /**\n    Clear memory cache.\n    */\n    @objc public func clearMemoryCache() {\n        memoryCache.removeAllObjects()\n    }\n    \n    /**\n    Clear disk cache. This is an async operation.\n    \n    - parameter completionHander: Called after the operation completes.\n    */\n    open func clearDiskCache(completion handler: (()->())? = nil) {\n        ioQueue.async {\n            do {\n                try self.fileManager.removeItem(atPath: self.diskCachePath)\n                try self.fileManager.createDirectory(atPath: self.diskCachePath, withIntermediateDirectories: true, attributes: nil)\n            } catch _ { }\n            \n            if let handler = handler {\n                DispatchQueue.main.async {\n                    handler()\n                }\n            }\n        }\n    }\n    \n    /**\n    Clean expired disk cache. This is an async operation.\n    */\n    @objc fileprivate func cleanExpiredDiskCache() {\n        cleanExpiredDiskCache(completion: nil)\n    }\n    \n    /**\n    Clean expired disk cache. This is an async operation.\n    \n    - parameter completionHandler: Called after the operation completes.\n    */\n    open func cleanExpiredDiskCache(completion handler: (()->())? = nil) {\n        \n        // Do things in cocurrent io queue\n        ioQueue.async {\n            \n            var (URLsToDelete, diskCacheSize, cachedFiles) = self.travelCachedFiles(onlyForCacheSize: false)\n            \n            for fileURL in URLsToDelete {\n                do {\n                    try self.fileManager.removeItem(at: fileURL)\n                } catch _ { }\n            }\n                \n            if self.maxDiskCacheSize > 0 && diskCacheSize > self.maxDiskCacheSize {\n                let targetSize = self.maxDiskCacheSize / 2\n                    \n                // Sort files by last modify date. We want to clean from the oldest files.\n                let sortedFiles = cachedFiles.keysSortedByValue {\n                    resourceValue1, resourceValue2 -> Bool in\n                    \n                    if let date1 = resourceValue1.contentAccessDate,\n                       let date2 = resourceValue2.contentAccessDate\n                    {\n                        return date1.compare(date2) == .orderedAscending\n                    }\n                    \n                    // Not valid date information. This should not happen. Just in case.\n                    return true\n                }\n                \n                for fileURL in sortedFiles {\n                    \n                    do {\n                        try self.fileManager.removeItem(at: fileURL)\n                    } catch { }\n                        \n                    URLsToDelete.append(fileURL)\n                    \n                    if let fileSize = cachedFiles[fileURL]?.totalFileAllocatedSize {\n                        diskCacheSize -= UInt(fileSize)\n                    }\n                    \n                    if diskCacheSize < targetSize {\n                        break\n                    }\n                }\n            }\n                \n            DispatchQueue.main.async {\n                \n                if URLsToDelete.count != 0 {\n                    let cleanedHashes = URLsToDelete.map { $0.lastPathComponent }\n                    NotificationCenter.default.post(name: .KingfisherDidCleanDiskCache, object: self, userInfo: [KingfisherDiskCacheCleanedHashKey: cleanedHashes])\n                }\n                \n                handler?()\n            }\n        }\n    }\n    \n    fileprivate func travelCachedFiles(onlyForCacheSize: Bool) -> (urlsToDelete: [URL], diskCacheSize: UInt, cachedFiles: [URL: URLResourceValues]) {\n        \n        let diskCacheURL = URL(fileURLWithPath: diskCachePath)\n        let resourceKeys: Set<URLResourceKey> = [.isDirectoryKey, .contentAccessDateKey, .totalFileAllocatedSizeKey]\n        let expiredDate: Date? = (maxCachePeriodInSecond < 0) ? nil : Date(timeIntervalSinceNow: -maxCachePeriodInSecond)\n        \n        var cachedFiles = [URL: URLResourceValues]()\n        var urlsToDelete = [URL]()\n        var diskCacheSize: UInt = 0\n\n        for fileUrl in (try? fileManager.contentsOfDirectory(at: diskCacheURL, includingPropertiesForKeys: Array(resourceKeys), options: .skipsHiddenFiles)) ?? [] {\n\n            do {\n                let resourceValues = try fileUrl.resourceValues(forKeys: resourceKeys)\n                // If it is a Directory. Continue to next file URL.\n                if resourceValues.isDirectory == true {\n                    continue\n                }\n\n                // If this file is expired, add it to URLsToDelete\n                if !onlyForCacheSize,\n                    let expiredDate = expiredDate,\n                    let lastAccessData = resourceValues.contentAccessDate,\n                    (lastAccessData as NSDate).laterDate(expiredDate) == expiredDate\n                {\n                    urlsToDelete.append(fileUrl)\n                    continue\n                }\n\n                if let fileSize = resourceValues.totalFileAllocatedSize {\n                    diskCacheSize += UInt(fileSize)\n                    if !onlyForCacheSize {\n                        cachedFiles[fileUrl] = resourceValues\n                    }\n                }\n            } catch _ { }\n        }\n\n        return (urlsToDelete, diskCacheSize, cachedFiles)\n    }\n\n#if !os(macOS) && !os(watchOS)\n    /**\n    Clean expired disk cache when app in background. This is an async operation.\n    In most cases, you should not call this method explicitly. \n    It will be called automatically when `UIApplicationDidEnterBackgroundNotification` received.\n    */\n    @objc public func backgroundCleanExpiredDiskCache() {\n        // if 'sharedApplication()' is unavailable, then return\n        guard let sharedApplication = Kingfisher<UIApplication>.shared else { return }\n\n        func endBackgroundTask(_ task: inout UIBackgroundTaskIdentifier) {\n            sharedApplication.endBackgroundTask(task)\n            task = UIBackgroundTaskInvalid\n        }\n        \n        var backgroundTask: UIBackgroundTaskIdentifier!\n        backgroundTask = sharedApplication.beginBackgroundTask {\n            endBackgroundTask(&backgroundTask!)\n        }\n        \n        cleanExpiredDiskCache {\n            endBackgroundTask(&backgroundTask!)\n        }\n    }\n#endif\n\n\n    // MARK: - Check cache status\n    \n    /// Cache type for checking whether an image is cached for a key in current cache.\n    ///\n    /// - Parameters:\n    ///   - key: Key for the image.\n    ///   - identifier: Processor identifier which used for this image. Default is empty string.\n    /// - Returns: A `CacheType` instance which indicates the cache status. `.none` means the image is not in cache yet.\n    open func imageCachedType(forKey key: String, processorIdentifier identifier: String = \"\") -> CacheType {\n        let computedKey = key.computedKey(with: identifier)\n        \n        if memoryCache.object(forKey: computedKey as NSString) != nil {\n            return .memory\n        }\n        \n        let filePath = cachePath(forComputedKey: computedKey)\n        \n        var diskCached = false\n        ioQueue.sync {\n            diskCached = fileManager.fileExists(atPath: filePath)\n        }\n        \n        if diskCached {\n            return .disk\n        }\n        \n        return .none\n    }\n    \n    /**\n    Get the hash for the key. This could be used for matching files.\n    \n    - parameter key:        The key which is used for caching.\n    - parameter identifier: The identifier of processor used. If you are using a processor for the image, pass the identifier of processor to it.\n    \n     - returns: Corresponding hash.\n    */\n    open func hash(forKey key: String, processorIdentifier identifier: String = \"\") -> String {\n        let computedKey = key.computedKey(with: identifier)\n        return cacheFileName(forComputedKey: computedKey)\n    }\n    \n    /**\n    Calculate the disk size taken by cache. \n    It is the total allocated size of the cached files in bytes.\n    \n    - parameter completionHandler: Called with the calculated size when finishes.\n    */\n    open func calculateDiskCacheSize(completion handler: @escaping ((_ size: UInt) -> ())) {\n        ioQueue.async {\n            let (_, diskCacheSize, _) = self.travelCachedFiles(onlyForCacheSize: true)\n            DispatchQueue.main.async {\n                handler(diskCacheSize)\n            }\n        }\n    }\n    \n    /**\n    Get the cache path for the key.\n    It is useful for projects with UIWebView or anyone that needs access to the local file path.\n    \n    i.e. Replace the `<img src='path_for_key'>` tag in your HTML.\n     \n    - Note: This method does not guarantee there is an image already cached in the path. It just returns the path\n      that the image should be.\n      You could use `isImageCached(forKey:)` method to check whether the image is cached under that key.\n    */\n    open func cachePath(forKey key: String, processorIdentifier identifier: String = \"\") -> String {\n        let computedKey = key.computedKey(with: identifier)\n        return cachePath(forComputedKey: computedKey)\n    }\n\n    open func cachePath(forComputedKey key: String) -> String {\n        let fileName = cacheFileName(forComputedKey: key)\n        return (diskCachePath as NSString).appendingPathComponent(fileName)\n    }\n}\n\n// MARK: - Internal Helper\nextension ImageCache {\n  \n    func diskImage(forComputedKey key: String, serializer: CacheSerializer, options: KingfisherOptionsInfo) -> Image? {\n        if let data = diskImageData(forComputedKey: key) {\n            return serializer.image(with: data, options: options)\n        } else {\n            return nil\n        }\n    }\n    \n    func diskImageData(forComputedKey key: String) -> Data? {\n        let filePath = cachePath(forComputedKey: key)\n        return (try? Data(contentsOf: URL(fileURLWithPath: filePath)))\n    }\n    \n    func cacheFileName(forComputedKey key: String) -> String {\n        if let ext = self.pathExtension {\n          return (key.kf.md5 as NSString).appendingPathExtension(ext)!\n        }\n        return key.kf.md5\n    }\n}\n\n// MARK: - Deprecated\nextension ImageCache {\n    /**\n     *  Cache result for checking whether an image is cached for a key.\n     */\n    @available(*, deprecated,\n    message: \"CacheCheckResult is deprecated. Use imageCachedType(forKey:processorIdentifier:) API instead.\")\n    public struct CacheCheckResult {\n        public let cached: Bool\n        public let cacheType: CacheType?\n    }\n    \n    /**\n     Check whether an image is cached for a key.\n     \n     - parameter key: Key for the image.\n     \n     - returns: The check result.\n     */\n    @available(*, deprecated,\n    message: \"Use imageCachedType(forKey:processorIdentifier:) instead. CacheCheckResult.none indicates not being cached.\",\n    renamed: \"imageCachedType(forKey:processorIdentifier:)\")\n    open func isImageCached(forKey key: String, processorIdentifier identifier: String = \"\") -> CacheCheckResult {\n        let result = imageCachedType(forKey: key, processorIdentifier: identifier)\n        switch result {\n        case .memory, .disk:\n            return CacheCheckResult(cached: true, cacheType: result)\n        case .none:\n            return CacheCheckResult(cached: false, cacheType: nil)\n        }\n    }\n}\n\nextension Kingfisher where Base: Image {\n    var imageCost: Int {\n        return images == nil ?\n            Int(size.height * size.width * scale * scale) :\n            Int(size.height * size.width * scale * scale) * images!.count\n    }\n}\n\nextension Dictionary {\n    func keysSortedByValue(_ isOrderedBefore: (Value, Value) -> Bool) -> [Key] {\n        return Array(self).sorted{ isOrderedBefore($0.1, $1.1) }.map{ $0.0 }\n    }\n}\n\n#if !os(macOS) && !os(watchOS)\n// MARK: - For App Extensions\nextension UIApplication: KingfisherCompatible { }\nextension Kingfisher where Base: UIApplication {\n    public static var shared: UIApplication? {\n        let selector = NSSelectorFromString(\"sharedApplication\")\n        guard Base.responds(to: selector) else { return nil }\n        return Base.perform(selector).takeUnretainedValue() as? UIApplication\n    }\n}\n#endif\n\nextension String {\n    func computedKey(with identifier: String) -> String {\n        if identifier.isEmpty {\n            return self\n        } else {\n            return appending(\"@\\(identifier)\")\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/Kingfisher/Sources/ImageDownloader.swift",
    "content": "//\n//  ImageDownloader.swift\n//  Kingfisher\n//\n//  Created by Wei Wang on 15/4/6.\n//\n//  Copyright (c) 2017 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\n/// Progress update block of downloader.\npublic typealias ImageDownloaderProgressBlock = DownloadProgressBlock\n\n/// Completion block of downloader.\npublic typealias ImageDownloaderCompletionHandler = ((_ image: Image?, _ error: NSError?, _ url: URL?, _ originalData: Data?) -> ())\n\n/// Download task.\npublic struct RetrieveImageDownloadTask {\n    let internalTask: URLSessionDataTask\n    \n    /// Downloader by which this task is intialized.\n    public private(set) weak var ownerDownloader: ImageDownloader?\n\n    /**\n     Cancel this download task. It will trigger the completion handler with an NSURLErrorCancelled error.\n     */\n    public func cancel() {\n        ownerDownloader?.cancelDownloadingTask(self)\n    }\n    \n    /// The original request URL of this download task.\n    public var url: URL? {\n        return internalTask.originalRequest?.url\n    }\n    \n    /// The relative priority of this download task. \n    /// It represents the `priority` property of the internal `NSURLSessionTask` of this download task.\n    /// The value for it is between 0.0~1.0. Default priority is value of 0.5.\n    /// See documentation on `priority` of `NSURLSessionTask` for more about it.\n    public var priority: Float {\n        get {\n            return internalTask.priority\n        }\n        set {\n            internalTask.priority = newValue\n        }\n    }\n}\n\n///The code of errors which `ImageDownloader` might encountered.\npublic enum KingfisherError: Int {\n    \n    /// badData: The downloaded data is not an image or the data is corrupted.\n    case badData = 10000\n    \n    /// notModified: The remote server responsed a 304 code. No image data downloaded.\n    case notModified = 10001\n    \n    /// The HTTP status code in response is not valid. If an invalid\n    /// code error received, you could check the value under `KingfisherErrorStatusCodeKey` \n    /// in `userInfo` to see the code.\n    case invalidStatusCode = 10002\n    \n    /// notCached: The image rquested is not in cache but .onlyFromCache is activated.\n    case notCached = 10003\n    \n    /// The URL is invalid.\n    case invalidURL = 20000\n    \n    /// The downloading task is cancelled before started.\n    case downloadCancelledBeforeStarting = 30000\n}\n\n/// Key will be used in the `userInfo` of `.invalidStatusCode`\npublic let KingfisherErrorStatusCodeKey = \"statusCode\"\n\n/// Protocol of `ImageDownloader`.\npublic protocol ImageDownloaderDelegate: class {\n    /**\n    Called when the `ImageDownloader` object successfully downloaded an image from specified URL.\n    \n    - parameter downloader: The `ImageDownloader` object finishes the downloading.\n    - parameter image:      Downloaded image.\n    - parameter url:        URL of the original request URL.\n    - parameter response:   The response object of the downloading process.\n    */\n    func imageDownloader(_ downloader: ImageDownloader, didDownload image: Image, for url: URL, with response: URLResponse?)\n    \n    /**\n    Called when the `ImageDownloader` object starts to download an image from specified URL.\n     \n    - parameter downloader: The `ImageDownloader` object starts the downloading.\n    - parameter url:        URL of the original request.\n    - parameter response:   The request object of the downloading process.\n    */\n    func imageDownloader(_ downloader: ImageDownloader, willDownloadImageForURL url: URL, with request: URLRequest?)\n    \n    /**\n    Check if a received HTTP status code is valid or not. \n    By default, a status code between 200 to 400 (excluded) is considered as valid.\n    If an invalid code is received, the downloader will raise an .invalidStatusCode error.\n    It has a `userInfo` which includes this statusCode and localizedString error message.\n     \n    - parameter code: The received HTTP status code.\n    - parameter downloader: The `ImageDownloader` object asking for validate status code.\n     \n    - returns: Whether this HTTP status code is valid or not.\n     \n    - Note: If the default 200 to 400 valid code does not suit your need, \n            you can implement this method to change that behavior.\n    */\n    func isValidStatusCode(_ code: Int, for downloader: ImageDownloader) -> Bool\n    \n    /**\n     Called when the `ImageDownloader` object successfully downloaded image data from specified URL.\n     \n     - parameter downloader: The `ImageDownloader` object finishes data downloading.\n     - parameter data:       Downloaded data.\n     - parameter url:        URL of the original request URL.\n     \n     - returns: The data from which Kingfisher should use to create an image.\n     \n     - Note: This callback can be used to preprocess raw image data\n             before creation of UIImage instance (i.e. decrypting or verification).\n     */\n    func imageDownloader(_ downloader: ImageDownloader, didDownload data: Data, for url: URL) -> Data?\n}\n\nextension ImageDownloaderDelegate {\n    public func imageDownloader(_ downloader: ImageDownloader, didDownload image: Image, for url: URL, with response: URLResponse?) {}\n    \n    public func imageDownloader(_ downloader: ImageDownloader, willDownloadImageForURL url: URL, with request: URLRequest?) {}\n    public func isValidStatusCode(_ code: Int, for downloader: ImageDownloader) -> Bool {\n        return (200..<400).contains(code)\n    }\n    public func imageDownloader(_ downloader: ImageDownloader, didDownload data: Data, for url: URL) -> Data? {\n        return data\n    }\n}\n\n/// Protocol indicates that an authentication challenge could be handled.\npublic protocol AuthenticationChallengeResponsable: class {\n    /**\n     Called when an session level authentication challenge is received.\n     This method provide a chance to handle and response to the authentication challenge before downloading could start.\n     \n     - parameter downloader:        The downloader which receives this challenge.\n     - parameter challenge:         An object that contains the request for authentication.\n     - parameter completionHandler: A handler that your delegate method must call.\n     \n     - Note: This method is a forward from `URLSessionDelegate.urlSession(:didReceiveChallenge:completionHandler:)`. Please refer to the document of it in `URLSessionDelegate`.\n     */\n    func downloader(_ downloader: ImageDownloader, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void)\n\n    /**\n     Called when an session level authentication challenge is received.\n     This method provide a chance to handle and response to the authentication challenge before downloading could start.\n     \n     - parameter downloader:        The downloader which receives this challenge.\n     - parameter task:              The task whose request requires authentication.\n     - parameter challenge:         An object that contains the request for authentication.\n     - parameter completionHandler: A handler that your delegate method must call.\n     \n     - Note: This method is a forward from `URLSessionTaskDelegate.urlSession(:task:didReceiveChallenge:completionHandler:)`. Please refer to the document of it in `URLSessionTaskDelegate`.\n     */\n    func downloader(_ downloader: ImageDownloader, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void)\n}\n\nextension AuthenticationChallengeResponsable {\n    \n    func downloader(_ downloader: ImageDownloader, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {\n    \n        if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {\n            if let trustedHosts = downloader.trustedHosts, trustedHosts.contains(challenge.protectionSpace.host) {\n                let credential = URLCredential(trust: challenge.protectionSpace.serverTrust!)\n                completionHandler(.useCredential, credential)\n                return\n            }\n        }\n        \n        completionHandler(.performDefaultHandling, nil)\n    }\n    \n    func downloader(_ downloader: ImageDownloader, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {\n        \n        completionHandler(.performDefaultHandling, nil)\n    }\n\n}\n\n/// `ImageDownloader` represents a downloading manager for requesting the image with a URL from server.\nopen class ImageDownloader {\n    \n    class ImageFetchLoad {\n        var contents = [(callback: CallbackPair, options: KingfisherOptionsInfo)]()\n        var responseData = NSMutableData()\n\n        var downloadTaskCount = 0\n        var downloadTask: RetrieveImageDownloadTask?\n        var cancelSemaphore: DispatchSemaphore?\n    }\n    \n    // MARK: - Public property\n    /// The duration before the download is timeout. Default is 15 seconds.\n    open var downloadTimeout: TimeInterval = 15.0\n    \n    /// A set of trusted hosts when receiving server trust challenges. A challenge with host name contained in this set will be ignored. \n    /// You can use this set to specify the self-signed site. It only will be used if you don't specify the `authenticationChallengeResponder`. \n    /// If `authenticationChallengeResponder` is set, this property will be ignored and the implemention of `authenticationChallengeResponder` will be used instead.\n    open var trustedHosts: Set<String>?\n    \n    /// Use this to set supply a configuration for the downloader. By default, NSURLSessionConfiguration.ephemeralSessionConfiguration() will be used. \n    /// You could change the configuration before a downloaing task starts. A configuration without persistent storage for caches is requsted for downloader working correctly.\n    open var sessionConfiguration = URLSessionConfiguration.ephemeral {\n        didSet {\n            session?.invalidateAndCancel()\n            session = URLSession(configuration: sessionConfiguration, delegate: sessionHandler, delegateQueue: OperationQueue.main)\n        }\n    }\n    \n    /// Whether the download requests should use pipeling or not. Default is false.\n    open var requestsUsePipelining = false\n    \n    fileprivate let sessionHandler: ImageDownloaderSessionHandler\n    fileprivate var session: URLSession?\n    \n    /// Delegate of this `ImageDownloader` object. See `ImageDownloaderDelegate` protocol for more.\n    open weak var delegate: ImageDownloaderDelegate?\n    \n    /// A responder for authentication challenge. \n    /// Downloader will forward the received authentication challenge for the downloading session to this responder.\n    open weak var authenticationChallengeResponder: AuthenticationChallengeResponsable?\n    \n    // MARK: - Internal property\n    let barrierQueue: DispatchQueue\n    let processQueue: DispatchQueue\n    let cancelQueue: DispatchQueue\n    \n    typealias CallbackPair = (progressBlock: ImageDownloaderProgressBlock?, completionHandler: ImageDownloaderCompletionHandler?)\n    \n    var fetchLoads = [URL: ImageFetchLoad]()\n    \n    // MARK: - Public method\n    /// The default downloader.\n    public static let `default` = ImageDownloader(name: \"default\")\n    \n    /**\n    Init a downloader with name.\n    \n    - parameter name: The name for the downloader. It should not be empty.\n    \n    - returns: The downloader object.\n    */\n    public init(name: String) {\n        if name.isEmpty {\n            fatalError(\"[Kingfisher] You should specify a name for the downloader. A downloader with empty name is not permitted.\")\n        }\n        \n        barrierQueue = DispatchQueue(label: \"com.onevcat.Kingfisher.ImageDownloader.Barrier.\\(name)\", attributes: .concurrent)\n        processQueue = DispatchQueue(label: \"com.onevcat.Kingfisher.ImageDownloader.Process.\\(name)\", attributes: .concurrent)\n        cancelQueue = DispatchQueue(label: \"com.onevcat.Kingfisher.ImageDownloader.Cancel.\\(name)\")\n        \n        sessionHandler = ImageDownloaderSessionHandler()\n\n        // Provide a default implement for challenge responder.\n        authenticationChallengeResponder = sessionHandler\n        session = URLSession(configuration: sessionConfiguration, delegate: sessionHandler, delegateQueue: .main)\n    }\n    \n    deinit {\n        session?.invalidateAndCancel()\n    }\n    \n    func fetchLoad(for url: URL) -> ImageFetchLoad? {\n        var fetchLoad: ImageFetchLoad?\n        barrierQueue.sync(flags: .barrier) { fetchLoad = fetchLoads[url] }\n        return fetchLoad\n    }\n    \n    /**\n     Download an image with a URL and option.\n     \n     - parameter url:               Target URL.\n     - parameter retrieveImageTask: The task to cooporate with cache. Pass `nil` if you are not trying to use downloader and cache.\n     - parameter options:           The options could control download behavior. See `KingfisherOptionsInfo`.\n     - parameter progressBlock:     Called when the download progress updated.\n     - parameter completionHandler: Called when the download progress finishes.\n     \n     - returns: A downloading task. You could call `cancel` on it to stop the downloading process.\n     */\n    @discardableResult\n    open func downloadImage(with url: URL,\n                       retrieveImageTask: RetrieveImageTask? = nil,\n                       options: KingfisherOptionsInfo? = nil,\n                       progressBlock: ImageDownloaderProgressBlock? = nil,\n                       completionHandler: ImageDownloaderCompletionHandler? = nil) -> RetrieveImageDownloadTask?\n    {\n        if let retrieveImageTask = retrieveImageTask, retrieveImageTask.cancelledBeforeDownloadStarting {\n            completionHandler?(nil, NSError(domain: KingfisherErrorDomain, code: KingfisherError.downloadCancelledBeforeStarting.rawValue, userInfo: nil), nil, nil)\n            return nil\n        }\n        \n        let timeout = self.downloadTimeout == 0.0 ? 15.0 : self.downloadTimeout\n        \n        // We need to set the URL as the load key. So before setup progress, we need to ask the `requestModifier` for a final URL.\n        var request = URLRequest(url: url, cachePolicy: .reloadIgnoringLocalCacheData, timeoutInterval: timeout)\n        request.httpShouldUsePipelining = requestsUsePipelining\n\n        if let modifier = options?.modifier {\n            guard let r = modifier.modified(for: request) else {\n                completionHandler?(nil, NSError(domain: KingfisherErrorDomain, code: KingfisherError.downloadCancelledBeforeStarting.rawValue, userInfo: nil), nil, nil)\n                return nil\n            }\n            request = r\n        }\n        \n        // There is a possiblility that request modifier changed the url to `nil` or empty.\n        guard let url = request.url, !url.absoluteString.isEmpty else {\n            completionHandler?(nil, NSError(domain: KingfisherErrorDomain, code: KingfisherError.invalidURL.rawValue, userInfo: nil), nil, nil)\n            return nil\n        }\n        \n        var downloadTask: RetrieveImageDownloadTask?\n        setup(progressBlock: progressBlock, with: completionHandler, for: url, options: options) {(session, fetchLoad) -> Void in\n            if fetchLoad.downloadTask == nil {\n                let dataTask = session.dataTask(with: request)\n                \n                fetchLoad.downloadTask = RetrieveImageDownloadTask(internalTask: dataTask, ownerDownloader: self)\n                \n                dataTask.priority = options?.downloadPriority ?? URLSessionTask.defaultPriority\n                dataTask.resume()\n                self.delegate?.imageDownloader(self, willDownloadImageForURL: url, with: request)\n                \n                // Hold self while the task is executing.\n                self.sessionHandler.downloadHolder = self\n            }\n            \n            fetchLoad.downloadTaskCount += 1\n            downloadTask = fetchLoad.downloadTask\n            \n            retrieveImageTask?.downloadTask = downloadTask\n        }\n        return downloadTask\n    }\n    \n}\n\n// MARK: - Download method\nextension ImageDownloader {\n    \n    // A single key may have multiple callbacks. Only download once.\n    func setup(progressBlock: ImageDownloaderProgressBlock?, with completionHandler: ImageDownloaderCompletionHandler?, for url: URL, options: KingfisherOptionsInfo?, started: @escaping ((URLSession, ImageFetchLoad) -> Void)) {\n\n        func prepareFetchLoad() {\n            barrierQueue.sync(flags: .barrier) {\n                let loadObjectForURL = fetchLoads[url] ?? ImageFetchLoad()\n                let callbackPair = (progressBlock: progressBlock, completionHandler: completionHandler)\n                \n                loadObjectForURL.contents.append((callbackPair, options ?? KingfisherEmptyOptionsInfo))\n                \n                fetchLoads[url] = loadObjectForURL\n                \n                if let session = session {\n                    started(session, loadObjectForURL)\n                }\n            }\n        }\n        \n        if let fetchLoad = fetchLoad(for: url), fetchLoad.downloadTaskCount == 0 {\n            if fetchLoad.cancelSemaphore == nil {\n                fetchLoad.cancelSemaphore = DispatchSemaphore(value: 0)\n            }\n            cancelQueue.async {\n                _ = fetchLoad.cancelSemaphore?.wait(timeout: .distantFuture)\n                fetchLoad.cancelSemaphore = nil\n                prepareFetchLoad()\n            }\n        } else {\n            prepareFetchLoad()\n        }\n    }\n    \n    func cancelDownloadingTask(_ task: RetrieveImageDownloadTask) {\n        barrierQueue.sync(flags: .barrier) {\n            if let URL = task.internalTask.originalRequest?.url, let imageFetchLoad = self.fetchLoads[URL] {\n                imageFetchLoad.downloadTaskCount -= 1\n                if imageFetchLoad.downloadTaskCount == 0 {\n                    task.internalTask.cancel()\n                }\n            }\n        }\n    }\n}\n\n// MARK: - NSURLSessionDataDelegate\n\n/// Delegate class for `NSURLSessionTaskDelegate`.\n/// The session object will hold its delegate until it gets invalidated.\n/// If we use `ImageDownloader` as the session delegate, it will not be released.\n/// So we need an additional handler to break the retain cycle.\n// See https://github.com/onevcat/Kingfisher/issues/235\nclass ImageDownloaderSessionHandler: NSObject, URLSessionDataDelegate, AuthenticationChallengeResponsable {\n    \n    // The holder will keep downloader not released while a data task is being executed.\n    // It will be set when the task started, and reset when the task finished.\n    var downloadHolder: ImageDownloader?\n    \n    func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) {\n        \n        guard let downloader = downloadHolder else {\n            completionHandler(.cancel)\n            return\n        }\n        \n        if let statusCode = (response as? HTTPURLResponse)?.statusCode,\n           let url = dataTask.originalRequest?.url,\n            !(downloader.delegate ?? downloader).isValidStatusCode(statusCode, for: downloader)\n        {\n            let error = NSError(domain: KingfisherErrorDomain,\n                                code: KingfisherError.invalidStatusCode.rawValue,\n                                userInfo: [KingfisherErrorStatusCodeKey: statusCode, NSLocalizedDescriptionKey: HTTPURLResponse.localizedString(forStatusCode: statusCode)])\n            callCompletionHandlerFailure(error: error, url: url)\n        }\n        \n        completionHandler(.allow)\n    }\n    \n    func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {\n\n        guard let downloader = downloadHolder else {\n            return\n        }\n\n        if let url = dataTask.originalRequest?.url, let fetchLoad = downloader.fetchLoad(for: url) {\n            fetchLoad.responseData.append(data)\n            \n            if let expectedLength = dataTask.response?.expectedContentLength {\n                for content in fetchLoad.contents {\n                    DispatchQueue.main.async {\n                        content.callback.progressBlock?(Int64(fetchLoad.responseData.length), expectedLength)\n                    }\n                }\n            }\n        }\n    }\n    \n    func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {\n        \n        guard let url = task.originalRequest?.url else {\n            return\n        }\n        \n        guard error == nil else {\n            callCompletionHandlerFailure(error: error!, url: url)\n            return\n        }\n        \n        processImage(for: task, url: url)\n    }\n    \n    /**\n    This method is exposed since the compiler requests. Do not call it.\n    */\n    func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {\n        guard let downloader = downloadHolder else {\n            return\n        }\n        \n        downloader.authenticationChallengeResponder?.downloader(downloader, didReceive: challenge, completionHandler: completionHandler)\n    }\n    \n    func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {\n        guard let downloader = downloadHolder else {\n            return\n        }\n        \n        downloader.authenticationChallengeResponder?.downloader(downloader, task: task, didReceive: challenge, completionHandler: completionHandler)\n    }\n    \n    private func cleanFetchLoad(for url: URL) {\n        guard let downloader = downloadHolder else {\n            return\n        }\n\n        downloader.barrierQueue.sync(flags: .barrier) {\n            downloader.fetchLoads.removeValue(forKey: url)\n            if downloader.fetchLoads.isEmpty {\n                downloadHolder = nil\n            }\n        }\n    }\n    \n    private func callCompletionHandlerFailure(error: Error, url: URL) {\n        guard let downloader = downloadHolder, let fetchLoad = downloader.fetchLoad(for: url) else {\n            return\n        }\n        \n        // We need to clean the fetch load first, before actually calling completion handler.\n        cleanFetchLoad(for: url)\n        \n        var leftSignal: Int\n        repeat {\n            leftSignal = fetchLoad.cancelSemaphore?.signal() ?? 0\n        } while leftSignal != 0\n        \n        for content in fetchLoad.contents {\n            content.options.callbackDispatchQueue.safeAsync {\n                content.callback.completionHandler?(nil, error as NSError, url, nil)\n            }\n        }\n    }\n    \n    private func processImage(for task: URLSessionTask, url: URL) {\n\n        guard let downloader = downloadHolder else {\n            return\n        }\n        \n        // We are on main queue when receiving this.\n        downloader.processQueue.async {\n            \n            guard let fetchLoad = downloader.fetchLoad(for: url) else {\n                return\n            }\n            \n            self.cleanFetchLoad(for: url)\n            \n            let data: Data?\n            let fetchedData = fetchLoad.responseData as Data\n            \n            if let delegate = downloader.delegate {\n                data = delegate.imageDownloader(downloader, didDownload: fetchedData, for: url)\n            } else {\n                data = fetchedData\n            }\n            \n            // Cache the processed images. So we do not need to re-process the image if using the same processor.\n            // Key is the identifier of processor.\n            var imageCache: [String: Image] = [:]\n            for content in fetchLoad.contents {\n                \n                let options = content.options\n                let completionHandler = content.callback.completionHandler\n                let callbackQueue = options.callbackDispatchQueue\n                \n                let processor = options.processor\n                \n                var image = imageCache[processor.identifier]\n                if let data = data, image == nil {\n                    image = processor.process(item: .data(data), options: options)\n                    // Add the processed image to cache. \n                    // If `image` is nil, nothing will happen (since the key is not existing before).\n                    imageCache[processor.identifier] = image\n                }\n                \n                if let image = image {\n                    \n                    downloader.delegate?.imageDownloader(downloader, didDownload: image, for: url, with: task.response)\n                    \n                    if options.backgroundDecode {\n                        let decodedImage = image.kf.decoded\n                        callbackQueue.safeAsync { completionHandler?(decodedImage, nil, url, data) }\n                    } else {\n                        callbackQueue.safeAsync { completionHandler?(image, nil, url, data) }\n                    }\n                    \n                } else {\n                    if let res = task.response as? HTTPURLResponse , res.statusCode == 304 {\n                        let notModified = NSError(domain: KingfisherErrorDomain, code: KingfisherError.notModified.rawValue, userInfo: nil)\n                        completionHandler?(nil, notModified, url, nil)\n                        continue\n                    }\n                    \n                    let badData = NSError(domain: KingfisherErrorDomain, code: KingfisherError.badData.rawValue, userInfo: nil)\n                    callbackQueue.safeAsync { completionHandler?(nil, badData, url, nil) }\n                }\n            }\n        }\n    }\n}\n\n// Placeholder. For retrieving extension methods of ImageDownloaderDelegate\nextension ImageDownloader: ImageDownloaderDelegate {}\n\n"
  },
  {
    "path": "Pods/Kingfisher/Sources/ImagePrefetcher.swift",
    "content": "//\n//  ImagePrefetcher.swift\n//  Kingfisher\n//\n//  Created by Claire Knight <claire.knight@moggytech.co.uk> on 24/02/2016\n//\n//  Copyright (c) 2017 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n\n#if os(macOS)\n    import AppKit\n#else\n    import UIKit\n#endif\n\n\n/// Progress update block of prefetcher. \n///\n/// - `skippedResources`: An array of resources that are already cached before the prefetching starting.\n/// - `failedResources`: An array of resources that fail to be downloaded. It could because of being cancelled while downloading, encountered an error when downloading or the download not being started at all.\n/// - `completedResources`: An array of resources that are downloaded and cached successfully.\npublic typealias PrefetcherProgressBlock = ((_ skippedResources: [Resource], _ failedResources: [Resource], _ completedResources: [Resource]) -> ())\n\n/// Completion block of prefetcher.\n///\n/// - `skippedResources`: An array of resources that are already cached before the prefetching starting.\n/// - `failedResources`: An array of resources that fail to be downloaded. It could because of being cancelled while downloading, encountered an error when downloading or the download not being started at all.\n/// - `completedResources`: An array of resources that are downloaded and cached successfully.\npublic typealias PrefetcherCompletionHandler = ((_ skippedResources: [Resource], _ failedResources: [Resource], _ completedResources: [Resource]) -> ())\n\n/// `ImagePrefetcher` represents a downloading manager for requesting many images via URLs, then caching them.\n/// This is useful when you know a list of image resources and want to download them before showing.\npublic class ImagePrefetcher {\n    \n    /// The maximum concurrent downloads to use when prefetching images. Default is 5.\n    public var maxConcurrentDownloads = 5\n    \n    private let prefetchResources: [Resource]\n    private let optionsInfo: KingfisherOptionsInfo\n    private var progressBlock: PrefetcherProgressBlock?\n    private var completionHandler: PrefetcherCompletionHandler?\n    \n    private var tasks = [URL: RetrieveImageDownloadTask]()\n    \n    private var pendingResources: ArraySlice<Resource>\n    private var skippedResources = [Resource]()\n    private var completedResources = [Resource]()\n    private var failedResources = [Resource]()\n    \n    private var stopped = false\n    \n    // The created manager used for prefetch. We will use the helper method in manager.\n    private let manager: KingfisherManager\n    \n    private var finished: Bool {\n        return failedResources.count + skippedResources.count + completedResources.count == prefetchResources.count && self.tasks.isEmpty\n    }\n    \n    /**\n     Init an image prefetcher with an array of URLs.\n     \n     The prefetcher should be initiated with a list of prefetching targets. The URLs list is immutable. \n     After you get a valid `ImagePrefetcher` object, you could call `start()` on it to begin the prefetching process.\n     The images already cached will be skipped without downloading again.\n     \n     - parameter urls:              The URLs which should be prefetched.\n     - parameter options:           A dictionary could control some behaviors. See `KingfisherOptionsInfo` for more.\n     - parameter progressBlock:     Called every time an resource is downloaded, skipped or cancelled.\n     - parameter completionHandler: Called when the whole prefetching process finished.\n     \n     - returns: An `ImagePrefetcher` object.\n     \n     - Note: By default, the `ImageDownloader.defaultDownloader` and `ImageCache.defaultCache` will be used as \n     the downloader and cache target respectively. You can specify another downloader or cache by using a customized `KingfisherOptionsInfo`.\n     Both the progress and completion block will be invoked in main thread. The `CallbackDispatchQueue` in `optionsInfo` will be ignored in this method.\n     */\n    public convenience init(urls: [URL],\n                         options: KingfisherOptionsInfo? = nil,\n                   progressBlock: PrefetcherProgressBlock? = nil,\n               completionHandler: PrefetcherCompletionHandler? = nil)\n    {\n        let resources: [Resource] = urls.map { $0 }\n        self.init(resources: resources, options: options, progressBlock: progressBlock, completionHandler: completionHandler)\n    }\n    \n    /**\n     Init an image prefetcher with an array of resources.\n     \n     The prefetcher should be initiated with a list of prefetching targets. The resources list is immutable.\n     After you get a valid `ImagePrefetcher` object, you could call `start()` on it to begin the prefetching process.\n     The images already cached will be skipped without downloading again.\n     \n     - parameter resources:         The resources which should be prefetched. See `Resource` type for more.\n     - parameter options:           A dictionary could control some behaviors. See `KingfisherOptionsInfo` for more.\n     - parameter progressBlock:     Called every time an resource is downloaded, skipped or cancelled.\n     - parameter completionHandler: Called when the whole prefetching process finished.\n     \n     - returns: An `ImagePrefetcher` object.\n     \n     - Note: By default, the `ImageDownloader.defaultDownloader` and `ImageCache.defaultCache` will be used as\n     the downloader and cache target respectively. You can specify another downloader or cache by using a customized `KingfisherOptionsInfo`.\n     Both the progress and completion block will be invoked in main thread. The `CallbackDispatchQueue` in `optionsInfo` will be ignored in this method.\n     */\n    public init(resources: [Resource],\n                  options: KingfisherOptionsInfo? = nil,\n            progressBlock: PrefetcherProgressBlock? = nil,\n        completionHandler: PrefetcherCompletionHandler? = nil)\n    {\n        prefetchResources = resources\n        pendingResources = ArraySlice(resources)\n        \n        // We want all callbacks from main queue, so we ignore the call back queue in options\n        let optionsInfoWithoutQueue = options?.removeAllMatchesIgnoringAssociatedValue(.callbackDispatchQueue(nil))\n        self.optionsInfo = optionsInfoWithoutQueue ?? KingfisherEmptyOptionsInfo\n        \n        let cache = self.optionsInfo.targetCache\n        let downloader = self.optionsInfo.downloader\n        manager = KingfisherManager(downloader: downloader, cache: cache)\n        \n        self.progressBlock = progressBlock\n        self.completionHandler = completionHandler\n    }\n    \n    /**\n     Start to download the resources and cache them. This can be useful for background downloading\n     of assets that are required for later use in an app. This code will not try and update any UI\n     with the results of the process.\n     */\n    public func start()\n    {\n        // Since we want to handle the resources cancellation in main thread only.\n        DispatchQueue.main.safeAsync {\n            \n            guard !self.stopped else {\n                assertionFailure(\"You can not restart the same prefetcher. Try to create a new prefetcher.\")\n                self.handleComplete()\n                return\n            }\n            \n            guard self.maxConcurrentDownloads > 0 else {\n                assertionFailure(\"There should be concurrent downloads value should be at least 1.\")\n                self.handleComplete()\n                return\n            }\n            \n            guard self.prefetchResources.count > 0 else {\n                self.handleComplete()\n                return\n            }\n            \n            let initialConcurentDownloads = min(self.prefetchResources.count, self.maxConcurrentDownloads)\n            for _ in 0 ..< initialConcurentDownloads {\n                if let resource = self.pendingResources.popFirst() {\n                    self.startPrefetching(resource)\n                }\n            }\n        }\n    }\n\n   \n    /**\n     Stop current downloading progress, and cancel any future prefetching activity that might be occuring.\n     */\n    public func stop() {\n        DispatchQueue.main.safeAsync {\n            if self.finished { return }\n            self.stopped = true\n            self.tasks.values.forEach { $0.cancel() }\n        }\n    }\n    \n    func downloadAndCache(_ resource: Resource) {\n\n        let downloadTaskCompletionHandler: CompletionHandler = { (image, error, _, _) -> () in\n            self.tasks.removeValue(forKey: resource.downloadURL)\n            if let _ = error {\n                self.failedResources.append(resource)\n            } else {\n                self.completedResources.append(resource)\n            }\n            \n            self.reportProgress()\n            if self.stopped {\n                if self.tasks.isEmpty {\n                    self.failedResources.append(contentsOf: self.pendingResources)\n                    self.handleComplete()\n                }\n            } else {\n                self.reportCompletionOrStartNext()\n            }\n        }\n        \n        let downloadTask = manager.downloadAndCacheImage(\n            with: resource.downloadURL,\n            forKey: resource.cacheKey,\n            retrieveImageTask: RetrieveImageTask(),\n            progressBlock: nil,\n            completionHandler: downloadTaskCompletionHandler,\n            options: optionsInfo)\n        \n        if let downloadTask = downloadTask {\n            tasks[resource.downloadURL] = downloadTask\n        }\n    }\n    \n    func append(cached resource: Resource) {\n        skippedResources.append(resource)\n \n        reportProgress()\n        reportCompletionOrStartNext()\n    }\n    \n    func startPrefetching(_ resource: Resource)\n    {\n        if optionsInfo.forceRefresh {\n            downloadAndCache(resource)\n        } else {\n            let alreadyInCache = manager.cache.imageCachedType(forKey: resource.cacheKey,\n                                                             processorIdentifier: optionsInfo.processor.identifier).cached\n            if alreadyInCache {\n                append(cached: resource)\n            } else {\n                downloadAndCache(resource)\n            }\n        }\n    }\n    \n    func reportProgress() {\n        progressBlock?(skippedResources, failedResources, completedResources)\n    }\n    \n    func reportCompletionOrStartNext() {\n        if let resource = pendingResources.popFirst() {\n            startPrefetching(resource)\n        } else {\n            guard tasks.isEmpty else { return }\n            handleComplete()\n        }\n    }\n    \n    func handleComplete() {\n        completionHandler?(skippedResources, failedResources, completedResources)\n        completionHandler = nil\n        progressBlock = nil\n    }\n}\n"
  },
  {
    "path": "Pods/Kingfisher/Sources/ImageProcessor.swift",
    "content": "//\n//  ImageProcessor.swift\n//  Kingfisher\n//\n//  Created by Wei Wang on 2016/08/26.\n//\n//  Copyright (c) 2017 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\nimport CoreGraphics\n\n/// The item which could be processed by an `ImageProcessor`\n///\n/// - image: Input image\n/// - data:  Input data\npublic enum ImageProcessItem {\n    case image(Image)\n    case data(Data)\n}\n\n/// An `ImageProcessor` would be used to convert some downloaded data to an image.\npublic protocol ImageProcessor {\n    /// Identifier of the processor. It will be used to identify the processor when \n    /// caching and retriving an image. You might want to make sure that processors with\n    /// same properties/functionality have the same identifiers, so correct processed images\n    /// could be retrived with proper key.\n    /// \n    /// - Note: Do not supply an empty string for a customized processor, which is already taken by\n    /// the `DefaultImageProcessor`. It is recommended to use a reverse domain name notation\n    /// string of your own for the identifier.\n    var identifier: String { get }\n    \n    /// Process an input `ImageProcessItem` item to an image for this processor.\n    ///\n    /// - parameter item:    Input item which will be processed by `self`\n    /// - parameter options: Options when processing the item.\n    ///\n    /// - returns: The processed image.\n    ///\n    /// - Note: The return value will be `nil` if processing failed while converting data to image.\n    ///         If input item is already an image and there is any errors in processing, the input \n    ///         image itself will be returned.\n    /// - Note: Most processor only supports CG-based images. \n    ///         watchOS is not supported for processers containing filter, the input image will be returned directly on watchOS.\n    func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image?\n}\n\ntypealias ProcessorImp = ((ImageProcessItem, KingfisherOptionsInfo) -> Image?)\n\npublic extension ImageProcessor {\n    \n    /// Append an `ImageProcessor` to another. The identifier of the new `ImageProcessor` \n    /// will be \"\\(self.identifier)|>\\(another.identifier)\".\n    ///\n    /// - parameter another: An `ImageProcessor` you want to append to `self`.\n    ///\n    /// - returns: The new `ImageProcessor` will process the image in the order\n    ///            of the two processors concatenated.\n    public func append(another: ImageProcessor) -> ImageProcessor {\n        let newIdentifier = identifier.appending(\"|>\\(another.identifier)\")\n        return GeneralProcessor(identifier: newIdentifier) {\n            item, options in\n            if let image = self.process(item: item, options: options) {\n                return another.process(item: .image(image), options: options)\n            } else {\n                return nil\n            }\n        }\n    }\n}\n\nfunc ==(left: ImageProcessor, right: ImageProcessor) -> Bool {\n    return left.identifier == right.identifier\n}\n\nfunc !=(left: ImageProcessor, right: ImageProcessor) -> Bool {\n    return !(left == right)\n}\n\nfileprivate struct GeneralProcessor: ImageProcessor {\n    let identifier: String\n    let p: ProcessorImp\n    func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {\n        return p(item, options)\n    }\n}\n\n/// The default processor. It convert the input data to a valid image.\n/// Images of .PNG, .JPEG and .GIF format are supported.\n/// If an image is given, `DefaultImageProcessor` will do nothing on it and just return that image.\npublic struct DefaultImageProcessor: ImageProcessor {\n    \n    /// A default `DefaultImageProcessor` could be used across.\n    public static let `default` = DefaultImageProcessor()\n    \n    /// Identifier of the processor.\n    /// - Note: See documentation of `ImageProcessor` protocol for more.\n    public let identifier = \"\"\n    \n    /// Initialize a `DefaultImageProcessor`\n    public init() {}\n    \n    /// Process an input `ImageProcessItem` item to an image for this processor.\n    ///\n    /// - parameter item:    Input item which will be processed by `self`\n    /// - parameter options: Options when processing the item.\n    ///\n    /// - returns: The processed image.\n    /// \n    /// - Note: See documentation of `ImageProcessor` protocol for more.\n    public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {\n        switch item {\n        case .image(let image):\n            return image\n        case .data(let data):\n            return Kingfisher<Image>.image(\n                data: data,\n                scale: options.scaleFactor,\n                preloadAllAnimationData: options.preloadAllAnimationData,\n                onlyFirstFrame: options.onlyLoadFirstFrame)\n        }\n    }\n}\n\npublic struct RectCorner: OptionSet {\n    public let rawValue: Int\n    public static let topLeft = RectCorner(rawValue: 1 << 0)\n    public static let topRight = RectCorner(rawValue: 1 << 1)\n    public static let bottomLeft = RectCorner(rawValue: 1 << 2)\n    public static let bottomRight = RectCorner(rawValue: 1 << 3)\n    public static let all: RectCorner = [.topLeft, .topRight, .bottomLeft, .bottomRight]\n    \n    public init(rawValue: Int) {\n        self.rawValue = rawValue\n    }\n    \n    var cornerIdentifier: String {\n        if self == .all {\n            return \"\"\n        }\n        return \"_corner(\\(rawValue))\"\n    }\n}\n\n/// Processor for making round corner images. Only CG-based images are supported in macOS, \n/// if a non-CG image passed in, the processor will do nothing.\npublic struct RoundCornerImageProcessor: ImageProcessor {\n    \n    /// Identifier of the processor.\n    /// - Note: See documentation of `ImageProcessor` protocol for more.\n    public let identifier: String\n\n    /// Corner radius will be applied in processing.\n    public let cornerRadius: CGFloat\n    \n    /// The target corners which will be applied rounding.\n    public let roundingCorners: RectCorner\n    \n    /// Target size of output image should be. If `nil`, the image will keep its original size after processing.\n    public let targetSize: CGSize?\n\n    /// Background color of the output image. If `nil`, it will stay transparent.\n    public let backgroundColor: Color?\n\n    /// Initialize a `RoundCornerImageProcessor`\n    ///\n    /// - parameter cornerRadius:    Corner radius will be applied in processing.\n    /// - parameter targetSize:      Target size of output image should be. If `nil`, \n    ///                              the image will keep its original size after processing.\n    ///                              Default is `nil`.\n    /// - parameter corners:         The target corners which will be applied rounding. Default is `.all`.\n    /// - parameter backgroundColor: Backgroud color to apply for the output image. Default is `nil`.\n    public init(cornerRadius: CGFloat, targetSize: CGSize? = nil, roundingCorners corners: RectCorner = .all, backgroundColor: Color? = nil) {\n        self.cornerRadius = cornerRadius\n        self.targetSize = targetSize\n        self.roundingCorners = corners\n        self.backgroundColor = backgroundColor\n\n        self.identifier = {\n            var identifier = \"\"\n\n            if let size = targetSize {\n                identifier = \"com.onevcat.Kingfisher.RoundCornerImageProcessor(\\(cornerRadius)_\\(size)\\(corners.cornerIdentifier))\"\n            } else {\n                identifier = \"com.onevcat.Kingfisher.RoundCornerImageProcessor(\\(cornerRadius)\\(corners.cornerIdentifier))\"\n            }\n            if let backgroundColor = backgroundColor {\n                identifier += \"_\\(backgroundColor)\"\n            }\n\n            return identifier\n        }()\n    }\n    \n    /// Process an input `ImageProcessItem` item to an image for this processor.\n    ///\n    /// - parameter item:    Input item which will be processed by `self`\n    /// - parameter options: Options when processing the item.\n    ///\n    /// - returns: The processed image.\n    ///\n    /// - Note: See documentation of `ImageProcessor` protocol for more.\n    public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {\n        switch item {\n        case .image(let image):\n            let size = targetSize ?? image.kf.size\n            return image.kf.image(withRoundRadius: cornerRadius, fit: size, roundingCorners: roundingCorners, backgroundColor: backgroundColor)\n        case .data(_):\n            return (DefaultImageProcessor.default >> self).process(item: item, options: options)\n        }\n    }\n}\n\n\n/// Specify how a size adjusts itself to fit a target size.\n///\n/// - none: Not scale the content.\n/// - aspectFit: Scale the content to fit the size of the view by maintaining the aspect ratio.\n/// - aspectFill: Scale the content to fill the size of the view\npublic enum ContentMode {\n    case none\n    case aspectFit\n    case aspectFill\n}\n\n/// Processor for resizing images. Only CG-based images are supported in macOS.\npublic struct ResizingImageProcessor: ImageProcessor {\n    \n    /// Identifier of the processor.\n    /// - Note: See documentation of `ImageProcessor` protocol for more.\n    public let identifier: String\n    \n    /// The reference size for resizing operation.\n    public let referenceSize: CGSize\n    \n    /// Target content mode of output image should be.\n    /// Default to ContentMode.none\n    public let targetContentMode: ContentMode\n    \n    /// Initialize a `ResizingImageProcessor`.\n    ///\n    /// - Parameters:\n    ///   - referenceSize: The reference size for resizing operation.\n    ///   - mode: Target content mode of output image should be.\n    ///\n    /// - Note:\n    ///   The instance of `ResizingImageProcessor` will follow its `mode` property\n    ///   and try to resizing the input images to fit or fill the `referenceSize`.\n    ///   That means if you are using a `mode` besides of `.none`, you may get an\n    ///   image with its size not be the same as the `referenceSize`.\n    ///\n    ///   **Example**: With input image size: {100, 200}, \n    ///   `referenceSize`: {100, 100}, `mode`: `.aspectFit`,\n    ///   you will get an output image with size of {50, 100}, which \"fit\"s\n    ///   the `referenceSize`.\n    ///\n    ///   If you need an output image exactly to be a specified size, append or use\n    ///   a `CroppingImageProcessor`.\n    public init(referenceSize: CGSize, mode: ContentMode = .none) {\n        self.referenceSize = referenceSize\n        self.targetContentMode = mode\n        \n        if mode == .none {\n            self.identifier = \"com.onevcat.Kingfisher.ResizingImageProcessor(\\(referenceSize))\"\n        } else {\n            self.identifier = \"com.onevcat.Kingfisher.ResizingImageProcessor(\\(referenceSize), \\(mode))\"\n        }\n    }\n    \n    /// Process an input `ImageProcessItem` item to an image for this processor.\n    ///\n    /// - parameter item:    Input item which will be processed by `self`\n    /// - parameter options: Options when processing the item.\n    ///\n    /// - returns: The processed image.\n    ///\n    /// - Note: See documentation of `ImageProcessor` protocol for more.\n    public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {\n        switch item {\n        case .image(let image):\n            return image.kf.resize(to: referenceSize, for: targetContentMode)\n        case .data(_):\n            return (DefaultImageProcessor.default >> self).process(item: item, options: options)\n        }\n    }\n}\n\n/// Processor for adding blur effect to images. `Accelerate.framework` is used underhood for \n/// a better performance. A simulated Gaussian blur with specified blur radius will be applied.\npublic struct BlurImageProcessor: ImageProcessor {\n    \n    /// Identifier of the processor.\n    /// - Note: See documentation of `ImageProcessor` protocol for more.\n    public let identifier: String\n    \n    /// Blur radius for the simulated Gaussian blur.\n    public let blurRadius: CGFloat\n\n    /// Initialize a `BlurImageProcessor`\n    ///\n    /// - parameter blurRadius: Blur radius for the simulated Gaussian blur.\n    public init(blurRadius: CGFloat) {\n        self.blurRadius = blurRadius\n        self.identifier = \"com.onevcat.Kingfisher.BlurImageProcessor(\\(blurRadius))\"\n    }\n    \n    /// Process an input `ImageProcessItem` item to an image for this processor.\n    ///\n    /// - parameter item:    Input item which will be processed by `self`\n    /// - parameter options: Options when processing the item.\n    ///\n    /// - returns: The processed image.\n    ///\n    /// - Note: See documentation of `ImageProcessor` protocol for more.\n    public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {\n        switch item {\n        case .image(let image):\n            let radius = blurRadius * options.scaleFactor\n            return image.kf.blurred(withRadius: radius)\n        case .data(_):\n            return (DefaultImageProcessor.default >> self).process(item: item, options: options)\n        }\n    }\n}\n\n/// Processor for adding an overlay to images. Only CG-based images are supported in macOS.\npublic struct OverlayImageProcessor: ImageProcessor {\n    \n    /// Identifier of the processor.\n    /// - Note: See documentation of `ImageProcessor` protocol for more.\n    public let identifier: String\n    \n    /// Overlay color will be used to overlay the input image.\n    public let overlay: Color\n    \n    /// Fraction will be used when overlay the color to image.\n    public let fraction: CGFloat\n    \n    /// Initialize an `OverlayImageProcessor`\n    ///\n    /// - parameter overlay:  Overlay color will be used to overlay the input image.\n    /// - parameter fraction: Fraction will be used when overlay the color to image. \n    ///                       From 0.0 to 1.0. 0.0 means solid color, 1.0 means transparent overlay.\n    public init(overlay: Color, fraction: CGFloat = 0.5) {\n        self.overlay = overlay\n        self.fraction = fraction\n        self.identifier = \"com.onevcat.Kingfisher.OverlayImageProcessor(\\(overlay.hex)_\\(fraction))\"\n    }\n    \n    /// Process an input `ImageProcessItem` item to an image for this processor.\n    ///\n    /// - parameter item:    Input item which will be processed by `self`\n    /// - parameter options: Options when processing the item.\n    ///\n    /// - returns: The processed image.\n    ///\n    /// - Note: See documentation of `ImageProcessor` protocol for more.\n    public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {\n        switch item {\n        case .image(let image):\n            return image.kf.overlaying(with: overlay, fraction: fraction)\n        case .data(_):\n            return (DefaultImageProcessor.default >> self).process(item: item, options: options)\n        }\n    }\n}\n\n/// Processor for tint images with color. Only CG-based images are supported.\npublic struct TintImageProcessor: ImageProcessor {\n    \n    /// Identifier of the processor.\n    /// - Note: See documentation of `ImageProcessor` protocol for more.\n    public let identifier: String\n    \n    /// Tint color will be used to tint the input image.\n    public let tint: Color\n    \n    /// Initialize a `TintImageProcessor`\n    ///\n    /// - parameter tint: Tint color will be used to tint the input image.\n    public init(tint: Color) {\n        self.tint = tint\n        self.identifier = \"com.onevcat.Kingfisher.TintImageProcessor(\\(tint.hex))\"\n    }\n    \n    /// Process an input `ImageProcessItem` item to an image for this processor.\n    ///\n    /// - parameter item:    Input item which will be processed by `self`\n    /// - parameter options: Options when processing the item.\n    ///\n    /// - returns: The processed image.\n    ///\n    /// - Note: See documentation of `ImageProcessor` protocol for more.\n    public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {\n        switch item {\n        case .image(let image):\n            return image.kf.tinted(with: tint)\n        case .data(_):\n            return (DefaultImageProcessor.default >> self).process(item: item, options: options)\n        }\n    }\n}\n\n/// Processor for applying some color control to images. Only CG-based images are supported.\n/// watchOS is not supported.\npublic struct ColorControlsProcessor: ImageProcessor {\n    \n    /// Identifier of the processor.\n    /// - Note: See documentation of `ImageProcessor` protocol for more.\n    public let identifier: String\n    \n    /// Brightness changing to image.\n    public let brightness: CGFloat\n    \n    /// Contrast changing to image.\n    public let contrast: CGFloat\n    \n    /// Saturation changing to image.\n    public let saturation: CGFloat\n    \n    /// InputEV changing to image.\n    public let inputEV: CGFloat\n    \n    /// Initialize a `ColorControlsProcessor`\n    ///\n    /// - parameter brightness: Brightness changing to image.\n    /// - parameter contrast:   Contrast changing to image.\n    /// - parameter saturation: Saturation changing to image.\n    /// - parameter inputEV:    InputEV changing to image.\n    public init(brightness: CGFloat, contrast: CGFloat, saturation: CGFloat, inputEV: CGFloat) {\n        self.brightness = brightness\n        self.contrast = contrast\n        self.saturation = saturation\n        self.inputEV = inputEV\n        self.identifier = \"com.onevcat.Kingfisher.ColorControlsProcessor(\\(brightness)_\\(contrast)_\\(saturation)_\\(inputEV))\"\n    }\n    \n    /// Process an input `ImageProcessItem` item to an image for this processor.\n    ///\n    /// - parameter item:    Input item which will be processed by `self`\n    /// - parameter options: Options when processing the item.\n    ///\n    /// - returns: The processed image.\n    ///\n    /// - Note: See documentation of `ImageProcessor` protocol for more.\n    public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {\n        switch item {\n        case .image(let image):\n            return image.kf.adjusted(brightness: brightness, contrast: contrast, saturation: saturation, inputEV: inputEV)\n        case .data(_):\n            return (DefaultImageProcessor.default >> self).process(item: item, options: options)\n        }\n    }\n}\n\n/// Processor for applying black and white effect to images. Only CG-based images are supported.\n/// watchOS is not supported.\npublic struct BlackWhiteProcessor: ImageProcessor {\n    \n    /// Identifier of the processor.\n    /// - Note: See documentation of `ImageProcessor` protocol for more.\n    public let identifier = \"com.onevcat.Kingfisher.BlackWhiteProcessor\"\n    \n    /// Initialize a `BlackWhiteProcessor`\n    public init() {}\n    \n    /// Process an input `ImageProcessItem` item to an image for this processor.\n    ///\n    /// - parameter item:    Input item which will be processed by `self`\n    /// - parameter options: Options when processing the item.\n    ///\n    /// - returns: The processed image.\n    ///\n    /// - Note: See documentation of `ImageProcessor` protocol for more.\n    public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {\n        return ColorControlsProcessor(brightness: 0.0, contrast: 1.0, saturation: 0.0, inputEV: 0.7)\n            .process(item: item, options: options)\n    }\n}\n\n/// Processor for cropping an image. Only CG-based images are supported.\n/// watchOS is not supported.\npublic struct CroppingImageProcessor: ImageProcessor {\n    \n    /// Identifier of the processor.\n    /// - Note: See documentation of `ImageProcessor` protocol for more.\n    public let identifier: String\n    \n    /// Target size of output image should be.\n    public let size: CGSize\n    \n    /// Anchor point from which the output size should be calculate.\n    /// The anchor point is consisted by two values between 0.0 and 1.0.\n    /// It indicates a related point in current image. \n    /// See `CroppingImageProcessor.init(size:anchor:)` for more.\n    public let anchor: CGPoint\n    \n    /// Initialize a `CroppingImageProcessor`\n    ///\n    /// - Parameters:\n    ///   - size: Target size of output image should be.\n    ///   - anchor: The anchor point from which the size should be calculated.\n    ///             Default is `CGPoint(x: 0.5, y: 0.5)`, which means the center of input image.\n    /// - Note:\n    ///   The anchor point is consisted by two values between 0.0 and 1.0.\n    ///   It indicates a related point in current image, eg: (0.0, 0.0) for top-left\n    ///   corner, (0.5, 0.5) for center and (1.0, 1.0) for bottom-right corner.\n    ///   The `size` property of `CroppingImageProcessor` will be used along with\n    ///   `anchor` to calculate a target rectange in the size of image.\n    ///    \n    ///   The target size will be automatically calculated with a reasonable behavior.\n    ///   For example, when you have an image size of `CGSize(width: 100, height: 100)`,\n    ///   and a target size of `CGSize(width: 20, height: 20)`: \n    ///   - with a (0.0, 0.0) anchor (top-left), the crop rect will be `{0, 0, 20, 20}`; \n    ///   - with a (0.5, 0.5) anchor (center), it will be `{40, 40, 20, 20}`\n    ///   - while with a (1.0, 1.0) anchor (bottom-right), it will be `{80, 80, 20, 20}`\n    public init(size: CGSize, anchor: CGPoint = CGPoint(x: 0.5, y: 0.5)) {\n        self.size = size\n        self.anchor = anchor\n        self.identifier = \"com.onevcat.Kingfisher.CroppingImageProcessor(\\(size)_\\(anchor))\"\n    }\n    \n    /// Process an input `ImageProcessItem` item to an image for this processor.\n    ///\n    /// - parameter item:    Input item which will be processed by `self`\n    /// - parameter options: Options when processing the item.\n    ///\n    /// - returns: The processed image.\n    ///\n    /// - Note: See documentation of `ImageProcessor` protocol for more.\n    public func process(item: ImageProcessItem, options: KingfisherOptionsInfo) -> Image? {\n        switch item {\n        case .image(let image):\n            return image.kf.crop(to: size, anchorOn: anchor)\n        case .data(_): return (DefaultImageProcessor.default >> self).process(item: item, options: options)\n        }\n    }\n}\n\n/// Concatenate two `ImageProcessor`s. `ImageProcessor.appen(another:)` is used internally.\n///\n/// - parameter left:  First processor.\n/// - parameter right: Second processor.\n///\n/// - returns: The concatenated processor.\npublic func >>(left: ImageProcessor, right: ImageProcessor) -> ImageProcessor {\n    return left.append(another: right)\n}\n\nfileprivate extension Color {\n    var hex: String {\n        var r: CGFloat = 0\n        var g: CGFloat = 0\n        var b: CGFloat = 0\n        var a: CGFloat = 0\n        \n        getRed(&r, green: &g, blue: &b, alpha: &a)\n        \n        let rInt = Int(r * 255) << 24\n        let gInt = Int(g * 255) << 16\n        let bInt = Int(b * 255) << 8\n        let aInt = Int(a * 255)\n        \n        let rgba = rInt | gInt | bInt | aInt\n        \n        return String(format:\"#%08x\", rgba)\n    }\n}\n"
  },
  {
    "path": "Pods/Kingfisher/Sources/ImageTransition.swift",
    "content": "//\n//  ImageTransition.swift\n//  Kingfisher\n//\n//  Created by Wei Wang on 15/9/18.\n//\n//  Copyright (c) 2017 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(macOS)\n// Not implemented for macOS and watchOS yet.\n    \nimport AppKit\n\n/// Image transition is not supported on macOS.\npublic enum ImageTransition {\n    case none\n    var duration: TimeInterval {\n        return 0\n    }\n}\n\n#elseif os(watchOS)\nimport UIKit\n/// Image transition is not supported on watchOS.\npublic enum ImageTransition {\n    case none\n    var duration: TimeInterval {\n        return 0\n    }\n}\n#else\nimport UIKit\n\n/**\nTransition effect which will be used when an image downloaded and set by `UIImageView` extension API in Kingfisher.\nYou can assign an enum value with transition duration as an item in `KingfisherOptionsInfo` \nto enable the animation transition.\n\nApple's UIViewAnimationOptions is used under the hood.\nFor custom transition, you should specified your own transition options, animations and \ncomletion handler as well.\n*/\npublic enum ImageTransition {\n    ///  No animation transistion.\n    case none\n    \n    /// Fade in the loaded image.\n    case fade(TimeInterval)\n\n    /// Flip from left transition.\n    case flipFromLeft(TimeInterval)\n\n    /// Flip from right transition.\n    case flipFromRight(TimeInterval)\n    \n    /// Flip from top transition.\n    case flipFromTop(TimeInterval)\n    \n    /// Flip from bottom transition.\n    case flipFromBottom(TimeInterval)\n    \n    /// Custom transition.\n    case custom(duration: TimeInterval,\n                 options: UIViewAnimationOptions,\n              animations: ((UIImageView, UIImage) -> Void)?,\n              completion: ((Bool) -> Void)?)\n    \n    var duration: TimeInterval {\n        switch self {\n        case .none:                          return 0\n        case .fade(let duration):            return duration\n            \n        case .flipFromLeft(let duration):    return duration\n        case .flipFromRight(let duration):   return duration\n        case .flipFromTop(let duration):     return duration\n        case .flipFromBottom(let duration):  return duration\n            \n        case .custom(let duration, _, _, _): return duration\n        }\n    }\n    \n    var animationOptions: UIViewAnimationOptions {\n        switch self {\n        case .none:                         return []\n        case .fade(_):                      return .transitionCrossDissolve\n            \n        case .flipFromLeft(_):              return .transitionFlipFromLeft\n        case .flipFromRight(_):             return .transitionFlipFromRight\n        case .flipFromTop(_):               return .transitionFlipFromTop\n        case .flipFromBottom(_):            return .transitionFlipFromBottom\n            \n        case .custom(_, let options, _, _): return options\n        }\n    }\n    \n    var animations: ((UIImageView, UIImage) -> Void)? {\n        switch self {\n        case .custom(_, _, let animations, _): return animations\n        default: return { $0.image = $1 }\n        }\n    }\n    \n    var completion: ((Bool) -> Void)? {\n        switch self {\n        case .custom(_, _, _, let completion): return completion\n        default: return nil\n        }\n    }\n}\n#endif\n"
  },
  {
    "path": "Pods/Kingfisher/Sources/ImageView+Kingfisher.swift",
    "content": "//\n//  ImageView+Kingfisher.swift\n//  Kingfisher\n//\n//  Created by Wei Wang on 15/4/6.\n//\n//  Copyright (c) 2017 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\n// MARK: - Extension methods.\n/**\n *    Set image to use from web.\n */\nextension Kingfisher where Base: ImageView {\n    /**\n     Set an image with a resource, a placeholder image, options, progress handler and completion handler.\n     \n     - parameter resource:          Resource object contains information such as `cacheKey` and `downloadURL`.\n     - parameter placeholder:       A placeholder image when retrieving the image at URL.\n     - parameter options:           A dictionary could control some behaviors. See `KingfisherOptionsInfo` for more.\n     - parameter progressBlock:     Called when the image downloading progress gets updated.\n     - parameter completionHandler: Called when the image retrieved and set.\n     \n     - returns: A task represents the retrieving process.\n     \n     - note: Both the `progressBlock` and `completionHandler` will be invoked in main thread.\n     The `CallbackDispatchQueue` specified in `optionsInfo` will not be used in callbacks of this method.\n     \n     If `resource` is `nil`, the `placeholder` image will be set and\n     `completionHandler` will be called with both `error` and `image` being `nil`.\n     */\n    @discardableResult\n    public func setImage(with resource: Resource?,\n                         placeholder: Placeholder? = nil,\n                         options: KingfisherOptionsInfo? = nil,\n                         progressBlock: DownloadProgressBlock? = nil,\n                         completionHandler: CompletionHandler? = nil) -> RetrieveImageTask\n    {\n        guard let resource = resource else {\n            self.placeholder = placeholder\n            setWebURL(nil)\n            completionHandler?(nil, nil, .none, nil)\n            return .empty\n        }\n        \n        var options = KingfisherManager.shared.defaultOptions + (options ?? KingfisherEmptyOptionsInfo)\n        let noImageOrPlaceholderSet = base.image == nil && self.placeholder == nil\n        \n        if !options.keepCurrentImageWhileLoading || noImageOrPlaceholderSet { // Always set placeholder while there is no image/placehoer yet.\n            self.placeholder = placeholder\n        }\n\n        let maybeIndicator = indicator\n        maybeIndicator?.startAnimatingView()\n        \n        setWebURL(resource.downloadURL)\n\n        if base.shouldPreloadAllAnimation() {\n            options.append(.preloadAllAnimationData)\n        }\n        \n        let task = KingfisherManager.shared.retrieveImage(\n            with: resource,\n            options: options,\n            progressBlock: { receivedSize, totalSize in\n                guard resource.downloadURL == self.webURL else {\n                    return\n                }\n                if let progressBlock = progressBlock {\n                    progressBlock(receivedSize, totalSize)\n                }\n            },\n            completionHandler: {[weak base] image, error, cacheType, imageURL in\n                DispatchQueue.main.safeAsync {\n                    maybeIndicator?.stopAnimatingView()\n                    guard let strongBase = base, imageURL == self.webURL else {\n                        completionHandler?(image, error, cacheType, imageURL)\n                        return\n                    }\n                    \n                    self.setImageTask(nil)\n                    guard let image = image else {\n                        completionHandler?(nil, error, cacheType, imageURL)\n                        return\n                    }\n                    \n                    guard let transitionItem = options.lastMatchIgnoringAssociatedValue(.transition(.none)),\n                        case .transition(let transition) = transitionItem, ( options.forceTransition || cacheType == .none) else\n                    {\n                        self.placeholder = nil\n                        strongBase.image = image\n                        completionHandler?(image, error, cacheType, imageURL)\n                        return\n                    }\n                    \n                    #if !os(macOS)\n                        UIView.transition(with: strongBase, duration: 0.0, options: [],\n                                          animations: { maybeIndicator?.stopAnimatingView() },\n                                          completion: { _ in\n\n                                            self.placeholder = nil\n                                            UIView.transition(with: strongBase, duration: transition.duration,\n                                                              options: [transition.animationOptions, .allowUserInteraction],\n                                                              animations: {\n                                                                // Set image property in the animation.\n                                                                transition.animations?(strongBase, image)\n                                                              },\n                                                              completion: { finished in\n                                                                transition.completion?(finished)\n                                                                completionHandler?(image, error, cacheType, imageURL)\n                                                              })\n                                          })\n                    #endif\n                }\n            })\n        \n        setImageTask(task)\n        \n        return task\n    }\n    \n    /**\n     Cancel the image download task bounded to the image view if it is running.\n     Nothing will happen if the downloading has already finished.\n     */\n    public func cancelDownloadTask() {\n        imageTask?.cancel()\n    }\n}\n\n// MARK: - Associated Object\nprivate var lastURLKey: Void?\nprivate var indicatorKey: Void?\nprivate var indicatorTypeKey: Void?\nprivate var placeholderKey: Void?\nprivate var imageTaskKey: Void?\n\nextension Kingfisher where Base: ImageView {\n    /// Get the image URL binded to this image view.\n    public var webURL: URL? {\n        return objc_getAssociatedObject(base, &lastURLKey) as? URL\n    }\n    \n    fileprivate func setWebURL(_ url: URL?) {\n        objc_setAssociatedObject(base, &lastURLKey, url, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n    }\n    \n    /// Holds which indicator type is going to be used.\n    /// Default is .none, means no indicator will be shown.\n    public var indicatorType: IndicatorType {\n        get {\n            let indicator = (objc_getAssociatedObject(base, &indicatorTypeKey) as? Box<IndicatorType?>)?.value\n            return indicator ?? .none\n        }\n        \n        set {\n            switch newValue {\n            case .none:\n                indicator = nil\n            case .activity:\n                indicator = ActivityIndicator()\n            case .image(let data):\n                indicator = ImageIndicator(imageData: data)\n            case .custom(let anIndicator):\n                indicator = anIndicator\n            }\n            \n            objc_setAssociatedObject(base, &indicatorTypeKey, Box(value: newValue), .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n        }\n    }\n    \n    /// Holds any type that conforms to the protocol `Indicator`.\n    /// The protocol `Indicator` has a `view` property that will be shown when loading an image.\n    /// It will be `nil` if `indicatorType` is `.none`.\n    public fileprivate(set) var indicator: Indicator? {\n        get {\n            return (objc_getAssociatedObject(base, &indicatorKey) as? Box<Indicator?>)?.value\n        }\n        \n        set {\n            // Remove previous\n            if let previousIndicator = indicator {\n                previousIndicator.view.removeFromSuperview()\n            }\n            \n            // Add new\n            if var newIndicator = newValue {\n                // Set default indicator frame if the view's frame not set.\n                if newIndicator.view.frame == .zero {\n                    newIndicator.view.frame = base.frame\n                }\n                newIndicator.viewCenter = CGPoint(x: base.bounds.midX, y: base.bounds.midY)\n                newIndicator.view.isHidden = true\n                base.addSubview(newIndicator.view)\n            }\n            \n            // Save in associated object\n            objc_setAssociatedObject(base, &indicatorKey, Box(value: newValue), .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n        }\n    }\n    \n    fileprivate var imageTask: RetrieveImageTask? {\n        return objc_getAssociatedObject(base, &imageTaskKey) as? RetrieveImageTask\n    }\n    \n    fileprivate func setImageTask(_ task: RetrieveImageTask?) {\n        objc_setAssociatedObject(base, &imageTaskKey, task, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n    }\n    \n    public fileprivate(set) var placeholder: Placeholder? {\n        get {\n            return (objc_getAssociatedObject(base, &placeholderKey) as? Box<Placeholder?>)?.value\n        }\n        \n        set {\n            if let previousPlaceholder = placeholder {\n                previousPlaceholder.remove(from: base)\n            }\n            \n            if let newPlaceholder = newValue {\n                newPlaceholder.add(to: base)\n            } else {\n                base.image = nil\n            }\n            \n            objc_setAssociatedObject(base, &placeholderKey, Box(value: newValue), .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n        }\n    }\n}\n\n\n@objc extension ImageView {\n    func shouldPreloadAllAnimation() -> Bool { return true }\n}\n"
  },
  {
    "path": "Pods/Kingfisher/Sources/Indicator.swift",
    "content": "//\n//  Indicator.swift\n//  Kingfisher\n//\n//  Created by João D. Moreira on 30/08/16.\n//\n//  Copyright (c) 2017 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(macOS)\n    import AppKit\n#else\n    import UIKit\n#endif\n\n#if os(macOS)\n    public typealias IndicatorView = NSView\n#else\n    public typealias IndicatorView = UIView\n#endif\n\npublic enum IndicatorType {\n    /// No indicator.\n    case none\n    /// Use system activity indicator.\n    case activity\n    /// Use an image as indicator. GIF is supported.\n    case image(imageData: Data)\n    /// Use a custom indicator, which conforms to the `Indicator` protocol.\n    case custom(indicator: Indicator)\n}\n\n// MARK: - Indicator Protocol\npublic protocol Indicator {\n    func startAnimatingView()\n    func stopAnimatingView()\n\n    var viewCenter: CGPoint { get set }\n    var view: IndicatorView { get }\n}\n\nextension Indicator {\n    #if os(macOS)\n    public var viewCenter: CGPoint {\n        get {\n            let frame = view.frame\n            return CGPoint(x: frame.origin.x + frame.size.width / 2.0, y: frame.origin.y + frame.size.height / 2.0 )\n        }\n        set {\n            let frame = view.frame\n            let newFrame = CGRect(x: newValue.x - frame.size.width / 2.0,\n                                  y: newValue.y - frame.size.height / 2.0,\n                                  width: frame.size.width,\n                                  height: frame.size.height)\n            view.frame = newFrame\n        }\n    }\n    #else\n    public var viewCenter: CGPoint {\n        get {\n            return view.center\n        }\n        set {\n            view.center = newValue\n        }\n    }\n    #endif\n}\n\n// MARK: - ActivityIndicator\n// Displays a NSProgressIndicator / UIActivityIndicatorView\nclass ActivityIndicator: Indicator {\n\n    #if os(macOS)\n    private let activityIndicatorView: NSProgressIndicator\n    #else\n    private let activityIndicatorView: UIActivityIndicatorView\n    #endif\n    private var animatingCount = 0\n\n    var view: IndicatorView {\n        return activityIndicatorView\n    }\n\n    func startAnimatingView() {\n        animatingCount += 1\n        // Alrady animating\n        if animatingCount == 1 {\n            #if os(macOS)\n                activityIndicatorView.startAnimation(nil)\n            #else\n                activityIndicatorView.startAnimating()\n            #endif\n            activityIndicatorView.isHidden = false\n        }\n    }\n\n    func stopAnimatingView() {\n        animatingCount = max(animatingCount - 1, 0)\n        if animatingCount == 0 {\n            #if os(macOS)\n                activityIndicatorView.stopAnimation(nil)\n            #else\n                activityIndicatorView.stopAnimating()\n            #endif\n            activityIndicatorView.isHidden = true\n        }\n    }\n\n    init() {\n        #if os(macOS)\n            activityIndicatorView = NSProgressIndicator(frame: CGRect(x: 0, y: 0, width: 16, height: 16))\n            activityIndicatorView.controlSize = .small\n            activityIndicatorView.style = .spinning\n        #else\n            #if os(tvOS)\n                let indicatorStyle = UIActivityIndicatorViewStyle.white\n            #else\n                let indicatorStyle = UIActivityIndicatorViewStyle.gray\n            #endif\n            activityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle:indicatorStyle)\n            activityIndicatorView.autoresizingMask = [.flexibleLeftMargin, .flexibleRightMargin, .flexibleBottomMargin, .flexibleTopMargin]\n        #endif\n    }\n}\n\n// MARK: - ImageIndicator\n// Displays an ImageView. Supports gif\nclass ImageIndicator: Indicator {\n    private let animatedImageIndicatorView: ImageView\n\n    var view: IndicatorView {\n        return animatedImageIndicatorView\n    }\n\n    init?(imageData data: Data, processor: ImageProcessor = DefaultImageProcessor.default, options: KingfisherOptionsInfo = KingfisherEmptyOptionsInfo) {\n\n        var options = options\n        // Use normal image view to show animations, so we need to preload all animation data.\n        if !options.preloadAllAnimationData {\n            options.append(.preloadAllAnimationData)\n        }\n        \n        guard let image = processor.process(item: .data(data), options: options) else {\n            return nil\n        }\n\n        animatedImageIndicatorView = ImageView()\n        animatedImageIndicatorView.image = image\n        animatedImageIndicatorView.frame = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)\n        \n        #if os(macOS)\n            // Need for gif to animate on macOS\n            self.animatedImageIndicatorView.imageScaling = .scaleNone\n            self.animatedImageIndicatorView.canDrawSubviewsIntoLayer = true\n        #else\n            animatedImageIndicatorView.contentMode = .center\n            animatedImageIndicatorView.autoresizingMask = [.flexibleLeftMargin,\n                                                           .flexibleRightMargin,\n                                                           .flexibleBottomMargin,\n                                                           .flexibleTopMargin]\n        #endif\n    }\n\n    func startAnimatingView() {\n        #if os(macOS)\n            animatedImageIndicatorView.animates = true\n        #else\n            animatedImageIndicatorView.startAnimating()\n        #endif\n        animatedImageIndicatorView.isHidden = false\n    }\n\n    func stopAnimatingView() {\n        #if os(macOS)\n            animatedImageIndicatorView.animates = false\n        #else\n            animatedImageIndicatorView.stopAnimating()\n        #endif\n        animatedImageIndicatorView.isHidden = true\n    }\n}\n"
  },
  {
    "path": "Pods/Kingfisher/Sources/Kingfisher.h",
    "content": "//\n//  Kingfisher.h\n//  Kingfisher\n//\n//  Created by Wei Wang on 15/4/6.\n//\n//  Copyright (c) 2017 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#import <Foundation/Foundation.h>\n\n//! Project version number for Kingfisher.\nFOUNDATION_EXPORT double KingfisherVersionNumber;\n\n//! Project version string for Kingfisher.\nFOUNDATION_EXPORT const unsigned char KingfisherVersionString[];\n\n// In this header, you should import all the public headers of your framework using statements like #import <Kingfisher/PublicHeader.h>\n\n\n"
  },
  {
    "path": "Pods/Kingfisher/Sources/Kingfisher.swift",
    "content": "//\n//  Kingfisher.swift\n//  Kingfisher\n//\n//  Created by Wei Wang on 16/9/14.\n//\n//  Copyright (c) 2017 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\nimport ImageIO\n\n#if os(macOS)\n    import AppKit\n    public typealias Image = NSImage\n    public typealias View = NSView\n    public typealias Color = NSColor\n    public typealias ImageView = NSImageView\n    public typealias Button = NSButton\n#else\n    import UIKit\n    public typealias Image = UIImage\n    public typealias Color = UIColor\n    #if !os(watchOS)\n    public typealias ImageView = UIImageView\n    public typealias View = UIView\n    public typealias Button = UIButton\n    #endif\n#endif\n\npublic final class Kingfisher<Base> {\n    public let base: Base\n    public init(_ base: Base) {\n        self.base = base\n    }\n}\n\n/**\n A type that has Kingfisher extensions.\n */\npublic protocol KingfisherCompatible {\n    associatedtype CompatibleType\n    var kf: CompatibleType { get }\n}\n\npublic extension KingfisherCompatible {\n    public var kf: Kingfisher<Self> {\n        get { return Kingfisher(self) }\n    }\n}\n\nextension Image: KingfisherCompatible { }\n#if !os(watchOS)\nextension ImageView: KingfisherCompatible { }\nextension Button: KingfisherCompatible { }\n#endif\n"
  },
  {
    "path": "Pods/Kingfisher/Sources/KingfisherManager.swift",
    "content": "//\n//  KingfisherManager.swift\n//  Kingfisher\n//\n//  Created by Wei Wang on 15/4/6.\n//\n//  Copyright (c) 2017 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n\npublic typealias DownloadProgressBlock = ((_ receivedSize: Int64, _ totalSize: Int64) -> ())\npublic typealias CompletionHandler = ((_ image: Image?, _ error: NSError?, _ cacheType: CacheType, _ imageURL: URL?) -> ())\n\n/// RetrieveImageTask represents a task of image retrieving process.\n/// It contains an async task of getting image from disk and from network.\npublic class RetrieveImageTask {\n    \n    public static let empty = RetrieveImageTask()\n    \n    // If task is canceled before the download task started (which means the `downloadTask` is nil),\n    // the download task should not begin.\n    var cancelledBeforeDownloadStarting: Bool = false\n    \n    /// The network retrieve task in this image task.\n    public var downloadTask: RetrieveImageDownloadTask?\n    \n    /**\n    Cancel current task. If this task is already done, do nothing.\n    */\n    public func cancel() {\n        if let downloadTask = downloadTask {\n            downloadTask.cancel()\n        } else {\n            cancelledBeforeDownloadStarting = true\n        }\n    }\n}\n\n/// Error domain of Kingfisher\npublic let KingfisherErrorDomain = \"com.onevcat.Kingfisher.Error\"\n\n/// Main manager class of Kingfisher. It connects Kingfisher downloader and cache.\n/// You can use this class to retrieve an image via a specified URL from web or cache.\npublic class KingfisherManager {\n    \n    /// Shared manager used by the extensions across Kingfisher.\n    public static let shared = KingfisherManager()\n    \n    /// Cache used by this manager\n    public var cache: ImageCache\n    \n    /// Downloader used by this manager\n    public var downloader: ImageDownloader\n    \n    /// Default options used by the manager. This option will be used in \n    /// Kingfisher manager related methods, including all image view and \n    /// button extension methods. You can also passing the options per image by \n    /// sending an `options` parameter to Kingfisher's APIs, the per image option \n    /// will overwrite the default ones if exist.\n    ///\n    /// - Note: This option will not be applied to independent using of `ImageDownloader` or `ImageCache`.\n    public var defaultOptions = KingfisherEmptyOptionsInfo\n    \n    var currentDefaultOptions: KingfisherOptionsInfo {\n        return [.downloader(downloader), .targetCache(cache)] + defaultOptions\n    }\n    \n    convenience init() {\n        self.init(downloader: .default, cache: .default)\n    }\n    \n    init(downloader: ImageDownloader, cache: ImageCache) {\n        self.downloader = downloader\n        self.cache = cache\n    }\n    \n    /**\n    Get an image with resource.\n    If KingfisherOptions.None is used as `options`, Kingfisher will seek the image in memory and disk first.\n    If not found, it will download the image at `resource.downloadURL` and cache it with `resource.cacheKey`.\n    These default behaviors could be adjusted by passing different options. See `KingfisherOptions` for more.\n    \n    - parameter resource:          Resource object contains information such as `cacheKey` and `downloadURL`.\n    - parameter options:           A dictionary could control some behaviors. See `KingfisherOptionsInfo` for more.\n    - parameter progressBlock:     Called every time downloaded data changed. This could be used as a progress UI.\n    - parameter completionHandler: Called when the whole retrieving process finished.\n    \n    - returns: A `RetrieveImageTask` task object. You can use this object to cancel the task.\n    */\n    @discardableResult\n    public func retrieveImage(with resource: Resource,\n        options: KingfisherOptionsInfo?,\n        progressBlock: DownloadProgressBlock?,\n        completionHandler: CompletionHandler?) -> RetrieveImageTask\n    {\n        let task = RetrieveImageTask()\n        let options = currentDefaultOptions + (options ?? KingfisherEmptyOptionsInfo)\n        if options.forceRefresh {\n            _ = downloadAndCacheImage(\n                with: resource.downloadURL,\n                forKey: resource.cacheKey,\n                retrieveImageTask: task,\n                progressBlock: progressBlock,\n                completionHandler: completionHandler,\n                options: options)\n        } else {\n            tryToRetrieveImageFromCache(\n                forKey: resource.cacheKey,\n                with: resource.downloadURL,\n                retrieveImageTask: task,\n                progressBlock: progressBlock,\n                completionHandler: completionHandler,\n                options: options)\n        }\n        \n        return task\n    }\n\n    @discardableResult\n    func downloadAndCacheImage(with url: URL,\n                             forKey key: String,\n                      retrieveImageTask: RetrieveImageTask,\n                          progressBlock: DownloadProgressBlock?,\n                      completionHandler: CompletionHandler?,\n                                options: KingfisherOptionsInfo) -> RetrieveImageDownloadTask?\n    {\n        let downloader = options.downloader\n        return downloader.downloadImage(with: url, retrieveImageTask: retrieveImageTask, options: options,\n            progressBlock: { receivedSize, totalSize in\n                progressBlock?(receivedSize, totalSize)\n            },\n            completionHandler: { image, error, imageURL, originalData in\n\n                let targetCache = options.targetCache\n                if let error = error, error.code == KingfisherError.notModified.rawValue {\n                    // Not modified. Try to find the image from cache.\n                    // (The image should be in cache. It should be guaranteed by the framework users.)\n                    targetCache.retrieveImage(forKey: key, options: options, completionHandler: { (cacheImage, cacheType) -> () in\n                        completionHandler?(cacheImage, nil, cacheType, url)\n                    })\n                    return\n                }\n                \n                if let image = image, let originalData = originalData {\n                    targetCache.store(image,\n                                      original: originalData,\n                                      forKey: key,\n                                      processorIdentifier:options.processor.identifier,\n                                      cacheSerializer: options.cacheSerializer,\n                                      toDisk: !options.cacheMemoryOnly,\n                                      completionHandler: nil)\n                    if options.cacheOriginalImage && options.processor != DefaultImageProcessor.default {\n                        let originalCache = options.originalCache\n                        let defaultProcessor = DefaultImageProcessor.default\n                        if let originalImage = defaultProcessor.process(item: .data(originalData), options: options) {\n                            originalCache.store(originalImage,\n                                              original: originalData,\n                                              forKey: key,\n                                              processorIdentifier: defaultProcessor.identifier,\n                                              cacheSerializer: options.cacheSerializer,\n                                              toDisk: !options.cacheMemoryOnly,\n                                              completionHandler: nil)\n                        }\n                    }\n                }\n\n                completionHandler?(image, error, .none, url)\n\n            })\n    }\n    \n    func tryToRetrieveImageFromCache(forKey key: String,\n                                       with url: URL,\n                              retrieveImageTask: RetrieveImageTask,\n                                  progressBlock: DownloadProgressBlock?,\n                              completionHandler: CompletionHandler?,\n                                        options: KingfisherOptionsInfo)\n    {\n        \n        \n        let diskTaskCompletionHandler: CompletionHandler = { (image, error, cacheType, imageURL) -> () in\n            completionHandler?(image, error, cacheType, imageURL)\n        }\n        \n        func handleNoCache() {\n            if options.onlyFromCache {\n                let error = NSError(domain: KingfisherErrorDomain, code: KingfisherError.notCached.rawValue, userInfo: nil)\n                diskTaskCompletionHandler(nil, error, .none, url)\n                return\n            }\n            self.downloadAndCacheImage(\n                with: url,\n                forKey: key,\n                retrieveImageTask: retrieveImageTask,\n                progressBlock: progressBlock,\n                completionHandler: diskTaskCompletionHandler,\n                options: options)\n            \n        }\n        \n        let targetCache = options.targetCache\n        // First, try to get the exactly image from cache\n        targetCache.retrieveImage(forKey: key, options: options) { image, cacheType in\n            // If found, we could finish now.\n            if image != nil {\n                diskTaskCompletionHandler(image, nil, cacheType, url)\n                return\n            }\n            \n            // If not found, and we are using a default processor, download it!\n            let processor = options.processor\n            guard processor != DefaultImageProcessor.default else {\n                handleNoCache()\n                return\n            }\n            \n            // If processor is not the default one, we have a chance to check whether\n            // the original image is already in cache.\n            let originalCache = options.originalCache\n            let optionsWithoutProcessor = options.removeAllMatchesIgnoringAssociatedValue(.processor(processor))\n            originalCache.retrieveImage(forKey: key, options: optionsWithoutProcessor) { image, cacheType in\n                // If we found the original image, there is no need to download it again.\n                // We could just apply processor to it now.\n                guard let image = image else {\n                    handleNoCache()\n                    return\n                }\n                \n                guard let processedImage = processor.process(item: .image(image), options: options) else {\n                    diskTaskCompletionHandler(nil, nil, .none, url)\n                    return\n                }\n                targetCache.store(processedImage,\n                                  original: nil,\n                                  forKey: key,\n                                  processorIdentifier:options.processor.identifier,\n                                  cacheSerializer: options.cacheSerializer,\n                                  toDisk: !options.cacheMemoryOnly,\n                                  completionHandler: nil)\n                diskTaskCompletionHandler(processedImage, nil, .none, url)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/Kingfisher/Sources/KingfisherOptionsInfo.swift",
    "content": "//\n//  KingfisherOptionsInfo.swift\n//  Kingfisher\n//\n//  Created by Wei Wang on 15/4/23.\n//\n//  Copyright (c) 2017 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(macOS)\nimport AppKit\n#else\nimport UIKit\n#endif\n    \n\n/**\n*\tKingfisherOptionsInfo is a typealias for [KingfisherOptionsInfoItem]. You can use the enum of option item with value to control some behaviors of Kingfisher.\n*/\npublic typealias KingfisherOptionsInfo = [KingfisherOptionsInfoItem]\nlet KingfisherEmptyOptionsInfo = [KingfisherOptionsInfoItem]()\n\n/**\nItems could be added into KingfisherOptionsInfo.\n*/\npublic enum KingfisherOptionsInfoItem {\n    /// The associated value of this member should be an ImageCache object. Kingfisher will use the specified\n    /// cache object when handling related operations, including trying to retrieve the cached images and store\n    /// the downloaded image to it.\n    case targetCache(ImageCache)\n    \n    /// Cache for storing and retrieving original image.\n    /// Preferred prior to targetCache for storing and retrieving original images if specified.\n    /// Only used if a non-default image processor is involved.\n    case originalCache(ImageCache)\n    \n    /// The associated value of this member should be an ImageDownloader object. Kingfisher will use this\n    /// downloader to download the images.\n    case downloader(ImageDownloader)\n    \n    /// Member for animation transition when using UIImageView. Kingfisher will use the `ImageTransition` of\n    /// this enum to animate the image in if it is downloaded from web. The transition will not happen when the\n    /// image is retrieved from either memory or disk cache by default. If you need to do the transition even when\n    /// the image being retrieved from cache, set `ForceTransition` as well.\n    case transition(ImageTransition)\n    \n    /// Associated `Float` value will be set as the priority of image download task. The value for it should be\n    /// between 0.0~1.0. If this option not set, the default value (`NSURLSessionTaskPriorityDefault`) will be used.\n    case downloadPriority(Float)\n    \n    /// If set, `Kingfisher` will ignore the cache and try to fire a download task for the resource.\n    case forceRefresh\n\n    /// If set, `Kingfisher` will try to retrieve the image from memory cache first. If the image is not in memory\n    /// cache, then it will ignore the disk cache but download the image again from network. This is useful when\n    /// you want to display a changeable image behind the same url, while avoiding download it again and again.\n    case fromMemoryCacheOrRefresh\n    \n    /// If set, setting the image to an image view will happen with transition even when retrieved from cache.\n    /// See `Transition` option for more.\n    case forceTransition\n    \n    ///  If set, `Kingfisher` will only cache the value in memory but not in disk.\n    case cacheMemoryOnly\n    \n    /// If set, `Kingfisher` will only try to retrieve the image from cache not from network.\n    case onlyFromCache\n    \n    /// Decode the image in background thread before using.\n    case backgroundDecode\n    \n    /// The associated value of this member will be used as the target queue of dispatch callbacks when\n    /// retrieving images from cache. If not set, `Kingfisher` will use main quese for callbacks.\n    case callbackDispatchQueue(DispatchQueue?)\n    \n    /// The associated value of this member will be used as the scale factor when converting retrieved data to an image.\n    /// It is the image scale, instead of your screen scale. You may need to specify the correct scale when you dealing \n    /// with 2x or 3x retina images.\n    case scaleFactor(CGFloat)\n\n    /// Whether all the animated image data should be preloaded. Default it false, which means following frames will be\n    /// loaded on need. If true, all the animated image data will be loaded and decoded into memory. This option is mainly\n    /// used for back compatibility internally. You should not set it directly. `AnimatedImageView` will not preload\n    /// all data, while a normal image view (`UIImageView` or `NSImageView`) will load all data. Choose to use\n    /// corresponding image view type instead of setting this option.\n    case preloadAllAnimationData\n    \n    /// The `ImageDownloadRequestModifier` contained will be used to change the request before it being sent.\n    /// This is the last chance you can modify the request. You can modify the request for some customizing purpose,\n    /// such as adding auth token to the header, do basic HTTP auth or something like url mapping. The original request\n    /// will be sent without any modification by default.\n    case requestModifier(ImageDownloadRequestModifier)\n    \n    /// Processor for processing when the downloading finishes, a processor will convert the downloaded data to an image\n    /// and/or apply some filter on it. If a cache is connected to the downloader (it happenes when you are using\n    /// KingfisherManager or the image extension methods), the converted image will also be sent to cache as well as the\n    /// image view. `DefaultImageProcessor.default` will be used by default.\n    case processor(ImageProcessor)\n    \n    /// Supply an `CacheSerializer` to convert some data to an image object for\n    /// retrieving from disk cache or vice versa for storing to disk cache.\n    /// `DefaultCacheSerializer.default` will be used by default.\n    case cacheSerializer(CacheSerializer)\n    \n    /// Keep the existing image while setting another image to an image view.\n    /// By setting this option, the placeholder image parameter of imageview extension method\n    /// will be ignored and the current image will be kept while loading or downloading the new image.\n    case keepCurrentImageWhileLoading\n    \n    /// If set, Kingfisher will only load the first frame from a animated image data file as a single image.\n    /// Loading a lot of animated images may take too much memory. It will be useful when you want to display a\n    /// static preview of the first frame from a animated image.\n    /// This option will be ignored if the target image is not animated image data.\n    case onlyLoadFirstFrame\n    \n    /// If set and an `ImageProcessor` is used, Kingfisher will try to cache both \n    /// the final result and original image. Kingfisher will have a chance to use \n    /// the original image when another processor is applied to the same resouce, \n    /// instead of downloading it again.\n    case cacheOriginalImage\n}\n\nprecedencegroup ItemComparisonPrecedence {\n    associativity: none\n    higherThan: LogicalConjunctionPrecedence\n}\n\ninfix operator <== : ItemComparisonPrecedence\n\n// This operator returns true if two `KingfisherOptionsInfoItem` enum is the same, without considering the associated values.\nfunc <== (lhs: KingfisherOptionsInfoItem, rhs: KingfisherOptionsInfoItem) -> Bool {\n    switch (lhs, rhs) {\n    case (.targetCache(_), .targetCache(_)): return true\n    case (.originalCache(_), .originalCache(_)): return true\n    case (.downloader(_), .downloader(_)): return true\n    case (.transition(_), .transition(_)): return true\n    case (.downloadPriority(_), .downloadPriority(_)): return true\n    case (.forceRefresh, .forceRefresh): return true\n    case (.fromMemoryCacheOrRefresh, .fromMemoryCacheOrRefresh): return true\n    case (.forceTransition, .forceTransition): return true\n    case (.cacheMemoryOnly, .cacheMemoryOnly): return true\n    case (.onlyFromCache, .onlyFromCache): return true\n    case (.backgroundDecode, .backgroundDecode): return true\n    case (.callbackDispatchQueue(_), .callbackDispatchQueue(_)): return true\n    case (.scaleFactor(_), .scaleFactor(_)): return true\n    case (.preloadAllAnimationData, .preloadAllAnimationData): return true\n    case (.requestModifier(_), .requestModifier(_)): return true\n    case (.processor(_), .processor(_)): return true\n    case (.cacheSerializer(_), .cacheSerializer(_)): return true\n    case (.keepCurrentImageWhileLoading, .keepCurrentImageWhileLoading): return true\n    case (.onlyLoadFirstFrame, .onlyLoadFirstFrame): return true\n    case (.cacheOriginalImage, .cacheOriginalImage): return true\n    default: return false\n    }\n}\n\n\nextension Collection where Iterator.Element == KingfisherOptionsInfoItem {\n    func lastMatchIgnoringAssociatedValue(_ target: Iterator.Element) -> Iterator.Element? {\n        return reversed().first { $0 <== target }\n    }\n    \n    func removeAllMatchesIgnoringAssociatedValue(_ target: Iterator.Element) -> [Iterator.Element] {\n        return filter { !($0 <== target) }\n    }\n}\n\npublic extension Collection where Iterator.Element == KingfisherOptionsInfoItem {\n    /// The target `ImageCache` which is used.\n    public var targetCache: ImageCache {\n        if let item = lastMatchIgnoringAssociatedValue(.targetCache(.default)),\n            case .targetCache(let cache) = item\n        {\n            return cache\n        }\n        return ImageCache.default\n    }\n    \n    /// The original `ImageCache` which is used.\n    public var originalCache: ImageCache {\n        if let item = lastMatchIgnoringAssociatedValue(.originalCache(.default)),\n            case .originalCache(let cache) = item\n        {\n            return cache\n        }\n        return targetCache\n    }\n    \n    /// The `ImageDownloader` which is specified.\n    public var downloader: ImageDownloader {\n        if let item = lastMatchIgnoringAssociatedValue(.downloader(.default)),\n            case .downloader(let downloader) = item\n        {\n            return downloader\n        }\n        return ImageDownloader.default\n    }\n    \n    /// Member for animation transition when using UIImageView.\n    public var transition: ImageTransition {\n        if let item = lastMatchIgnoringAssociatedValue(.transition(.none)),\n            case .transition(let transition) = item\n        {\n            return transition\n        }\n        return ImageTransition.none\n    }\n    \n    /// A `Float` value set as the priority of image download task. The value for it should be\n    /// between 0.0~1.0.\n    public var downloadPriority: Float {\n        if let item = lastMatchIgnoringAssociatedValue(.downloadPriority(0)),\n            case .downloadPriority(let priority) = item\n        {\n            return priority\n        }\n        return URLSessionTask.defaultPriority\n    }\n    \n    /// Whether an image will be always downloaded again or not.\n    public var forceRefresh: Bool {\n        return contains{ $0 <== .forceRefresh }\n    }\n\n    /// Whether an image should be got only from memory cache or download.\n    public var fromMemoryCacheOrRefresh: Bool {\n        return contains{ $0 <== .fromMemoryCacheOrRefresh }\n    }\n    \n    /// Whether the transition should always happen or not.\n    public var forceTransition: Bool {\n        return contains{ $0 <== .forceTransition }\n    }\n    \n    /// Whether cache the image only in memory or not.\n    public var cacheMemoryOnly: Bool {\n        return contains{ $0 <== .cacheMemoryOnly }\n    }\n    \n    /// Whether only load the images from cache or not.\n    public var onlyFromCache: Bool {\n        return contains{ $0 <== .onlyFromCache }\n    }\n    \n    /// Whether the image should be decoded in background or not.\n    public var backgroundDecode: Bool {\n        return contains{ $0 <== .backgroundDecode }\n    }\n\n    /// Whether the image data should be all loaded at once if it is an animated image.\n    public var preloadAllAnimationData: Bool {\n        return contains { $0 <== .preloadAllAnimationData }\n    }\n    \n    /// The queue of callbacks should happen from Kingfisher.\n    public var callbackDispatchQueue: DispatchQueue {\n        if let item = lastMatchIgnoringAssociatedValue(.callbackDispatchQueue(nil)),\n            case .callbackDispatchQueue(let queue) = item\n        {\n            return queue ?? DispatchQueue.main\n        }\n        return DispatchQueue.main\n    }\n    \n    /// The scale factor which should be used for the image.\n    public var scaleFactor: CGFloat {\n        if let item = lastMatchIgnoringAssociatedValue(.scaleFactor(0)),\n            case .scaleFactor(let scale) = item\n        {\n            return scale\n        }\n        return 1.0\n    }\n    \n    /// The `ImageDownloadRequestModifier` will be used before sending a download request.\n    public var modifier: ImageDownloadRequestModifier {\n        if let item = lastMatchIgnoringAssociatedValue(.requestModifier(NoModifier.default)),\n            case .requestModifier(let modifier) = item\n        {\n            return modifier\n        }\n        return NoModifier.default\n    }\n    \n    /// `ImageProcessor` for processing when the downloading finishes.\n    public var processor: ImageProcessor {\n        if let item = lastMatchIgnoringAssociatedValue(.processor(DefaultImageProcessor.default)),\n            case .processor(let processor) = item\n        {\n            return processor\n        }\n        return DefaultImageProcessor.default\n    }\n    \n    /// `CacheSerializer` to convert image to data for storing in cache.\n    public var cacheSerializer: CacheSerializer {\n        if let item = lastMatchIgnoringAssociatedValue(.cacheSerializer(DefaultCacheSerializer.default)),\n            case .cacheSerializer(let cacheSerializer) = item\n        {\n            return cacheSerializer\n        }\n        return DefaultCacheSerializer.default\n    }\n    \n    /// Keep the existing image while setting another image to an image view. \n    /// Or the placeholder will be used while downloading.\n    public var keepCurrentImageWhileLoading: Bool {\n        return contains { $0 <== .keepCurrentImageWhileLoading }\n    }\n    \n    public var onlyLoadFirstFrame: Bool {\n        return contains { $0 <== .onlyLoadFirstFrame }\n    }\n    \n    public var cacheOriginalImage: Bool {\n        return contains { $0 <== .cacheOriginalImage }\n    }\n}\n"
  },
  {
    "path": "Pods/Kingfisher/Sources/Placeholder.swift",
    "content": "//\n//  Placeholder.swift\n//  Kingfisher\n//\n//  Created by Tieme van Veen on 28/08/2017.\n//\n//  Copyright (c) 2017 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(macOS)\n    import AppKit\n#else\n    import UIKit\n#endif\n\n\n/// Represent a placeholder type which could be set while loading as well as\n/// loading finished without getting an image.\npublic protocol Placeholder {\n    \n    /// How the placeholder should be added to a given image view.\n    func add(to imageView: ImageView)\n    \n    /// How the placeholder should be removed from a given image view.\n    func remove(from imageView: ImageView)\n}\n\n/// Default implementation of an image placeholder. The image will be set or \n/// reset directly for `image` property of the image view.\nextension Placeholder where Self: Image {\n    \n    /// How the placeholder should be added to a given image view.\n    public func add(to imageView: ImageView) { imageView.image = self }\n    \n    /// How the placeholder should be removed from a given image view.\n    public func remove(from imageView: ImageView) { imageView.image = nil }\n}\n\nextension Image: Placeholder {}\n\n/// Default implementation of an arbitrary view as placeholder. The view will be \n/// added as a subview when adding and be removed from its super view when removing.\n///\n/// To use your customize View type as placeholder, simply let it conforming to \n/// `Placeholder` by `extension MyView: Placeholder {}`.\nextension Placeholder where Self: View {\n    \n    /// How the placeholder should be added to a given image view.\n    public func add(to imageView: ImageView) {\n        imageView.addSubview(self)\n\n        self.translatesAutoresizingMaskIntoConstraints = false\n        NSLayoutConstraint.activate([\n            NSLayoutConstraint(item: self, attribute: .centerX, relatedBy: .equal, toItem: imageView, attribute: .centerX, multiplier: 1, constant: 0),\n            NSLayoutConstraint(item: self, attribute: .centerY, relatedBy: .equal, toItem: imageView, attribute: .centerY, multiplier: 1, constant: 0),\n            NSLayoutConstraint(item: self, attribute: .height, relatedBy: .equal, toItem: imageView, attribute: .height, multiplier: 1, constant: 0),\n            NSLayoutConstraint(item: self, attribute: .width, relatedBy: .equal, toItem: imageView, attribute: .width, multiplier: 1, constant: 0)\n            ])\n    }\n\n    /// How the placeholder should be removed from a given image view.\n    public func remove(from imageView: ImageView) {\n        self.removeFromSuperview()\n    }\n}\n"
  },
  {
    "path": "Pods/Kingfisher/Sources/RequestModifier.swift",
    "content": "//\n//  RequestModifier.swift\n//  Kingfisher\n//\n//  Created by Wei Wang on 2016/09/05.\n//\n//  Copyright (c) 2017 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\n/// Request modifier of image downloader.\npublic protocol ImageDownloadRequestModifier {\n    func modified(for request: URLRequest) -> URLRequest?\n}\n\nstruct NoModifier: ImageDownloadRequestModifier {\n    static let `default` = NoModifier()\n    private init() {}\n    func modified(for request: URLRequest) -> URLRequest? {\n        return request\n    }\n}\n\npublic struct AnyModifier: ImageDownloadRequestModifier {\n    \n    let block: (URLRequest) -> URLRequest?\n    \n    public func modified(for request: URLRequest) -> URLRequest? {\n        return block(request)\n    }\n    \n    public init(modify: @escaping (URLRequest) -> URLRequest? ) {\n        block = modify\n    }\n}\n"
  },
  {
    "path": "Pods/Kingfisher/Sources/Resource.swift",
    "content": "//\n//  Resource.swift\n//  Kingfisher\n//\n//  Created by Wei Wang on 15/4/6.\n//\n//  Copyright (c) 2017 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\n\n/// `Resource` protocol defines how to download and cache a resource from network.\npublic protocol Resource {\n    /// The key used in cache.\n    var cacheKey: String { get }\n    \n    /// The target image URL.\n    var downloadURL: URL { get }\n}\n\n/**\n ImageResource is a simple combination of `downloadURL` and `cacheKey`.\n \n When passed to image view set methods, Kingfisher will try to download the target \n image from the `downloadURL`, and then store it with the `cacheKey` as the key in cache.\n */\npublic struct ImageResource: Resource {\n    /// The key used in cache.\n    public let cacheKey: String\n    \n    /// The target image URL.\n    public let downloadURL: URL\n    \n    /**\n     Create a resource.\n     \n     - parameter downloadURL: The target image URL.\n     - parameter cacheKey:    The cache key. If `nil`, Kingfisher will use the `absoluteString` of `downloadURL` as the key.\n     \n     - returns: A resource.\n     */\n    public init(downloadURL: URL, cacheKey: String? = nil) {\n        self.downloadURL = downloadURL\n        self.cacheKey = cacheKey ?? downloadURL.absoluteString\n    }\n}\n\n/**\n URL conforms to `Resource` in Kingfisher.\n The `absoluteString` of this URL is used as `cacheKey`. And the URL itself will be used as `downloadURL`.\n If you need customize the url and/or cache key, use `ImageResource` instead.\n */\nextension URL: Resource {\n    public var cacheKey: String { return absoluteString }\n    public var downloadURL: URL { return self }\n}\n"
  },
  {
    "path": "Pods/Kingfisher/Sources/String+MD5.swift",
    "content": "//\n//  String+MD5.swift\n//  Kingfisher\n//\n// To date, adding CommonCrypto to a Swift framework is problematic. See:\n// http://stackoverflow.com/questions/25248598/importing-commoncrypto-in-a-swift-framework\n// We're using a subset and modified version of CryptoSwift as an alternative.\n// The following is an altered source version that only includes MD5. The original software can be found at:\n// https://github.com/krzyzanowskim/CryptoSwift\n// This is the original copyright notice:\n\n/*\nCopyright (C) 2014 Marcin Krzyżanowski <marcin.krzyzanowski@gmail.com>\nThis software is provided 'as-is', without any express or implied warranty.\nIn no event will the authors be held liable for any damages arising from the use of this software.\nPermission is granted to anyone to use this software for any purpose,including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:\n- The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation is required.\n- Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.\n- This notice may not be removed or altered from any source or binary distribution.\n*/\n\nimport Foundation\n\npublic struct StringProxy {\n    fileprivate let base: String\n    init(proxy: String) {\n        base = proxy\n    }\n}\n\nextension String: KingfisherCompatible {\n    public typealias CompatibleType = StringProxy\n    public var kf: CompatibleType {\n        return StringProxy(proxy: self)\n    }\n}\n\nextension StringProxy {\n    var md5: String {\n        if let data = base.data(using: .utf8, allowLossyConversion: true) {\n\n            let message = data.withUnsafeBytes { bytes -> [UInt8] in\n                return Array(UnsafeBufferPointer(start: bytes, count: data.count))\n            }\n\n            let MD5Calculator = MD5(message)\n            let MD5Data = MD5Calculator.calculate()\n\n            var MD5String = String()\n            for c in MD5Data {\n                MD5String += String(format: \"%02x\", c)\n            }\n            return MD5String\n\n        } else {\n            return base\n        }\n    }\n}\n\n\n/** array of bytes, little-endian representation */\nfunc arrayOfBytes<T>(_ value: T, length: Int? = nil) -> [UInt8] {\n    let totalBytes = length ?? (MemoryLayout<T>.size * 8)\n    \n    let valuePointer = UnsafeMutablePointer<T>.allocate(capacity: 1)\n    valuePointer.pointee = value\n\n    let bytes = valuePointer.withMemoryRebound(to: UInt8.self, capacity: totalBytes) { (bytesPointer) -> [UInt8] in\n        var bytes = [UInt8](repeating: 0, count: totalBytes)\n        for j in 0..<min(MemoryLayout<T>.size, totalBytes) {\n            bytes[totalBytes - 1 - j] = (bytesPointer + j).pointee\n        }\n        return bytes\n    }\n\n    valuePointer.deinitialize()\n    valuePointer.deallocate(capacity: 1)\n    \n    return bytes\n}\n\nextension Int {\n    /** Array of bytes with optional padding (little-endian) */\n    func bytes(_ totalBytes: Int = MemoryLayout<Int>.size) -> [UInt8] {\n        return arrayOfBytes(self, length: totalBytes)\n    }\n    \n}\n\nextension NSMutableData {\n    \n    /** Convenient way to append bytes */\n    func appendBytes(_ arrayOfBytes: [UInt8]) {\n        append(arrayOfBytes, length: arrayOfBytes.count)\n    }\n    \n}\n\nprotocol HashProtocol {\n    var message: Array<UInt8> { get }\n    \n    /** Common part for hash calculation. Prepare header data. */\n    func prepare(_ len: Int) -> Array<UInt8>\n}\n\nextension HashProtocol {\n    \n    func prepare(_ len: Int) -> Array<UInt8> {\n        var tmpMessage = message\n        \n        // Step 1. Append Padding Bits\n        tmpMessage.append(0x80) // append one bit (UInt8 with one bit) to message\n        \n        // append \"0\" bit until message length in bits ≡ 448 (mod 512)\n        var msgLength = tmpMessage.count\n        var counter = 0\n        \n        while msgLength % len != (len - 8) {\n            counter += 1\n            msgLength += 1\n        }\n        \n        tmpMessage += Array<UInt8>(repeating: 0, count: counter)\n        return tmpMessage\n    }\n}\n\nfunc toUInt32Array(_ slice: ArraySlice<UInt8>) -> Array<UInt32> {\n    var result = Array<UInt32>()\n    result.reserveCapacity(16)\n    \n    for idx in stride(from: slice.startIndex, to: slice.endIndex, by: MemoryLayout<UInt32>.size) {\n        let d0 = UInt32(slice[idx.advanced(by: 3)]) << 24\n        let d1 = UInt32(slice[idx.advanced(by: 2)]) << 16\n        let d2 = UInt32(slice[idx.advanced(by: 1)]) << 8\n        let d3 = UInt32(slice[idx])\n        let val: UInt32 = d0 | d1 | d2 | d3\n                         \n        result.append(val)\n    }\n    return result\n}\n\nstruct BytesIterator: IteratorProtocol {\n    \n    let chunkSize: Int\n    let data: [UInt8]\n    \n    init(chunkSize: Int, data: [UInt8]) {\n        self.chunkSize = chunkSize\n        self.data = data\n    }\n    \n    var offset = 0\n    \n    mutating func next() -> ArraySlice<UInt8>? {\n        let end = min(chunkSize, data.count - offset)\n        let result = data[offset..<offset + end]\n        offset += result.count\n        return result.count > 0 ? result : nil\n    }\n}\n\nstruct BytesSequence: Sequence {\n    let chunkSize: Int\n    let data: [UInt8]\n    \n    func makeIterator() -> BytesIterator {\n        return BytesIterator(chunkSize: chunkSize, data: data)\n    }\n}\n\nfunc rotateLeft(_ value: UInt32, bits: UInt32) -> UInt32 {\n    return ((value << bits) & 0xFFFFFFFF) | (value >> (32 - bits))\n}\n\nclass MD5: HashProtocol {\n    \n    static let size = 16 // 128 / 8\n    let message: [UInt8]\n    \n    init (_ message: [UInt8]) {\n        self.message = message\n    }\n    \n    /** specifies the per-round shift amounts */\n    private let shifts: [UInt32] = [7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,\n                                    5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,\n                                    4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,\n                                    6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]\n    \n    /** binary integer part of the sines of integers (Radians) */\n    private let sines: [UInt32] = [0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,\n                               0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,\n                               0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,\n                               0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,\n                               0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,\n                               0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,\n                               0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,\n                               0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,\n                               0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,\n                               0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,\n                               0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05,\n                               0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,\n                               0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039,\n                               0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,\n                               0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,\n                               0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391]\n    \n    private let hashes: [UInt32] = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476]\n    \n    func calculate() -> [UInt8] {\n        var tmpMessage = prepare(64)\n        tmpMessage.reserveCapacity(tmpMessage.count + 4)\n        \n        // hash values\n        var hh = hashes\n        \n        // Step 2. Append Length a 64-bit representation of lengthInBits\n        let lengthInBits = (message.count * 8)\n        let lengthBytes = lengthInBits.bytes(64 / 8)\n        tmpMessage += lengthBytes.reversed()\n\n        // Process the message in successive 512-bit chunks:\n        let chunkSizeBytes = 512 / 8 // 64\n\n        for chunk in BytesSequence(chunkSize: chunkSizeBytes, data: tmpMessage) {\n            // break chunk into sixteen 32-bit words M[j], 0 ≤ j ≤ 15\n            var M = toUInt32Array(chunk)\n            assert(M.count == 16, \"Invalid array\")\n            \n            // Initialize hash value for this chunk:\n            var A: UInt32 = hh[0]\n            var B: UInt32 = hh[1]\n            var C: UInt32 = hh[2]\n            var D: UInt32 = hh[3]\n            \n            var dTemp: UInt32 = 0\n            \n            // Main loop\n            for j in 0 ..< sines.count {\n                var g = 0\n                var F: UInt32 = 0\n                \n                switch j {\n                case 0...15:\n                    F = (B & C) | ((~B) & D)\n                    g = j\n                    break\n                case 16...31:\n                    F = (D & B) | (~D & C)\n                    g = (5 * j + 1) % 16\n                    break\n                case 32...47:\n                    F = B ^ C ^ D\n                    g = (3 * j + 5) % 16\n                    break\n                case 48...63:\n                    F = C ^ (B | (~D))\n                    g = (7 * j) % 16\n                    break\n                default:\n                    break\n                }\n                dTemp = D\n                D = C\n                C = B\n                B = B &+ rotateLeft((A &+ F &+ sines[j] &+ M[g]), bits: shifts[j])\n                A = dTemp\n            }\n            \n            hh[0] = hh[0] &+ A\n            hh[1] = hh[1] &+ B\n            hh[2] = hh[2] &+ C\n            hh[3] = hh[3] &+ D\n        }\n        \n        var result = [UInt8]()\n        result.reserveCapacity(hh.count / 4)\n        \n        hh.forEach {\n            let itemLE = $0.littleEndian\n            let r1 = UInt8(itemLE & 0xff)\n            let r2 = UInt8((itemLE >> 8) & 0xff)\n            let r3 = UInt8((itemLE >> 16) & 0xff)\n            let r4 = UInt8((itemLE >> 24) & 0xff)\n            result += [r1, r2, r3, r4]\n        }\n        return result\n    }\n}\n"
  },
  {
    "path": "Pods/Kingfisher/Sources/ThreadHelper.swift",
    "content": "//\n//  ThreadHelper.swift\n//  Kingfisher\n//\n//  Created by Wei Wang on 15/10/9.\n//\n//  Copyright (c) 2017 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\nextension DispatchQueue {\n    // This method will dispatch the `block` to self.\n    // If `self` is the main queue, and current thread is main thread, the block\n    // will be invoked immediately instead of being dispatched.\n    func safeAsync(_ block: @escaping ()->()) {\n        if self === DispatchQueue.main && Thread.isMainThread {\n            block()\n        } else {\n            async { block() }\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/Kingfisher/Sources/UIButton+Kingfisher.swift",
    "content": "//\n//  UIButton+Kingfisher.swift\n//  Kingfisher\n//\n//  Created by Wei Wang on 15/4/13.\n//\n//  Copyright (c) 2017 Wei Wang <onevcat@gmail.com>\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport UIKit\n\n// MARK: - Set Images\n/**\n *\tSet image to use in button from web for a specified state.\n */\nextension Kingfisher where Base: UIButton {\n    /**\n     Set an image to use for a specified state with a resource, a placeholder image, options, progress handler and\n     completion handler.\n     \n     - parameter resource:          Resource object contains information such as `cacheKey` and `downloadURL`.\n     - parameter state:             The state that uses the specified image.\n     - parameter placeholder:       A placeholder image when retrieving the image at URL.\n     - parameter options:           A dictionary could control some behaviors. See `KingfisherOptionsInfo` for more.\n     - parameter progressBlock:     Called when the image downloading progress gets updated.\n     - parameter completionHandler: Called when the image retrieved and set.\n     \n     - returns: A task represents the retrieving process.\n     \n     - note: Both the `progressBlock` and `completionHandler` will be invoked in main thread.\n     The `CallbackDispatchQueue` specified in `optionsInfo` will not be used in callbacks of this method.\n     \n     If `resource` is `nil`, the `placeholder` image will be set and\n     `completionHandler` will be called with both `error` and `image` being `nil`.\n     */\n    @discardableResult\n    public func setImage(with resource: Resource?,\n                         for state: UIControlState,\n                         placeholder: UIImage? = nil,\n                         options: KingfisherOptionsInfo? = nil,\n                         progressBlock: DownloadProgressBlock? = nil,\n                         completionHandler: CompletionHandler? = nil) -> RetrieveImageTask\n    {\n        guard let resource = resource else {\n            base.setImage(placeholder, for: state)\n            setWebURL(nil, for: state)\n            completionHandler?(nil, nil, .none, nil)\n            return .empty\n        }\n        \n        let options = KingfisherManager.shared.defaultOptions + (options ?? KingfisherEmptyOptionsInfo)\n        if !options.keepCurrentImageWhileLoading {\n            base.setImage(placeholder, for: state)\n        }\n        \n        setWebURL(resource.downloadURL, for: state)\n        let task = KingfisherManager.shared.retrieveImage(\n            with: resource,\n            options: options,\n            progressBlock: { receivedSize, totalSize in\n                guard resource.downloadURL == self.webURL(for: state) else {\n                    return\n                }\n                if let progressBlock = progressBlock {\n                    progressBlock(receivedSize, totalSize)\n                }\n            },\n            completionHandler: {[weak base] image, error, cacheType, imageURL in\n                DispatchQueue.main.safeAsync {\n                    guard let strongBase = base, imageURL == self.webURL(for: state) else {\n                        completionHandler?(image, error, cacheType, imageURL)\n                        return\n                    }\n                    self.setImageTask(nil)\n                    if image != nil {\n                        strongBase.setImage(image, for: state)\n                    }\n\n                    completionHandler?(image, error, cacheType, imageURL)\n                }\n            })\n        \n        setImageTask(task)\n        return task\n    }\n    \n    /**\n     Cancel the image download task bounded to the image view if it is running.\n     Nothing will happen if the downloading has already finished.\n     */\n    public func cancelImageDownloadTask() {\n        imageTask?.cancel()\n    }\n    \n    /**\n     Set the background image to use for a specified state with a resource,\n     a placeholder image, options progress handler and completion handler.\n     \n     - parameter resource:          Resource object contains information such as `cacheKey` and `downloadURL`.\n     - parameter state:             The state that uses the specified image.\n     - parameter placeholder:       A placeholder image when retrieving the image at URL.\n     - parameter options:           A dictionary could control some behaviors. See `KingfisherOptionsInfo` for more.\n     - parameter progressBlock:     Called when the image downloading progress gets updated.\n     - parameter completionHandler: Called when the image retrieved and set.\n     \n     - returns: A task represents the retrieving process.\n     \n     - note: Both the `progressBlock` and `completionHandler` will be invoked in main thread.\n     The `CallbackDispatchQueue` specified in `optionsInfo` will not be used in callbacks of this method.\n     \n     If `resource` is `nil`, the `placeholder` image will be set and\n     `completionHandler` will be called with both `error` and `image` being `nil`.\n     */\n    @discardableResult\n    public func setBackgroundImage(with resource: Resource?,\n                                   for state: UIControlState,\n                                   placeholder: UIImage? = nil,\n                                   options: KingfisherOptionsInfo? = nil,\n                                   progressBlock: DownloadProgressBlock? = nil,\n                                   completionHandler: CompletionHandler? = nil) -> RetrieveImageTask\n    {\n        guard let resource = resource else {\n            base.setBackgroundImage(placeholder, for: state)\n            setBackgroundWebURL(nil, for: state)\n            completionHandler?(nil, nil, .none, nil)\n            return .empty\n        }\n        \n        let options = KingfisherManager.shared.defaultOptions + (options ?? KingfisherEmptyOptionsInfo)\n        if !options.keepCurrentImageWhileLoading {\n            base.setBackgroundImage(placeholder, for: state)\n        }\n        \n        setBackgroundWebURL(resource.downloadURL, for: state)\n        let task = KingfisherManager.shared.retrieveImage(\n            with: resource,\n            options: options,\n            progressBlock: { receivedSize, totalSize in\n                guard resource.downloadURL == self.backgroundWebURL(for: state) else {\n                    return\n                }\n                if let progressBlock = progressBlock {\n                    progressBlock(receivedSize, totalSize)\n                }\n            },\n            completionHandler: { [weak base] image, error, cacheType, imageURL in\n                DispatchQueue.main.safeAsync {\n                    guard let strongBase = base, imageURL == self.backgroundWebURL(for: state) else {\n                        completionHandler?(image, error, cacheType, imageURL)\n                        return\n                    }\n                    self.setBackgroundImageTask(nil)\n                    if image != nil {\n                        strongBase.setBackgroundImage(image, for: state)\n                    }\n                    completionHandler?(image, error, cacheType, imageURL)\n                }\n            })\n        \n        setBackgroundImageTask(task)\n        return task\n    }\n    \n    /**\n     Cancel the background image download task bounded to the image view if it is running.\n     Nothing will happen if the downloading has already finished.\n     */\n    public func cancelBackgroundImageDownloadTask() {\n        backgroundImageTask?.cancel()\n    }\n\n}\n\n// MARK: - Associated Object\nprivate var lastURLKey: Void?\nprivate var imageTaskKey: Void?\n\nextension Kingfisher where Base: UIButton {\n    /**\n     Get the image URL binded to this button for a specified state.\n     \n     - parameter state: The state that uses the specified image.\n     \n     - returns: Current URL for image.\n     */\n    public func webURL(for state: UIControlState) -> URL? {\n        return webURLs[NSNumber(value:state.rawValue)] as? URL\n    }\n    \n    fileprivate func setWebURL(_ url: URL?, for state: UIControlState) {\n        webURLs[NSNumber(value:state.rawValue)] = url\n    }\n    \n    fileprivate var webURLs: NSMutableDictionary {\n        var dictionary = objc_getAssociatedObject(base, &lastURLKey) as? NSMutableDictionary\n        if dictionary == nil {\n            dictionary = NSMutableDictionary()\n            setWebURLs(dictionary!)\n        }\n        return dictionary!\n    }\n    \n    fileprivate func setWebURLs(_ URLs: NSMutableDictionary) {\n        objc_setAssociatedObject(base, &lastURLKey, URLs, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n    }\n    \n    fileprivate var imageTask: RetrieveImageTask? {\n        return objc_getAssociatedObject(base, &imageTaskKey) as? RetrieveImageTask\n    }\n    \n    fileprivate func setImageTask(_ task: RetrieveImageTask?) {\n        objc_setAssociatedObject(base, &imageTaskKey, task, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n    }\n}\n\n\nprivate var lastBackgroundURLKey: Void?\nprivate var backgroundImageTaskKey: Void?\n\n\nextension Kingfisher where Base: UIButton {\n    /**\n     Get the background image URL binded to this button for a specified state.\n     \n     - parameter state: The state that uses the specified background image.\n     \n     - returns: Current URL for background image.\n     */\n    public func backgroundWebURL(for state: UIControlState) -> URL? {\n        return backgroundWebURLs[NSNumber(value:state.rawValue)] as? URL\n    }\n    \n    fileprivate func setBackgroundWebURL(_ url: URL?, for state: UIControlState) {\n        backgroundWebURLs[NSNumber(value:state.rawValue)] = url\n    }\n    \n    fileprivate var backgroundWebURLs: NSMutableDictionary {\n        var dictionary = objc_getAssociatedObject(base, &lastBackgroundURLKey) as? NSMutableDictionary\n        if dictionary == nil {\n            dictionary = NSMutableDictionary()\n            setBackgroundWebURLs(dictionary!)\n        }\n        return dictionary!\n    }\n    \n    fileprivate func setBackgroundWebURLs(_ URLs: NSMutableDictionary) {\n        objc_setAssociatedObject(base, &lastBackgroundURLKey, URLs, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n    }\n    \n    fileprivate var backgroundImageTask: RetrieveImageTask? {\n        return objc_getAssociatedObject(base, &backgroundImageTaskKey) as? RetrieveImageTask\n    }\n    \n    fileprivate func setBackgroundImageTask(_ task: RetrieveImageTask?) {\n        objc_setAssociatedObject(base, &backgroundImageTaskKey, task, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n    }\n}\n"
  },
  {
    "path": "Pods/MJRefresh/LICENSE",
    "content": "Copyright (c) 2013-2015 MJRefresh (https://github.com/CoderMJLee/MJRefresh)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Base/MJRefreshAutoFooter.h",
    "content": "//\n//  MJRefreshAutoFooter.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. All rights reserved.\n//\n\n#import \"MJRefreshFooter.h\"\n\n@interface MJRefreshAutoFooter : MJRefreshFooter\n/** 是否自动刷新(默认为YES) */\n@property (assign, nonatomic, getter=isAutomaticallyRefresh) BOOL automaticallyRefresh;\n\n/** 当底部控件出现多少时就自动刷新(默认为1.0，也就是底部控件完全出现时，才会自动刷新) */\n@property (assign, nonatomic) CGFloat appearencePercentTriggerAutoRefresh MJRefreshDeprecated(\"请使用triggerAutomaticallyRefreshPercent属性\");\n\n/** 当底部控件出现多少时就自动刷新(默认为1.0，也就是底部控件完全出现时，才会自动刷新) */\n@property (assign, nonatomic) CGFloat triggerAutomaticallyRefreshPercent;\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Base/MJRefreshAutoFooter.m",
    "content": "//\n//  MJRefreshAutoFooter.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. All rights reserved.\n//\n\n#import \"MJRefreshAutoFooter.h\"\n\n@interface MJRefreshAutoFooter()\n@end\n\n@implementation MJRefreshAutoFooter\n\n#pragma mark - 初始化\n- (void)willMoveToSuperview:(UIView *)newSuperview\n{\n    [super willMoveToSuperview:newSuperview];\n    \n    if (newSuperview) { // 新的父控件\n        if (self.hidden == NO) {\n            self.scrollView.mj_insetB += self.mj_h;\n        }\n        \n        // 设置位置\n        self.mj_y = _scrollView.mj_contentH;\n    } else { // 被移除了\n        if (self.hidden == NO) {\n            self.scrollView.mj_insetB -= self.mj_h;\n        }\n    }\n}\n\n#pragma mark - 过期方法\n- (void)setAppearencePercentTriggerAutoRefresh:(CGFloat)appearencePercentTriggerAutoRefresh\n{\n    self.triggerAutomaticallyRefreshPercent = appearencePercentTriggerAutoRefresh;\n}\n\n- (CGFloat)appearencePercentTriggerAutoRefresh\n{\n    return self.triggerAutomaticallyRefreshPercent;\n}\n\n#pragma mark - 实现父类的方法\n- (void)prepare\n{\n    [super prepare];\n    \n    // 默认底部控件100%出现时才会自动刷新\n    self.triggerAutomaticallyRefreshPercent = 1.0;\n    \n    // 设置为默认状态\n    self.automaticallyRefresh = YES;\n}\n\n- (void)scrollViewContentSizeDidChange:(NSDictionary *)change\n{\n    [super scrollViewContentSizeDidChange:change];\n    \n    // 设置位置\n    self.mj_y = self.scrollView.mj_contentH;\n}\n\n- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change\n{\n    [super scrollViewContentOffsetDidChange:change];\n    \n    if (self.state != MJRefreshStateIdle || !self.automaticallyRefresh || self.mj_y == 0) return;\n    \n    if (_scrollView.mj_insetT + _scrollView.mj_contentH > _scrollView.mj_h) { // 内容超过一个屏幕\n        // 这里的_scrollView.mj_contentH替换掉self.mj_y更为合理\n        if (_scrollView.mj_offsetY >= _scrollView.mj_contentH - _scrollView.mj_h + self.mj_h * self.triggerAutomaticallyRefreshPercent + _scrollView.mj_insetB - self.mj_h) {\n            // 防止手松开时连续调用\n            CGPoint old = [change[@\"old\"] CGPointValue];\n            CGPoint new = [change[@\"new\"] CGPointValue];\n            if (new.y <= old.y) return;\n            \n            // 当底部刷新控件完全出现时，才刷新\n            [self beginRefreshing];\n        }\n    }\n}\n\n- (void)scrollViewPanStateDidChange:(NSDictionary *)change\n{\n    [super scrollViewPanStateDidChange:change];\n    \n    if (self.state != MJRefreshStateIdle) return;\n    \n    if (_scrollView.panGestureRecognizer.state == UIGestureRecognizerStateEnded) {// 手松开\n        if (_scrollView.mj_insetT + _scrollView.mj_contentH <= _scrollView.mj_h) {  // 不够一个屏幕\n            if (_scrollView.mj_offsetY >= - _scrollView.mj_insetT) { // 向上拽\n                [self beginRefreshing];\n            }\n        } else { // 超出一个屏幕\n            if (_scrollView.mj_offsetY >= _scrollView.mj_contentH + _scrollView.mj_insetB - _scrollView.mj_h) {\n                [self beginRefreshing];\n            }\n        }\n    }\n}\n\n- (void)setState:(MJRefreshState)state\n{\n    MJRefreshCheckState\n    \n    if (state == MJRefreshStateRefreshing) {\n        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n            [self executeRefreshingCallback];\n        });\n    } else if (state == MJRefreshStateNoMoreData || state == MJRefreshStateIdle) {\n        if (MJRefreshStateRefreshing == oldState) {\n            if (self.endRefreshingCompletionBlock) {\n                self.endRefreshingCompletionBlock();\n            }\n        }\n    }\n}\n\n- (void)setHidden:(BOOL)hidden\n{\n    BOOL lastHidden = self.isHidden;\n    \n    [super setHidden:hidden];\n    \n    if (!lastHidden && hidden) {\n        self.state = MJRefreshStateIdle;\n        \n        self.scrollView.mj_insetB -= self.mj_h;\n    } else if (lastHidden && !hidden) {\n        self.scrollView.mj_insetB += self.mj_h;\n        \n        // 设置位置\n        self.mj_y = _scrollView.mj_contentH;\n    }\n}\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Base/MJRefreshBackFooter.h",
    "content": "//\n//  MJRefreshBackFooter.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. All rights reserved.\n//\n\n#import \"MJRefreshFooter.h\"\n\n@interface MJRefreshBackFooter : MJRefreshFooter\n\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Base/MJRefreshBackFooter.m",
    "content": "//\n//  MJRefreshBackFooter.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. All rights reserved.\n//\n\n#import \"MJRefreshBackFooter.h\"\n\n@interface MJRefreshBackFooter()\n@property (assign, nonatomic) NSInteger lastRefreshCount;\n@property (assign, nonatomic) CGFloat lastBottomDelta;\n@end\n\n@implementation MJRefreshBackFooter\n\n#pragma mark - 初始化\n- (void)willMoveToSuperview:(UIView *)newSuperview\n{\n    [super willMoveToSuperview:newSuperview];\n    \n    [self scrollViewContentSizeDidChange:nil];\n}\n\n#pragma mark - 实现父类的方法\n- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change\n{\n    [super scrollViewContentOffsetDidChange:change];\n    \n    // 如果正在刷新，直接返回\n    if (self.state == MJRefreshStateRefreshing) return;\n    \n    _scrollViewOriginalInset = self.scrollView.mj_inset;\n    \n    // 当前的contentOffset\n    CGFloat currentOffsetY = self.scrollView.mj_offsetY;\n    // 尾部控件刚好出现的offsetY\n    CGFloat happenOffsetY = [self happenOffsetY];\n    // 如果是向下滚动到看不见尾部控件，直接返回\n    if (currentOffsetY <= happenOffsetY) return;\n    \n    CGFloat pullingPercent = (currentOffsetY - happenOffsetY) / self.mj_h;\n    \n    // 如果已全部加载，仅设置pullingPercent，然后返回\n    if (self.state == MJRefreshStateNoMoreData) {\n        self.pullingPercent = pullingPercent;\n        return;\n    }\n    \n    if (self.scrollView.isDragging) {\n        self.pullingPercent = pullingPercent;\n        // 普通 和 即将刷新 的临界点\n        CGFloat normal2pullingOffsetY = happenOffsetY + self.mj_h;\n        \n        if (self.state == MJRefreshStateIdle && currentOffsetY > normal2pullingOffsetY) {\n            // 转为即将刷新状态\n            self.state = MJRefreshStatePulling;\n        } else if (self.state == MJRefreshStatePulling && currentOffsetY <= normal2pullingOffsetY) {\n            // 转为普通状态\n            self.state = MJRefreshStateIdle;\n        }\n    } else if (self.state == MJRefreshStatePulling) {// 即将刷新 && 手松开\n        // 开始刷新\n        [self beginRefreshing];\n    } else if (pullingPercent < 1) {\n        self.pullingPercent = pullingPercent;\n    }\n}\n\n- (void)scrollViewContentSizeDidChange:(NSDictionary *)change\n{\n    [super scrollViewContentSizeDidChange:change];\n    \n    // 内容的高度\n    CGFloat contentHeight = self.scrollView.mj_contentH + self.ignoredScrollViewContentInsetBottom;\n    // 表格的高度\n    CGFloat scrollHeight = self.scrollView.mj_h - self.scrollViewOriginalInset.top - self.scrollViewOriginalInset.bottom + self.ignoredScrollViewContentInsetBottom;\n    // 设置位置和尺寸\n    self.mj_y = MAX(contentHeight, scrollHeight);\n}\n\n- (void)setState:(MJRefreshState)state\n{\n    MJRefreshCheckState\n    \n    // 根据状态来设置属性\n    if (state == MJRefreshStateNoMoreData || state == MJRefreshStateIdle) {\n        // 刷新完毕\n        if (MJRefreshStateRefreshing == oldState) {\n            [UIView animateWithDuration:MJRefreshSlowAnimationDuration animations:^{\n                self.scrollView.mj_insetB -= self.lastBottomDelta;\n                \n                // 自动调整透明度\n                if (self.isAutomaticallyChangeAlpha) self.alpha = 0.0;\n            } completion:^(BOOL finished) {\n                self.pullingPercent = 0.0;\n                \n                if (self.endRefreshingCompletionBlock) {\n                    self.endRefreshingCompletionBlock();\n                }\n            }];\n        }\n        \n        CGFloat deltaH = [self heightForContentBreakView];\n        // 刚刷新完毕\n        if (MJRefreshStateRefreshing == oldState && deltaH > 0 && self.scrollView.mj_totalDataCount != self.lastRefreshCount) {\n            self.scrollView.mj_offsetY = self.scrollView.mj_offsetY;\n        }\n    } else if (state == MJRefreshStateRefreshing) {\n        // 记录刷新前的数量\n        self.lastRefreshCount = self.scrollView.mj_totalDataCount;\n        \n        [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{\n            CGFloat bottom = self.mj_h + self.scrollViewOriginalInset.bottom;\n            CGFloat deltaH = [self heightForContentBreakView];\n            if (deltaH < 0) { // 如果内容高度小于view的高度\n                bottom -= deltaH;\n            }\n            self.lastBottomDelta = bottom - self.scrollView.mj_insetB;\n            self.scrollView.mj_insetB = bottom;\n            self.scrollView.mj_offsetY = [self happenOffsetY] + self.mj_h;\n        } completion:^(BOOL finished) {\n            [self executeRefreshingCallback];\n        }];\n    }\n}\n#pragma mark - 私有方法\n#pragma mark 获得scrollView的内容 超出 view 的高度\n- (CGFloat)heightForContentBreakView\n{\n    CGFloat h = self.scrollView.frame.size.height - self.scrollViewOriginalInset.bottom - self.scrollViewOriginalInset.top;\n    return self.scrollView.contentSize.height - h;\n}\n\n#pragma mark 刚好看到上拉刷新控件时的contentOffset.y\n- (CGFloat)happenOffsetY\n{\n    CGFloat deltaH = [self heightForContentBreakView];\n    if (deltaH > 0) {\n        return deltaH - self.scrollViewOriginalInset.top;\n    } else {\n        return - self.scrollViewOriginalInset.top;\n    }\n}\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.h",
    "content": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000\n//  MJRefreshComponent.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/3/4.\n//  Copyright (c) 2015年 小码哥. All rights reserved.\n//  刷新控件的基类\n\n#import <UIKit/UIKit.h>\n#import \"MJRefreshConst.h\"\n#import \"UIView+MJExtension.h\"\n#import \"UIScrollView+MJExtension.h\"\n#import \"UIScrollView+MJRefresh.h\"\n#import \"NSBundle+MJRefresh.h\"\n\n/** 刷新控件的状态 */\ntypedef NS_ENUM(NSInteger, MJRefreshState) {\n    /** 普通闲置状态 */\n    MJRefreshStateIdle = 1,\n    /** 松开就可以进行刷新的状态 */\n    MJRefreshStatePulling,\n    /** 正在刷新中的状态 */\n    MJRefreshStateRefreshing,\n    /** 即将刷新的状态 */\n    MJRefreshStateWillRefresh,\n    /** 所有数据加载完毕，没有更多的数据了 */\n    MJRefreshStateNoMoreData\n};\n\n/** 进入刷新状态的回调 */\ntypedef void (^MJRefreshComponentRefreshingBlock)(void);\n/** 开始刷新后的回调(进入刷新状态后的回调) */\ntypedef void (^MJRefreshComponentbeginRefreshingCompletionBlock)(void);\n/** 结束刷新后的回调 */\ntypedef void (^MJRefreshComponentEndRefreshingCompletionBlock)(void);\n\n/** 刷新控件的基类 */\n@interface MJRefreshComponent : UIView\n{\n    /** 记录scrollView刚开始的inset */\n    UIEdgeInsets _scrollViewOriginalInset;\n    /** 父控件 */\n    __weak UIScrollView *_scrollView;\n}\n#pragma mark - 刷新回调\n/** 正在刷新的回调 */\n@property (copy, nonatomic) MJRefreshComponentRefreshingBlock refreshingBlock;\n/** 设置回调对象和回调方法 */\n- (void)setRefreshingTarget:(id)target refreshingAction:(SEL)action;\n\n/** 回调对象 */\n@property (weak, nonatomic) id refreshingTarget;\n/** 回调方法 */\n@property (assign, nonatomic) SEL refreshingAction;\n/** 触发回调（交给子类去调用） */\n- (void)executeRefreshingCallback;\n\n#pragma mark - 刷新状态控制\n/** 进入刷新状态 */\n- (void)beginRefreshing;\n- (void)beginRefreshingWithCompletionBlock:(void (^)(void))completionBlock;\n/** 开始刷新后的回调(进入刷新状态后的回调) */\n@property (copy, nonatomic) MJRefreshComponentbeginRefreshingCompletionBlock beginRefreshingCompletionBlock;\n/** 结束刷新的回调 */\n@property (copy, nonatomic) MJRefreshComponentEndRefreshingCompletionBlock endRefreshingCompletionBlock;\n/** 结束刷新状态 */\n- (void)endRefreshing;\n- (void)endRefreshingWithCompletionBlock:(void (^)(void))completionBlock;\n/** 是否正在刷新 */\n@property (assign, nonatomic, readonly, getter=isRefreshing) BOOL refreshing;\n//- (BOOL)isRefreshing;\n/** 刷新状态 一般交给子类内部实现 */\n@property (assign, nonatomic) MJRefreshState state;\n\n#pragma mark - 交给子类去访问\n/** 记录scrollView刚开始的inset */\n@property (assign, nonatomic, readonly) UIEdgeInsets scrollViewOriginalInset;\n/** 父控件 */\n@property (weak, nonatomic, readonly) UIScrollView *scrollView;\n\n#pragma mark - 交给子类们去实现\n/** 初始化 */\n- (void)prepare NS_REQUIRES_SUPER;\n/** 摆放子控件frame */\n- (void)placeSubviews NS_REQUIRES_SUPER;\n/** 当scrollView的contentOffset发生改变的时候调用 */\n- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change NS_REQUIRES_SUPER;\n/** 当scrollView的contentSize发生改变的时候调用 */\n- (void)scrollViewContentSizeDidChange:(NSDictionary *)change NS_REQUIRES_SUPER;\n/** 当scrollView的拖拽状态发生改变的时候调用 */\n- (void)scrollViewPanStateDidChange:(NSDictionary *)change NS_REQUIRES_SUPER;\n\n\n#pragma mark - 其他\n/** 拉拽的百分比(交给子类重写) */\n@property (assign, nonatomic) CGFloat pullingPercent;\n/** 根据拖拽比例自动切换透明度 */\n@property (assign, nonatomic, getter=isAutoChangeAlpha) BOOL autoChangeAlpha MJRefreshDeprecated(\"请使用automaticallyChangeAlpha属性\");\n/** 根据拖拽比例自动切换透明度 */\n@property (assign, nonatomic, getter=isAutomaticallyChangeAlpha) BOOL automaticallyChangeAlpha;\n@end\n\n@interface UILabel(MJRefresh)\n+ (instancetype)mj_label;\n- (CGFloat)mj_textWith;\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Base/MJRefreshComponent.m",
    "content": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000\n//  MJRefreshComponent.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/3/4.\n//  Copyright (c) 2015年 小码哥. All rights reserved.\n//\n\n#import \"MJRefreshComponent.h\"\n#import \"MJRefreshConst.h\"\n\n@interface MJRefreshComponent()\n@property (strong, nonatomic) UIPanGestureRecognizer *pan;\n@end\n\n@implementation MJRefreshComponent\n#pragma mark - 初始化\n- (instancetype)initWithFrame:(CGRect)frame\n{\n    if (self = [super initWithFrame:frame]) {\n        // 准备工作\n        [self prepare];\n        \n        // 默认是普通状态\n        self.state = MJRefreshStateIdle;\n    }\n    return self;\n}\n\n- (void)prepare\n{\n    // 基本属性\n    self.autoresizingMask = UIViewAutoresizingFlexibleWidth;\n    self.backgroundColor = [UIColor clearColor];\n}\n\n- (void)layoutSubviews\n{\n    [self placeSubviews];\n    \n    [super layoutSubviews];\n}\n\n- (void)placeSubviews{}\n\n- (void)willMoveToSuperview:(UIView *)newSuperview\n{\n    [super willMoveToSuperview:newSuperview];\n    \n    // 如果不是UIScrollView，不做任何事情\n    if (newSuperview && ![newSuperview isKindOfClass:[UIScrollView class]]) return;\n    \n    // 旧的父控件移除监听\n    [self removeObservers];\n    \n    if (newSuperview) { // 新的父控件\n        // 设置宽度\n        self.mj_w = newSuperview.mj_w;\n        // 设置位置\n        self.mj_x = -_scrollView.mj_insetL;\n        \n        // 记录UIScrollView\n        _scrollView = (UIScrollView *)newSuperview;\n        // 设置永远支持垂直弹簧效果\n        _scrollView.alwaysBounceVertical = YES;\n        // 记录UIScrollView最开始的contentInset\n        _scrollViewOriginalInset = _scrollView.mj_inset;\n        \n        // 添加监听\n        [self addObservers];\n    }\n}\n\n- (void)drawRect:(CGRect)rect\n{\n    [super drawRect:rect];\n    \n    if (self.state == MJRefreshStateWillRefresh) {\n        // 预防view还没显示出来就调用了beginRefreshing\n        self.state = MJRefreshStateRefreshing;\n    }\n}\n\n#pragma mark - KVO监听\n- (void)addObservers\n{\n    NSKeyValueObservingOptions options = NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld;\n    [self.scrollView addObserver:self forKeyPath:MJRefreshKeyPathContentOffset options:options context:nil];\n    [self.scrollView addObserver:self forKeyPath:MJRefreshKeyPathContentSize options:options context:nil];\n    self.pan = self.scrollView.panGestureRecognizer;\n    [self.pan addObserver:self forKeyPath:MJRefreshKeyPathPanState options:options context:nil];\n}\n\n- (void)removeObservers\n{\n    [self.superview removeObserver:self forKeyPath:MJRefreshKeyPathContentOffset];\n    [self.superview removeObserver:self forKeyPath:MJRefreshKeyPathContentSize];\n    [self.pan removeObserver:self forKeyPath:MJRefreshKeyPathPanState];\n    self.pan = nil;\n}\n\n- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context\n{\n    // 遇到这些情况就直接返回\n    if (!self.userInteractionEnabled) return;\n    \n    // 这个就算看不见也需要处理\n    if ([keyPath isEqualToString:MJRefreshKeyPathContentSize]) {\n        [self scrollViewContentSizeDidChange:change];\n    }\n    \n    // 看不见\n    if (self.hidden) return;\n    if ([keyPath isEqualToString:MJRefreshKeyPathContentOffset]) {\n        [self scrollViewContentOffsetDidChange:change];\n    } else if ([keyPath isEqualToString:MJRefreshKeyPathPanState]) {\n        [self scrollViewPanStateDidChange:change];\n    }\n}\n\n- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change{}\n- (void)scrollViewContentSizeDidChange:(NSDictionary *)change{}\n- (void)scrollViewPanStateDidChange:(NSDictionary *)change{}\n\n#pragma mark - 公共方法\n#pragma mark 设置回调对象和回调方法\n- (void)setRefreshingTarget:(id)target refreshingAction:(SEL)action\n{\n    self.refreshingTarget = target;\n    self.refreshingAction = action;\n}\n\n- (void)setState:(MJRefreshState)state\n{\n    _state = state;\n    \n    // 加入主队列的目的是等setState:方法调用完毕、设置完文字后再去布局子控件\n    dispatch_async(dispatch_get_main_queue(), ^{\n        [self setNeedsLayout];\n    });\n}\n\n#pragma mark 进入刷新状态\n- (void)beginRefreshing\n{\n    [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{\n        self.alpha = 1.0;\n    }];\n    self.pullingPercent = 1.0;\n    // 只要正在刷新，就完全显示\n    if (self.window) {\n        self.state = MJRefreshStateRefreshing;\n    } else {\n        // 预防正在刷新中时，调用本方法使得header inset回置失败\n        if (self.state != MJRefreshStateRefreshing) {\n            self.state = MJRefreshStateWillRefresh;\n            // 刷新(预防从另一个控制器回到这个控制器的情况，回来要重新刷新一下)\n            [self setNeedsDisplay];\n        }\n    }\n}\n\n- (void)beginRefreshingWithCompletionBlock:(void (^)(void))completionBlock\n{\n    self.beginRefreshingCompletionBlock = completionBlock;\n    \n    [self beginRefreshing];\n}\n\n#pragma mark 结束刷新状态\n- (void)endRefreshing\n{\n    dispatch_async(dispatch_get_main_queue(), ^{\n        self.state = MJRefreshStateIdle;\n    });\n}\n\n- (void)endRefreshingWithCompletionBlock:(void (^)(void))completionBlock\n{\n    self.endRefreshingCompletionBlock = completionBlock;\n    \n    [self endRefreshing];\n}\n\n#pragma mark 是否正在刷新\n- (BOOL)isRefreshing\n{\n    return self.state == MJRefreshStateRefreshing || self.state == MJRefreshStateWillRefresh;\n}\n\n#pragma mark 自动切换透明度\n- (void)setAutoChangeAlpha:(BOOL)autoChangeAlpha\n{\n    self.automaticallyChangeAlpha = autoChangeAlpha;\n}\n\n- (BOOL)isAutoChangeAlpha\n{\n    return self.isAutomaticallyChangeAlpha;\n}\n\n- (void)setAutomaticallyChangeAlpha:(BOOL)automaticallyChangeAlpha\n{\n    _automaticallyChangeAlpha = automaticallyChangeAlpha;\n    \n    if (self.isRefreshing) return;\n    \n    if (automaticallyChangeAlpha) {\n        self.alpha = self.pullingPercent;\n    } else {\n        self.alpha = 1.0;\n    }\n}\n\n#pragma mark 根据拖拽进度设置透明度\n- (void)setPullingPercent:(CGFloat)pullingPercent\n{\n    _pullingPercent = pullingPercent;\n    \n    if (self.isRefreshing) return;\n    \n    if (self.isAutomaticallyChangeAlpha) {\n        self.alpha = pullingPercent;\n    }\n}\n\n#pragma mark - 内部方法\n- (void)executeRefreshingCallback\n{\n    dispatch_async(dispatch_get_main_queue(), ^{\n        if (self.refreshingBlock) {\n            self.refreshingBlock();\n        }\n        if ([self.refreshingTarget respondsToSelector:self.refreshingAction]) {\n            MJRefreshMsgSend(MJRefreshMsgTarget(self.refreshingTarget), self.refreshingAction, self);\n        }\n        if (self.beginRefreshingCompletionBlock) {\n            self.beginRefreshingCompletionBlock();\n        }\n    });\n}\n@end\n\n@implementation UILabel(MJRefresh)\n+ (instancetype)mj_label\n{\n    UILabel *label = [[self alloc] init];\n    label.font = MJRefreshLabelFont;\n    label.textColor = MJRefreshLabelTextColor;\n    label.autoresizingMask = UIViewAutoresizingFlexibleWidth;\n    label.textAlignment = NSTextAlignmentCenter;\n    label.backgroundColor = [UIColor clearColor];\n    return label;\n}\n\n- (CGFloat)mj_textWith {\n    CGFloat stringWidth = 0;\n    CGSize size = CGSizeMake(MAXFLOAT, MAXFLOAT);\n    if (self.text.length > 0) {\n#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000\n        stringWidth =[self.text\n                      boundingRectWithSize:size\n                      options:NSStringDrawingUsesLineFragmentOrigin\n                      attributes:@{NSFontAttributeName:self.font}\n                      context:nil].size.width;\n#else\n        \n        stringWidth = [self.text sizeWithFont:self.font\n                             constrainedToSize:size\n                                 lineBreakMode:NSLineBreakByCharWrapping].width;\n#endif\n    }\n    return stringWidth;\n}\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Base/MJRefreshFooter.h",
    "content": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000\n//  MJRefreshFooter.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/3/5.\n//  Copyright (c) 2015年 小码哥. All rights reserved.\n//  上拉刷新控件\n\n#import \"MJRefreshComponent.h\"\n\n@interface MJRefreshFooter : MJRefreshComponent\n/** 创建footer */\n+ (instancetype)footerWithRefreshingBlock:(MJRefreshComponentRefreshingBlock)refreshingBlock;\n/** 创建footer */\n+ (instancetype)footerWithRefreshingTarget:(id)target refreshingAction:(SEL)action;\n\n/** 提示没有更多的数据 */\n- (void)endRefreshingWithNoMoreData;\n- (void)noticeNoMoreData MJRefreshDeprecated(\"使用endRefreshingWithNoMoreData\");\n\n/** 重置没有更多的数据（消除没有更多数据的状态） */\n- (void)resetNoMoreData;\n\n/** 忽略多少scrollView的contentInset的bottom */\n@property (assign, nonatomic) CGFloat ignoredScrollViewContentInsetBottom;\n\n/** 自动根据有无数据来显示和隐藏（有数据就显示，没有数据隐藏。默认是NO） */\n@property (assign, nonatomic, getter=isAutomaticallyHidden) BOOL automaticallyHidden MJRefreshDeprecated(\"不建议使用此属性，开发者请自行控制footer的显示和隐藏。基于安全考虑，在未来的某些版本此属性可能作废\");\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Base/MJRefreshFooter.m",
    "content": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000\n//  MJRefreshFooter.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/3/5.\n//  Copyright (c) 2015年 小码哥. All rights reserved.\n//\n\n#import \"MJRefreshFooter.h\"\n#include \"UIScrollView+MJRefresh.h\"\n\n@interface MJRefreshFooter()\n\n@end\n\n@implementation MJRefreshFooter\n#pragma mark - 构造方法\n+ (instancetype)footerWithRefreshingBlock:(MJRefreshComponentRefreshingBlock)refreshingBlock\n{\n    MJRefreshFooter *cmp = [[self alloc] init];\n    cmp.refreshingBlock = refreshingBlock;\n    return cmp;\n}\n+ (instancetype)footerWithRefreshingTarget:(id)target refreshingAction:(SEL)action\n{\n    MJRefreshFooter *cmp = [[self alloc] init];\n    [cmp setRefreshingTarget:target refreshingAction:action];\n    return cmp;\n}\n\n#pragma mark - 重写父类的方法\n- (void)prepare\n{\n    [super prepare];\n    \n    // 设置自己的高度\n    self.mj_h = MJRefreshFooterHeight;\n    \n    // 默认不会自动隐藏\n    self.automaticallyHidden = NO;\n}\n\n- (void)willMoveToSuperview:(UIView *)newSuperview\n{\n    [super willMoveToSuperview:newSuperview];\n    \n    if (newSuperview) {\n        // 监听scrollView数据的变化\n        if ([self.scrollView isKindOfClass:[UITableView class]] || [self.scrollView isKindOfClass:[UICollectionView class]]) {\n            [self.scrollView setMj_reloadDataBlock:^(NSInteger totalDataCount) {\n                if (self.isAutomaticallyHidden) {\n                    self.hidden = (totalDataCount == 0);\n                }\n            }];\n        }\n    }\n}\n\n#pragma mark - 公共方法\n- (void)endRefreshingWithNoMoreData\n{\n    dispatch_async(dispatch_get_main_queue(), ^{\n        self.state = MJRefreshStateNoMoreData;\n    });\n}\n\n- (void)noticeNoMoreData\n{\n    [self endRefreshingWithNoMoreData];\n}\n\n- (void)resetNoMoreData\n{\n    dispatch_async(dispatch_get_main_queue(), ^{\n        self.state = MJRefreshStateIdle;\n    });\n}\n\n- (void)setAutomaticallyHidden:(BOOL)automaticallyHidden\n{\n    _automaticallyHidden = automaticallyHidden;\n}\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Base/MJRefreshHeader.h",
    "content": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000\n//  MJRefreshHeader.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/3/4.\n//  Copyright (c) 2015年 小码哥. All rights reserved.\n//  下拉刷新控件:负责监控用户下拉的状态\n\n#import \"MJRefreshComponent.h\"\n\n@interface MJRefreshHeader : MJRefreshComponent\n/** 创建header */\n+ (instancetype)headerWithRefreshingBlock:(MJRefreshComponentRefreshingBlock)refreshingBlock;\n/** 创建header */\n+ (instancetype)headerWithRefreshingTarget:(id)target refreshingAction:(SEL)action;\n\n/** 这个key用来存储上一次下拉刷新成功的时间 */\n@property (copy, nonatomic) NSString *lastUpdatedTimeKey;\n/** 上一次下拉刷新成功的时间 */\n@property (strong, nonatomic, readonly) NSDate *lastUpdatedTime;\n\n/** 忽略多少scrollView的contentInset的top */\n@property (assign, nonatomic) CGFloat ignoredScrollViewContentInsetTop;\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Base/MJRefreshHeader.m",
    "content": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000\n//  MJRefreshHeader.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/3/4.\n//  Copyright (c) 2015年 小码哥. All rights reserved.\n//\n\n#import \"MJRefreshHeader.h\"\n\n@interface MJRefreshHeader()\n@property (assign, nonatomic) CGFloat insetTDelta;\n@end\n\n@implementation MJRefreshHeader\n#pragma mark - 构造方法\n+ (instancetype)headerWithRefreshingBlock:(MJRefreshComponentRefreshingBlock)refreshingBlock\n{\n    MJRefreshHeader *cmp = [[self alloc] init];\n    cmp.refreshingBlock = refreshingBlock;\n    return cmp;\n}\n+ (instancetype)headerWithRefreshingTarget:(id)target refreshingAction:(SEL)action\n{\n    MJRefreshHeader *cmp = [[self alloc] init];\n    [cmp setRefreshingTarget:target refreshingAction:action];\n    return cmp;\n}\n\n#pragma mark - 覆盖父类的方法\n- (void)prepare\n{\n    [super prepare];\n    \n    // 设置key\n    self.lastUpdatedTimeKey = MJRefreshHeaderLastUpdatedTimeKey;\n    \n    // 设置高度\n    self.mj_h = MJRefreshHeaderHeight;\n}\n\n- (void)placeSubviews\n{\n    [super placeSubviews];\n    \n    // 设置y值(当自己的高度发生改变了，肯定要重新调整Y值，所以放到placeSubviews方法中设置y值)\n    self.mj_y = - self.mj_h - self.ignoredScrollViewContentInsetTop;\n}\n\n- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change\n{\n    [super scrollViewContentOffsetDidChange:change];\n    \n    // 在刷新的refreshing状态\n    if (self.state == MJRefreshStateRefreshing) {\n        // 暂时保留\n        if (self.window == nil) return;\n        \n        // sectionheader停留解决\n        CGFloat insetT = - self.scrollView.mj_offsetY > _scrollViewOriginalInset.top ? - self.scrollView.mj_offsetY : _scrollViewOriginalInset.top;\n        insetT = insetT > self.mj_h + _scrollViewOriginalInset.top ? self.mj_h + _scrollViewOriginalInset.top : insetT;\n        self.scrollView.mj_insetT = insetT;\n        \n        self.insetTDelta = _scrollViewOriginalInset.top - insetT;\n        return;\n    }\n    \n    // 跳转到下一个控制器时，contentInset可能会变\n     _scrollViewOriginalInset = self.scrollView.mj_inset;\n    \n    // 当前的contentOffset\n    CGFloat offsetY = self.scrollView.mj_offsetY;\n    // 头部控件刚好出现的offsetY\n    CGFloat happenOffsetY = - self.scrollViewOriginalInset.top;\n    \n    // 如果是向上滚动到看不见头部控件，直接返回\n    // >= -> >\n    if (offsetY > happenOffsetY) return;\n    \n    // 普通 和 即将刷新 的临界点\n    CGFloat normal2pullingOffsetY = happenOffsetY - self.mj_h;\n    CGFloat pullingPercent = (happenOffsetY - offsetY) / self.mj_h;\n    \n    if (self.scrollView.isDragging) { // 如果正在拖拽\n        self.pullingPercent = pullingPercent;\n        if (self.state == MJRefreshStateIdle && offsetY < normal2pullingOffsetY) {\n            // 转为即将刷新状态\n            self.state = MJRefreshStatePulling;\n        } else if (self.state == MJRefreshStatePulling && offsetY >= normal2pullingOffsetY) {\n            // 转为普通状态\n            self.state = MJRefreshStateIdle;\n        }\n    } else if (self.state == MJRefreshStatePulling) {// 即将刷新 && 手松开\n        // 开始刷新\n        [self beginRefreshing];\n    } else if (pullingPercent < 1) {\n        self.pullingPercent = pullingPercent;\n    }\n}\n\n- (void)setState:(MJRefreshState)state\n{\n    MJRefreshCheckState\n    \n    // 根据状态做事情\n    if (state == MJRefreshStateIdle) {\n        if (oldState != MJRefreshStateRefreshing) return;\n        \n        // 保存刷新时间\n        [[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:self.lastUpdatedTimeKey];\n        [[NSUserDefaults standardUserDefaults] synchronize];\n        \n        // 恢复inset和offset\n        [UIView animateWithDuration:MJRefreshSlowAnimationDuration animations:^{\n            self.scrollView.mj_insetT += self.insetTDelta;\n            \n            // 自动调整透明度\n            if (self.isAutomaticallyChangeAlpha) self.alpha = 0.0;\n        } completion:^(BOOL finished) {\n            self.pullingPercent = 0.0;\n            \n            if (self.endRefreshingCompletionBlock) {\n                self.endRefreshingCompletionBlock();\n            }\n        }];\n    } else if (state == MJRefreshStateRefreshing) {\n         dispatch_async(dispatch_get_main_queue(), ^{\n            [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{\n                CGFloat top = self.scrollViewOriginalInset.top + self.mj_h;\n                // 增加滚动区域top\n                self.scrollView.mj_insetT = top;\n                // 设置滚动位置\n                CGPoint offset = self.scrollView.contentOffset;\n                offset.y = -top;\n                [self.scrollView setContentOffset:offset animated:NO];\n            } completion:^(BOOL finished) {\n                [self executeRefreshingCallback];\n            }];\n         });\n    }\n}\n\n#pragma mark - 公共方法\n- (NSDate *)lastUpdatedTime\n{\n    return [[NSUserDefaults standardUserDefaults] objectForKey:self.lastUpdatedTimeKey];\n}\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.h",
    "content": "//\n//  MJRefreshAutoGifFooter.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. All rights reserved.\n//\n\n#import \"MJRefreshAutoStateFooter.h\"\n\n@interface MJRefreshAutoGifFooter : MJRefreshAutoStateFooter\n@property (weak, nonatomic, readonly) UIImageView *gifView;\n\n/** 设置state状态下的动画图片images 动画持续时间duration*/\n- (void)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state;\n- (void)setImages:(NSArray *)images forState:(MJRefreshState)state;\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.m",
    "content": "//\n//  MJRefreshAutoGifFooter.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. All rights reserved.\n//\n\n#import \"MJRefreshAutoGifFooter.h\"\n\n@interface MJRefreshAutoGifFooter()\n{\n    __unsafe_unretained UIImageView *_gifView;\n}\n/** 所有状态对应的动画图片 */\n@property (strong, nonatomic) NSMutableDictionary *stateImages;\n/** 所有状态对应的动画时间 */\n@property (strong, nonatomic) NSMutableDictionary *stateDurations;\n@end\n\n@implementation MJRefreshAutoGifFooter\n#pragma mark - 懒加载\n- (UIImageView *)gifView\n{\n    if (!_gifView) {\n        UIImageView *gifView = [[UIImageView alloc] init];\n        [self addSubview:_gifView = gifView];\n    }\n    return _gifView;\n}\n\n- (NSMutableDictionary *)stateImages\n{\n    if (!_stateImages) {\n        self.stateImages = [NSMutableDictionary dictionary];\n    }\n    return _stateImages;\n}\n\n- (NSMutableDictionary *)stateDurations\n{\n    if (!_stateDurations) {\n        self.stateDurations = [NSMutableDictionary dictionary];\n    }\n    return _stateDurations;\n}\n\n#pragma mark - 公共方法\n- (void)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state\n{\n    if (images == nil) return;\n    \n    self.stateImages[@(state)] = images;\n    self.stateDurations[@(state)] = @(duration);\n    \n    /* 根据图片设置控件的高度 */\n    UIImage *image = [images firstObject];\n    if (image.size.height > self.mj_h) {\n        self.mj_h = image.size.height;\n    }\n}\n\n- (void)setImages:(NSArray *)images forState:(MJRefreshState)state\n{\n    [self setImages:images duration:images.count * 0.1 forState:state];\n}\n\n#pragma mark - 实现父类的方法\n- (void)prepare\n{\n    [super prepare];\n    \n    // 初始化间距\n    self.labelLeftInset = 20;\n}\n\n- (void)placeSubviews\n{\n    [super placeSubviews];\n    \n    if (self.gifView.constraints.count) return;\n    \n    self.gifView.frame = self.bounds;\n    if (self.isRefreshingTitleHidden) {\n        self.gifView.contentMode = UIViewContentModeCenter;\n    } else {\n        self.gifView.contentMode = UIViewContentModeRight;\n        self.gifView.mj_w = self.mj_w * 0.5 - self.labelLeftInset - self.stateLabel.mj_textWith * 0.5;\n    }\n}\n\n- (void)setState:(MJRefreshState)state\n{\n    MJRefreshCheckState\n    \n    // 根据状态做事情\n    if (state == MJRefreshStateRefreshing) {\n        NSArray *images = self.stateImages[@(state)];\n        if (images.count == 0) return;\n        [self.gifView stopAnimating];\n        \n        self.gifView.hidden = NO;\n        if (images.count == 1) { // 单张图片\n            self.gifView.image = [images lastObject];\n        } else { // 多张图片\n            self.gifView.animationImages = images;\n            self.gifView.animationDuration = [self.stateDurations[@(state)] doubleValue];\n            [self.gifView startAnimating];\n        }\n    } else if (state == MJRefreshStateNoMoreData || state == MJRefreshStateIdle) {\n        [self.gifView stopAnimating];\n        self.gifView.hidden = YES;\n    }\n}\n@end\n\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.h",
    "content": "//\n//  MJRefreshAutoNormalFooter.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. All rights reserved.\n//\n\n#import \"MJRefreshAutoStateFooter.h\"\n\n@interface MJRefreshAutoNormalFooter : MJRefreshAutoStateFooter\n/** 菊花的样式 */\n@property (assign, nonatomic) UIActivityIndicatorViewStyle activityIndicatorViewStyle;\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.m",
    "content": "//\n//  MJRefreshAutoNormalFooter.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. All rights reserved.\n//\n\n#import \"MJRefreshAutoNormalFooter.h\"\n\n@interface MJRefreshAutoNormalFooter()\n@property (weak, nonatomic) UIActivityIndicatorView *loadingView;\n@end\n\n@implementation MJRefreshAutoNormalFooter\n#pragma mark - 懒加载子控件\n- (UIActivityIndicatorView *)loadingView\n{\n    if (!_loadingView) {\n        UIActivityIndicatorView *loadingView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:self.activityIndicatorViewStyle];\n        loadingView.hidesWhenStopped = YES;\n        [self addSubview:_loadingView = loadingView];\n    }\n    return _loadingView;\n}\n\n- (void)setActivityIndicatorViewStyle:(UIActivityIndicatorViewStyle)activityIndicatorViewStyle\n{\n    _activityIndicatorViewStyle = activityIndicatorViewStyle;\n    \n    self.loadingView = nil;\n    [self setNeedsLayout];\n}\n#pragma mark - 重写父类的方法\n- (void)prepare\n{\n    [super prepare];\n    \n    self.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray;\n}\n\n- (void)placeSubviews\n{\n    [super placeSubviews];\n    \n    if (self.loadingView.constraints.count) return;\n    \n    // 圈圈\n    CGFloat loadingCenterX = self.mj_w * 0.5;\n    if (!self.isRefreshingTitleHidden) {\n        loadingCenterX -= self.stateLabel.mj_textWith * 0.5 + self.labelLeftInset;\n    }\n    CGFloat loadingCenterY = self.mj_h * 0.5;\n    self.loadingView.center = CGPointMake(loadingCenterX, loadingCenterY);\n}\n\n- (void)setState:(MJRefreshState)state\n{\n    MJRefreshCheckState\n    \n    // 根据状态做事情\n    if (state == MJRefreshStateNoMoreData || state == MJRefreshStateIdle) {\n        [self.loadingView stopAnimating];\n    } else if (state == MJRefreshStateRefreshing) {\n        [self.loadingView startAnimating];\n    }\n}\n\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.h",
    "content": "//\n//  MJRefreshAutoStateFooter.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/6/13.\n//  Copyright © 2015年 小码哥. All rights reserved.\n//\n\n#import \"MJRefreshAutoFooter.h\"\n\n@interface MJRefreshAutoStateFooter : MJRefreshAutoFooter\n/** 文字距离圈圈、箭头的距离 */\n@property (assign, nonatomic) CGFloat labelLeftInset;\n/** 显示刷新状态的label */\n@property (weak, nonatomic, readonly) UILabel *stateLabel;\n\n/** 设置state状态下的文字 */\n- (void)setTitle:(NSString *)title forState:(MJRefreshState)state;\n\n/** 隐藏刷新状态的文字 */\n@property (assign, nonatomic, getter=isRefreshingTitleHidden) BOOL refreshingTitleHidden;\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.m",
    "content": "//\n//  MJRefreshAutoStateFooter.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/6/13.\n//  Copyright © 2015年 小码哥. All rights reserved.\n//\n\n#import \"MJRefreshAutoStateFooter.h\"\n\n@interface MJRefreshAutoStateFooter()\n{\n    /** 显示刷新状态的label */\n    __unsafe_unretained UILabel *_stateLabel;\n}\n/** 所有状态对应的文字 */\n@property (strong, nonatomic) NSMutableDictionary *stateTitles;\n@end\n\n@implementation MJRefreshAutoStateFooter\n#pragma mark - 懒加载\n- (NSMutableDictionary *)stateTitles\n{\n    if (!_stateTitles) {\n        self.stateTitles = [NSMutableDictionary dictionary];\n    }\n    return _stateTitles;\n}\n\n- (UILabel *)stateLabel\n{\n    if (!_stateLabel) {\n        [self addSubview:_stateLabel = [UILabel mj_label]];\n    }\n    return _stateLabel;\n}\n\n#pragma mark - 公共方法\n- (void)setTitle:(NSString *)title forState:(MJRefreshState)state\n{\n    if (title == nil) return;\n    self.stateTitles[@(state)] = title;\n    self.stateLabel.text = self.stateTitles[@(self.state)];\n}\n\n#pragma mark - 私有方法\n- (void)stateLabelClick\n{\n    if (self.state == MJRefreshStateIdle) {\n        [self beginRefreshing];\n    }\n}\n\n#pragma mark - 重写父类的方法\n- (void)prepare\n{\n    [super prepare];\n    \n    // 初始化间距\n    self.labelLeftInset = MJRefreshLabelLeftInset;\n    \n    // 初始化文字\n    [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshAutoFooterIdleText] forState:MJRefreshStateIdle];\n    [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshAutoFooterRefreshingText] forState:MJRefreshStateRefreshing];\n    [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshAutoFooterNoMoreDataText] forState:MJRefreshStateNoMoreData];\n    \n    // 监听label\n    self.stateLabel.userInteractionEnabled = YES;\n    [self.stateLabel addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(stateLabelClick)]];\n}\n\n- (void)placeSubviews\n{\n    [super placeSubviews];\n    \n    if (self.stateLabel.constraints.count) return;\n    \n    // 状态标签\n    self.stateLabel.frame = self.bounds;\n}\n\n- (void)setState:(MJRefreshState)state\n{\n    MJRefreshCheckState\n    \n    if (self.isRefreshingTitleHidden && state == MJRefreshStateRefreshing) {\n        self.stateLabel.text = nil;\n    } else {\n        self.stateLabel.text = self.stateTitles[@(state)];\n    }\n}\n@end"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.h",
    "content": "//\n//  MJRefreshBackGifFooter.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. All rights reserved.\n//\n\n#import \"MJRefreshBackStateFooter.h\"\n\n@interface MJRefreshBackGifFooter : MJRefreshBackStateFooter\n@property (weak, nonatomic, readonly) UIImageView *gifView;\n\n/** 设置state状态下的动画图片images 动画持续时间duration*/\n- (void)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state;\n- (void)setImages:(NSArray *)images forState:(MJRefreshState)state;\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.m",
    "content": "//\n//  MJRefreshBackGifFooter.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. All rights reserved.\n//\n\n#import \"MJRefreshBackGifFooter.h\"\n\n@interface MJRefreshBackGifFooter()\n{\n    __unsafe_unretained UIImageView *_gifView;\n}\n/** 所有状态对应的动画图片 */\n@property (strong, nonatomic) NSMutableDictionary *stateImages;\n/** 所有状态对应的动画时间 */\n@property (strong, nonatomic) NSMutableDictionary *stateDurations;\n@end\n\n@implementation MJRefreshBackGifFooter\n#pragma mark - 懒加载\n- (UIImageView *)gifView\n{\n    if (!_gifView) {\n        UIImageView *gifView = [[UIImageView alloc] init];\n        [self addSubview:_gifView = gifView];\n    }\n    return _gifView;\n}\n\n- (NSMutableDictionary *)stateImages\n{\n    if (!_stateImages) {\n        self.stateImages = [NSMutableDictionary dictionary];\n    }\n    return _stateImages;\n}\n\n- (NSMutableDictionary *)stateDurations\n{\n    if (!_stateDurations) {\n        self.stateDurations = [NSMutableDictionary dictionary];\n    }\n    return _stateDurations;\n}\n\n#pragma mark - 公共方法\n- (void)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state\n{\n    if (images == nil) return;\n    \n    self.stateImages[@(state)] = images;\n    self.stateDurations[@(state)] = @(duration);\n    \n    /* 根据图片设置控件的高度 */\n    UIImage *image = [images firstObject];\n    if (image.size.height > self.mj_h) {\n        self.mj_h = image.size.height;\n    }\n}\n\n- (void)setImages:(NSArray *)images forState:(MJRefreshState)state\n{\n    [self setImages:images duration:images.count * 0.1 forState:state];\n}\n\n#pragma mark - 实现父类的方法\n- (void)prepare\n{\n    [super prepare];\n    \n    // 初始化间距\n    self.labelLeftInset = 20;\n}\n\n- (void)setPullingPercent:(CGFloat)pullingPercent\n{\n    [super setPullingPercent:pullingPercent];\n    NSArray *images = self.stateImages[@(MJRefreshStateIdle)];\n    if (self.state != MJRefreshStateIdle || images.count == 0) return;\n    [self.gifView stopAnimating];\n    NSUInteger index =  images.count * pullingPercent;\n    if (index >= images.count) index = images.count - 1;\n    self.gifView.image = images[index];\n}\n\n- (void)placeSubviews\n{\n    [super placeSubviews];\n    \n    if (self.gifView.constraints.count) return;\n    \n    self.gifView.frame = self.bounds;\n    if (self.stateLabel.hidden) {\n        self.gifView.contentMode = UIViewContentModeCenter;\n    } else {\n        self.gifView.contentMode = UIViewContentModeRight;\n        self.gifView.mj_w = self.mj_w * 0.5 - self.labelLeftInset - self.stateLabel.mj_textWith * 0.5;\n    }\n}\n\n- (void)setState:(MJRefreshState)state\n{\n    MJRefreshCheckState\n    \n    // 根据状态做事情\n    if (state == MJRefreshStatePulling || state == MJRefreshStateRefreshing) {\n        NSArray *images = self.stateImages[@(state)];\n        if (images.count == 0) return;\n        \n        self.gifView.hidden = NO;\n        [self.gifView stopAnimating];\n        if (images.count == 1) { // 单张图片\n            self.gifView.image = [images lastObject];\n        } else { // 多张图片\n            self.gifView.animationImages = images;\n            self.gifView.animationDuration = [self.stateDurations[@(state)] doubleValue];\n            [self.gifView startAnimating];\n        }\n    } else if (state == MJRefreshStateIdle) {\n        self.gifView.hidden = NO;\n    } else if (state == MJRefreshStateNoMoreData) {\n        self.gifView.hidden = YES;\n    }\n}\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.h",
    "content": "//\n//  MJRefreshBackNormalFooter.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. All rights reserved.\n//\n\n#import \"MJRefreshBackStateFooter.h\"\n\n@interface MJRefreshBackNormalFooter : MJRefreshBackStateFooter\n@property (weak, nonatomic, readonly) UIImageView *arrowView;\n/** 菊花的样式 */\n@property (assign, nonatomic) UIActivityIndicatorViewStyle activityIndicatorViewStyle;\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m",
    "content": "//\n//  MJRefreshBackNormalFooter.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. All rights reserved.\n//\n\n#import \"MJRefreshBackNormalFooter.h\"\n#import \"NSBundle+MJRefresh.h\"\n\n@interface MJRefreshBackNormalFooter()\n{\n    __unsafe_unretained UIImageView *_arrowView;\n}\n@property (weak, nonatomic) UIActivityIndicatorView *loadingView;\n@end\n\n@implementation MJRefreshBackNormalFooter\n#pragma mark - 懒加载子控件\n- (UIImageView *)arrowView\n{\n    if (!_arrowView) {\n        UIImageView *arrowView = [[UIImageView alloc] initWithImage:[NSBundle mj_arrowImage]];\n        [self addSubview:_arrowView = arrowView];\n    }\n    return _arrowView;\n}\n\n\n- (UIActivityIndicatorView *)loadingView\n{\n    if (!_loadingView) {\n        UIActivityIndicatorView *loadingView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:self.activityIndicatorViewStyle];\n        loadingView.hidesWhenStopped = YES;\n        [self addSubview:_loadingView = loadingView];\n    }\n    return _loadingView;\n}\n\n- (void)setActivityIndicatorViewStyle:(UIActivityIndicatorViewStyle)activityIndicatorViewStyle\n{\n    _activityIndicatorViewStyle = activityIndicatorViewStyle;\n    \n    self.loadingView = nil;\n    [self setNeedsLayout];\n}\n#pragma mark - 重写父类的方法\n- (void)prepare\n{\n    [super prepare];\n    \n    self.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray;\n}\n\n- (void)placeSubviews\n{\n    [super placeSubviews];\n    \n    // 箭头的中心点\n    CGFloat arrowCenterX = self.mj_w * 0.5;\n    if (!self.stateLabel.hidden) {\n        arrowCenterX -= self.labelLeftInset + self.stateLabel.mj_textWith * 0.5;\n    }\n    CGFloat arrowCenterY = self.mj_h * 0.5;\n    CGPoint arrowCenter = CGPointMake(arrowCenterX, arrowCenterY);\n    \n    // 箭头\n    if (self.arrowView.constraints.count == 0) {\n        self.arrowView.mj_size = self.arrowView.image.size;\n        self.arrowView.center = arrowCenter;\n    }\n    \n    // 圈圈\n    if (self.loadingView.constraints.count == 0) {\n        self.loadingView.center = arrowCenter;\n    }\n    \n    self.arrowView.tintColor = self.stateLabel.textColor;\n}\n\n- (void)setState:(MJRefreshState)state\n{\n    MJRefreshCheckState\n    \n    // 根据状态做事情\n    if (state == MJRefreshStateIdle) {\n        if (oldState == MJRefreshStateRefreshing) {\n            self.arrowView.transform = CGAffineTransformMakeRotation(0.000001 - M_PI);\n            [UIView animateWithDuration:MJRefreshSlowAnimationDuration animations:^{\n                self.loadingView.alpha = 0.0;\n            } completion:^(BOOL finished) {\n                self.loadingView.alpha = 1.0;\n                [self.loadingView stopAnimating];\n                \n                self.arrowView.hidden = NO;\n            }];\n        } else {\n            self.arrowView.hidden = NO;\n            [self.loadingView stopAnimating];\n            [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{\n                self.arrowView.transform = CGAffineTransformMakeRotation(0.000001 - M_PI);\n            }];\n        }\n    } else if (state == MJRefreshStatePulling) {\n        self.arrowView.hidden = NO;\n        [self.loadingView stopAnimating];\n        [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{\n            self.arrowView.transform = CGAffineTransformIdentity;\n        }];\n    } else if (state == MJRefreshStateRefreshing) {\n        self.arrowView.hidden = YES;\n        [self.loadingView startAnimating];\n    } else if (state == MJRefreshStateNoMoreData) {\n        self.arrowView.hidden = YES;\n        [self.loadingView stopAnimating];\n    }\n}\n\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.h",
    "content": "//\n//  MJRefreshBackStateFooter.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/6/13.\n//  Copyright © 2015年 小码哥. All rights reserved.\n//\n\n#import \"MJRefreshBackFooter.h\"\n\n@interface MJRefreshBackStateFooter : MJRefreshBackFooter\n/** 文字距离圈圈、箭头的距离 */\n@property (assign, nonatomic) CGFloat labelLeftInset;\n/** 显示刷新状态的label */\n@property (weak, nonatomic, readonly) UILabel *stateLabel;\n/** 设置state状态下的文字 */\n- (void)setTitle:(NSString *)title forState:(MJRefreshState)state;\n\n/** 获取state状态下的title */\n- (NSString *)titleForState:(MJRefreshState)state;\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m",
    "content": "//\n//  MJRefreshBackStateFooter.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/6/13.\n//  Copyright © 2015年 小码哥. All rights reserved.\n//\n\n#import \"MJRefreshBackStateFooter.h\"\n\n@interface MJRefreshBackStateFooter()\n{\n    /** 显示刷新状态的label */\n    __unsafe_unretained UILabel *_stateLabel;\n}\n/** 所有状态对应的文字 */\n@property (strong, nonatomic) NSMutableDictionary *stateTitles;\n@end\n\n@implementation MJRefreshBackStateFooter\n#pragma mark - 懒加载\n- (NSMutableDictionary *)stateTitles\n{\n    if (!_stateTitles) {\n        self.stateTitles = [NSMutableDictionary dictionary];\n    }\n    return _stateTitles;\n}\n\n- (UILabel *)stateLabel\n{\n    if (!_stateLabel) {\n        [self addSubview:_stateLabel = [UILabel mj_label]];\n    }\n    return _stateLabel;\n}\n\n#pragma mark - 公共方法\n- (void)setTitle:(NSString *)title forState:(MJRefreshState)state\n{\n    if (title == nil) return;\n    self.stateTitles[@(state)] = title;\n    self.stateLabel.text = self.stateTitles[@(self.state)];\n}\n\n- (NSString *)titleForState:(MJRefreshState)state {\n  return self.stateTitles[@(state)];\n}\n\n#pragma mark - 重写父类的方法\n- (void)prepare\n{\n    [super prepare];\n    \n    // 初始化间距\n    self.labelLeftInset = MJRefreshLabelLeftInset;\n    \n    // 初始化文字\n    [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshBackFooterIdleText] forState:MJRefreshStateIdle];\n    [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshBackFooterPullingText] forState:MJRefreshStatePulling];\n    [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshBackFooterRefreshingText] forState:MJRefreshStateRefreshing];\n    [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshBackFooterNoMoreDataText] forState:MJRefreshStateNoMoreData];\n}\n\n- (void)placeSubviews\n{\n    [super placeSubviews];\n    \n    if (self.stateLabel.constraints.count) return;\n    \n    // 状态标签\n    self.stateLabel.frame = self.bounds;\n}\n\n- (void)setState:(MJRefreshState)state\n{\n    MJRefreshCheckState\n    \n    // 设置状态文字\n    self.stateLabel.text = self.stateTitles[@(state)];\n}\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshGifHeader.h",
    "content": "//\n//  MJRefreshGifHeader.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. All rights reserved.\n//\n\n#import \"MJRefreshStateHeader.h\"\n\n@interface MJRefreshGifHeader : MJRefreshStateHeader\n@property (weak, nonatomic, readonly) UIImageView *gifView;\n\n/** 设置state状态下的动画图片images 动画持续时间duration*/\n- (void)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state;\n- (void)setImages:(NSArray *)images forState:(MJRefreshState)state;\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshGifHeader.m",
    "content": "//\n//  MJRefreshGifHeader.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. All rights reserved.\n//\n\n#import \"MJRefreshGifHeader.h\"\n\n@interface MJRefreshGifHeader()\n{\n    __unsafe_unretained UIImageView *_gifView;\n}\n/** 所有状态对应的动画图片 */\n@property (strong, nonatomic) NSMutableDictionary *stateImages;\n/** 所有状态对应的动画时间 */\n@property (strong, nonatomic) NSMutableDictionary *stateDurations;\n@end\n\n@implementation MJRefreshGifHeader\n#pragma mark - 懒加载\n- (UIImageView *)gifView\n{\n    if (!_gifView) { \n        UIImageView *gifView = [[UIImageView alloc] init]; \n        [self addSubview:_gifView = gifView]; \n    } \n    return _gifView; \n}\n\n- (NSMutableDictionary *)stateImages \n{ \n    if (!_stateImages) { \n        self.stateImages = [NSMutableDictionary dictionary]; \n    } \n    return _stateImages; \n}\n\n- (NSMutableDictionary *)stateDurations \n{ \n    if (!_stateDurations) { \n        self.stateDurations = [NSMutableDictionary dictionary]; \n    } \n    return _stateDurations; \n}\n\n#pragma mark - 公共方法\n- (void)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state \n{ \n    if (images == nil) return; \n    \n    self.stateImages[@(state)] = images; \n    self.stateDurations[@(state)] = @(duration); \n    \n    /* 根据图片设置控件的高度 */ \n    UIImage *image = [images firstObject]; \n    if (image.size.height > self.mj_h) { \n        self.mj_h = image.size.height; \n    } \n}\n\n- (void)setImages:(NSArray *)images forState:(MJRefreshState)state \n{ \n    [self setImages:images duration:images.count * 0.1 forState:state]; \n}\n\n#pragma mark - 实现父类的方法\n- (void)prepare\n{\n    [super prepare];\n    \n    // 初始化间距\n    self.labelLeftInset = 20;\n}\n\n- (void)setPullingPercent:(CGFloat)pullingPercent\n{\n    [super setPullingPercent:pullingPercent];\n    NSArray *images = self.stateImages[@(MJRefreshStateIdle)];\n    if (self.state != MJRefreshStateIdle || images.count == 0) return;\n    // 停止动画\n    [self.gifView stopAnimating];\n    // 设置当前需要显示的图片\n    NSUInteger index =  images.count * pullingPercent;\n    if (index >= images.count) index = images.count - 1;\n    self.gifView.image = images[index];\n}\n\n- (void)placeSubviews\n{\n    [super placeSubviews];\n    \n    if (self.gifView.constraints.count) return;\n    \n    self.gifView.frame = self.bounds;\n    if (self.stateLabel.hidden && self.lastUpdatedTimeLabel.hidden) {\n        self.gifView.contentMode = UIViewContentModeCenter;\n    } else {\n        self.gifView.contentMode = UIViewContentModeRight;\n        \n        CGFloat stateWidth = self.stateLabel.mj_textWith;\n        CGFloat timeWidth = 0.0;\n        if (!self.lastUpdatedTimeLabel.hidden) {\n            timeWidth = self.lastUpdatedTimeLabel.mj_textWith;\n        }\n        CGFloat textWidth = MAX(stateWidth, timeWidth);\n        self.gifView.mj_w = self.mj_w * 0.5 - textWidth * 0.5 - self.labelLeftInset;\n    }\n}\n\n- (void)setState:(MJRefreshState)state\n{\n    MJRefreshCheckState\n    \n    // 根据状态做事情\n    if (state == MJRefreshStatePulling || state == MJRefreshStateRefreshing) {\n        NSArray *images = self.stateImages[@(state)];\n        if (images.count == 0) return;\n        \n        [self.gifView stopAnimating];\n        if (images.count == 1) { // 单张图片\n            self.gifView.image = [images lastObject];\n        } else { // 多张图片\n            self.gifView.animationImages = images;\n            self.gifView.animationDuration = [self.stateDurations[@(state)] doubleValue];\n            [self.gifView startAnimating];\n        }\n    } else if (state == MJRefreshStateIdle) {\n        [self.gifView stopAnimating];\n    }\n}\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshNormalHeader.h",
    "content": "//\n//  MJRefreshNormalHeader.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. All rights reserved.\n//\n\n#import \"MJRefreshStateHeader.h\"\n\n@interface MJRefreshNormalHeader : MJRefreshStateHeader\n@property (weak, nonatomic, readonly) UIImageView *arrowView;\n/** 菊花的样式 */\n@property (assign, nonatomic) UIActivityIndicatorViewStyle activityIndicatorViewStyle;\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshNormalHeader.m",
    "content": "//\n//  MJRefreshNormalHeader.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. All rights reserved.\n//\n\n#import \"MJRefreshNormalHeader.h\"\n#import \"NSBundle+MJRefresh.h\"\n\n@interface MJRefreshNormalHeader()\n{\n    __unsafe_unretained UIImageView *_arrowView;\n}\n@property (weak, nonatomic) UIActivityIndicatorView *loadingView;\n@end\n\n@implementation MJRefreshNormalHeader\n#pragma mark - 懒加载子控件\n- (UIImageView *)arrowView\n{\n    if (!_arrowView) {\n        UIImageView *arrowView = [[UIImageView alloc] initWithImage:[NSBundle mj_arrowImage]];\n        [self addSubview:_arrowView = arrowView];\n    }\n    return _arrowView;\n}\n\n- (UIActivityIndicatorView *)loadingView\n{\n    if (!_loadingView) {\n        UIActivityIndicatorView *loadingView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:self.activityIndicatorViewStyle];\n        loadingView.hidesWhenStopped = YES;\n        [self addSubview:_loadingView = loadingView];\n    }\n    return _loadingView;\n}\n\n#pragma mark - 公共方法\n- (void)setActivityIndicatorViewStyle:(UIActivityIndicatorViewStyle)activityIndicatorViewStyle\n{\n    _activityIndicatorViewStyle = activityIndicatorViewStyle;\n    \n    self.loadingView = nil;\n    [self setNeedsLayout];\n}\n\n#pragma mark - 重写父类的方法\n- (void)prepare\n{\n    [super prepare];\n    \n    self.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray;\n}\n\n- (void)placeSubviews\n{\n    [super placeSubviews];\n    \n    // 箭头的中心点\n    CGFloat arrowCenterX = self.mj_w * 0.5;\n    if (!self.stateLabel.hidden) {\n        CGFloat stateWidth = self.stateLabel.mj_textWith;\n        CGFloat timeWidth = 0.0;\n        if (!self.lastUpdatedTimeLabel.hidden) {\n            timeWidth = self.lastUpdatedTimeLabel.mj_textWith;\n        }\n        CGFloat textWidth = MAX(stateWidth, timeWidth);\n        arrowCenterX -= textWidth / 2 + self.labelLeftInset;\n    }\n    CGFloat arrowCenterY = self.mj_h * 0.5;\n    CGPoint arrowCenter = CGPointMake(arrowCenterX, arrowCenterY);\n    \n    // 箭头\n    if (self.arrowView.constraints.count == 0) {\n        self.arrowView.mj_size = self.arrowView.image.size;\n        self.arrowView.center = arrowCenter;\n    }\n        \n    // 圈圈\n    if (self.loadingView.constraints.count == 0) {\n        self.loadingView.center = arrowCenter;\n    }\n    \n    self.arrowView.tintColor = self.stateLabel.textColor;\n}\n\n- (void)setState:(MJRefreshState)state\n{\n    MJRefreshCheckState\n    \n    // 根据状态做事情\n    if (state == MJRefreshStateIdle) {\n        if (oldState == MJRefreshStateRefreshing) {\n            self.arrowView.transform = CGAffineTransformIdentity;\n            \n            [UIView animateWithDuration:MJRefreshSlowAnimationDuration animations:^{\n                self.loadingView.alpha = 0.0;\n            } completion:^(BOOL finished) {\n                // 如果执行完动画发现不是idle状态，就直接返回，进入其他状态\n                if (self.state != MJRefreshStateIdle) return;\n                \n                self.loadingView.alpha = 1.0;\n                [self.loadingView stopAnimating];\n                self.arrowView.hidden = NO;\n            }];\n        } else {\n            [self.loadingView stopAnimating];\n            self.arrowView.hidden = NO;\n            [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{\n                self.arrowView.transform = CGAffineTransformIdentity;\n            }];\n        }\n    } else if (state == MJRefreshStatePulling) {\n        [self.loadingView stopAnimating];\n        self.arrowView.hidden = NO;\n        [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{\n            self.arrowView.transform = CGAffineTransformMakeRotation(0.000001 - M_PI);\n        }];\n    } else if (state == MJRefreshStateRefreshing) {\n        self.loadingView.alpha = 1.0; // 防止refreshing -> idle的动画完毕动作没有被执行\n        [self.loadingView startAnimating];\n        self.arrowView.hidden = YES;\n    }\n}\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshStateHeader.h",
    "content": "//\n//  MJRefreshStateHeader.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. All rights reserved.\n//\n\n#import \"MJRefreshHeader.h\"\n\n@interface MJRefreshStateHeader : MJRefreshHeader\n#pragma mark - 刷新时间相关\n/** 利用这个block来决定显示的更新时间文字 */\n@property (copy, nonatomic) NSString *(^lastUpdatedTimeText)(NSDate *lastUpdatedTime);\n/** 显示上一次刷新时间的label */\n@property (weak, nonatomic, readonly) UILabel *lastUpdatedTimeLabel;\n\n#pragma mark - 状态相关\n/** 文字距离圈圈、箭头的距离 */\n@property (assign, nonatomic) CGFloat labelLeftInset;\n/** 显示刷新状态的label */\n@property (weak, nonatomic, readonly) UILabel *stateLabel;\n/** 设置state状态下的文字 */\n- (void)setTitle:(NSString *)title forState:(MJRefreshState)state;\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/Custom/Header/MJRefreshStateHeader.m",
    "content": "//\n//  MJRefreshStateHeader.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/4/24.\n//  Copyright (c) 2015年 小码哥. All rights reserved.\n//\n\n#import \"MJRefreshStateHeader.h\"\n\n@interface MJRefreshStateHeader()\n{\n    /** 显示上一次刷新时间的label */\n    __unsafe_unretained UILabel *_lastUpdatedTimeLabel;\n    /** 显示刷新状态的label */\n    __unsafe_unretained UILabel *_stateLabel;\n}\n/** 所有状态对应的文字 */\n@property (strong, nonatomic) NSMutableDictionary *stateTitles;\n@end\n\n@implementation MJRefreshStateHeader\n#pragma mark - 懒加载\n- (NSMutableDictionary *)stateTitles\n{\n    if (!_stateTitles) {\n        self.stateTitles = [NSMutableDictionary dictionary];\n    }\n    return _stateTitles;\n}\n\n- (UILabel *)stateLabel\n{\n    if (!_stateLabel) {\n        [self addSubview:_stateLabel = [UILabel mj_label]];\n    }\n    return _stateLabel;\n}\n\n- (UILabel *)lastUpdatedTimeLabel\n{\n    if (!_lastUpdatedTimeLabel) {\n        [self addSubview:_lastUpdatedTimeLabel = [UILabel mj_label]];\n    }\n    return _lastUpdatedTimeLabel;\n}\n\n#pragma mark - 公共方法\n- (void)setTitle:(NSString *)title forState:(MJRefreshState)state\n{\n    if (title == nil) return;\n    self.stateTitles[@(state)] = title;\n    self.stateLabel.text = self.stateTitles[@(self.state)];\n}\n\n#pragma mark - 日历获取在9.x之后的系统使用currentCalendar会出异常。在8.0之后使用系统新API。\n- (NSCalendar *)currentCalendar {\n    if ([NSCalendar respondsToSelector:@selector(calendarWithIdentifier:)]) {\n        return [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];\n    }\n    return [NSCalendar currentCalendar];\n}\n\n#pragma mark key的处理\n- (void)setLastUpdatedTimeKey:(NSString *)lastUpdatedTimeKey\n{\n    [super setLastUpdatedTimeKey:lastUpdatedTimeKey];\n    \n    // 如果label隐藏了，就不用再处理\n    if (self.lastUpdatedTimeLabel.hidden) return;\n    \n    NSDate *lastUpdatedTime = [[NSUserDefaults standardUserDefaults] objectForKey:lastUpdatedTimeKey];\n    \n    // 如果有block\n    if (self.lastUpdatedTimeText) {\n        self.lastUpdatedTimeLabel.text = self.lastUpdatedTimeText(lastUpdatedTime);\n        return;\n    }\n    \n    if (lastUpdatedTime) {\n        // 1.获得年月日\n        NSCalendar *calendar = [self currentCalendar];\n        NSUInteger unitFlags = NSCalendarUnitYear| NSCalendarUnitMonth | NSCalendarUnitDay |NSCalendarUnitHour |NSCalendarUnitMinute;\n        NSDateComponents *cmp1 = [calendar components:unitFlags fromDate:lastUpdatedTime];\n        NSDateComponents *cmp2 = [calendar components:unitFlags fromDate:[NSDate date]];\n        \n        // 2.格式化日期\n        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];\n        BOOL isToday = NO;\n        if ([cmp1 day] == [cmp2 day]) { // 今天\n            formatter.dateFormat = @\" HH:mm\";\n            isToday = YES;\n        } else if ([cmp1 year] == [cmp2 year]) { // 今年\n            formatter.dateFormat = @\"MM-dd HH:mm\";\n        } else {\n            formatter.dateFormat = @\"yyyy-MM-dd HH:mm\";\n        }\n        NSString *time = [formatter stringFromDate:lastUpdatedTime];\n        \n        // 3.显示日期\n        self.lastUpdatedTimeLabel.text = [NSString stringWithFormat:@\"%@%@%@\",\n                                          [NSBundle mj_localizedStringForKey:MJRefreshHeaderLastTimeText],\n                                          isToday ? [NSBundle mj_localizedStringForKey:MJRefreshHeaderDateTodayText] : @\"\",\n                                          time];\n    } else {\n        self.lastUpdatedTimeLabel.text = [NSString stringWithFormat:@\"%@%@\",\n                                          [NSBundle mj_localizedStringForKey:MJRefreshHeaderLastTimeText],\n                                          [NSBundle mj_localizedStringForKey:MJRefreshHeaderNoneLastDateText]];\n    }\n}\n\n#pragma mark - 覆盖父类的方法\n- (void)prepare\n{\n    [super prepare];\n    \n    // 初始化间距\n    self.labelLeftInset = MJRefreshLabelLeftInset;\n    \n    // 初始化文字\n    [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshHeaderIdleText] forState:MJRefreshStateIdle];\n    [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshHeaderPullingText] forState:MJRefreshStatePulling];\n    [self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshHeaderRefreshingText] forState:MJRefreshStateRefreshing];\n}\n\n- (void)placeSubviews\n{\n    [super placeSubviews];\n    \n    if (self.stateLabel.hidden) return;\n    \n    BOOL noConstrainsOnStatusLabel = self.stateLabel.constraints.count == 0;\n    \n    if (self.lastUpdatedTimeLabel.hidden) {\n        // 状态\n        if (noConstrainsOnStatusLabel) {\n            self.stateLabel.frame = self.bounds;\n        }\n    } else {\n        CGFloat stateLabelH = self.mj_h * 0.5;\n        // 状态\n        if (noConstrainsOnStatusLabel) {\n            self.stateLabel.mj_x = 0;\n            self.stateLabel.mj_y = 0;\n            self.stateLabel.mj_w = self.mj_w;\n            self.stateLabel.mj_h = stateLabelH;\n        }\n        \n        // 更新时间\n        if (self.lastUpdatedTimeLabel.constraints.count == 0) {\n            self.lastUpdatedTimeLabel.mj_x = 0;\n            self.lastUpdatedTimeLabel.mj_y = stateLabelH;\n            self.lastUpdatedTimeLabel.mj_w = self.mj_w;\n            self.lastUpdatedTimeLabel.mj_h = self.mj_h - self.lastUpdatedTimeLabel.mj_y;\n        }\n    }\n}\n\n- (void)setState:(MJRefreshState)state\n{\n    MJRefreshCheckState\n    \n    // 设置状态文字\n    self.stateLabel.text = self.stateTitles[@(state)];\n    \n    // 重新设置key（重新显示时间）\n    self.lastUpdatedTimeKey = self.lastUpdatedTimeKey;\n}\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/MJRefresh.bundle/zh-Hant.lproj/Localizable.strings",
    "content": "\"MJRefreshHeaderIdleText\" = \"下拉可以刷新\";\n\"MJRefreshHeaderPullingText\" = \"鬆開立即刷新\";\n\"MJRefreshHeaderRefreshingText\" = \"正在刷新數據中...\";\n\n\"MJRefreshAutoFooterIdleText\" = \"點擊或上拉加載更多\";\n\"MJRefreshAutoFooterRefreshingText\" = \"正在加載更多的數據...\";\n\"MJRefreshAutoFooterNoMoreDataText\" = \"已經全部加載完畢\";\n\n\"MJRefreshBackFooterIdleText\" = \"上拉可以加載更多\";\n\"MJRefreshBackFooterPullingText\" = \"鬆開立即加載更多\";\n\"MJRefreshBackFooterRefreshingText\" = \"正在加載更多的數據...\";\n\"MJRefreshBackFooterNoMoreDataText\" = \"已經全部加載完畢\";\n\n\"MJRefreshHeaderLastTimeText\" = \"最後更新：\";\n\"MJRefreshHeaderDateTodayText\" = \"今天\";\n\"MJRefreshHeaderNoneLastDateText\" = \"無記錄\";\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/MJRefresh.h",
    "content": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000\n\n#import \"UIScrollView+MJRefresh.h\"\n#import \"UIScrollView+MJExtension.h\"\n#import \"UIView+MJExtension.h\"\n\n#import \"MJRefreshNormalHeader.h\"\n#import \"MJRefreshGifHeader.h\"\n\n#import \"MJRefreshBackNormalFooter.h\"\n#import \"MJRefreshBackGifFooter.h\"\n#import \"MJRefreshAutoNormalFooter.h\"\n#import \"MJRefreshAutoGifFooter.h\""
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/MJRefreshConst.h",
    "content": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000\n#import <UIKit/UIKit.h>\n#import <objc/message.h>\n\n// 弱引用\n#define MJWeakSelf __weak typeof(self) weakSelf = self;\n\n// 日志输出\n#ifdef DEBUG\n#define MJRefreshLog(...) NSLog(__VA_ARGS__)\n#else\n#define MJRefreshLog(...)\n#endif\n\n// 过期提醒\n#define MJRefreshDeprecated(instead) NS_DEPRECATED(2_0, 2_0, 2_0, 2_0, instead)\n\n// 运行时objc_msgSend\n#define MJRefreshMsgSend(...) ((void (*)(void *, SEL, UIView *))objc_msgSend)(__VA_ARGS__)\n#define MJRefreshMsgTarget(target) (__bridge void *)(target)\n\n// RGB颜色\n#define MJRefreshColor(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0]\n\n// 文字颜色\n#define MJRefreshLabelTextColor MJRefreshColor(90, 90, 90)\n\n// 字体大小\n#define MJRefreshLabelFont [UIFont boldSystemFontOfSize:14]\n\n// 常量\nUIKIT_EXTERN const CGFloat MJRefreshLabelLeftInset;\nUIKIT_EXTERN const CGFloat MJRefreshHeaderHeight;\nUIKIT_EXTERN const CGFloat MJRefreshFooterHeight;\nUIKIT_EXTERN const CGFloat MJRefreshFastAnimationDuration;\nUIKIT_EXTERN const CGFloat MJRefreshSlowAnimationDuration;\n\nUIKIT_EXTERN NSString *const MJRefreshKeyPathContentOffset;\nUIKIT_EXTERN NSString *const MJRefreshKeyPathContentSize;\nUIKIT_EXTERN NSString *const MJRefreshKeyPathContentInset;\nUIKIT_EXTERN NSString *const MJRefreshKeyPathPanState;\n\nUIKIT_EXTERN NSString *const MJRefreshHeaderLastUpdatedTimeKey;\n\nUIKIT_EXTERN NSString *const MJRefreshHeaderIdleText;\nUIKIT_EXTERN NSString *const MJRefreshHeaderPullingText;\nUIKIT_EXTERN NSString *const MJRefreshHeaderRefreshingText;\n\nUIKIT_EXTERN NSString *const MJRefreshAutoFooterIdleText;\nUIKIT_EXTERN NSString *const MJRefreshAutoFooterRefreshingText;\nUIKIT_EXTERN NSString *const MJRefreshAutoFooterNoMoreDataText;\n\nUIKIT_EXTERN NSString *const MJRefreshBackFooterIdleText;\nUIKIT_EXTERN NSString *const MJRefreshBackFooterPullingText;\nUIKIT_EXTERN NSString *const MJRefreshBackFooterRefreshingText;\nUIKIT_EXTERN NSString *const MJRefreshBackFooterNoMoreDataText;\n\nUIKIT_EXTERN NSString *const MJRefreshHeaderLastTimeText;\nUIKIT_EXTERN NSString *const MJRefreshHeaderDateTodayText;\nUIKIT_EXTERN NSString *const MJRefreshHeaderNoneLastDateText;\n\n// 状态检查\n#define MJRefreshCheckState \\\nMJRefreshState oldState = self.state; \\\nif (state == oldState) return; \\\n[super setState:state];\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/MJRefreshConst.m",
    "content": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000\n#import <UIKit/UIKit.h>\n\nconst CGFloat MJRefreshLabelLeftInset = 25;\nconst CGFloat MJRefreshHeaderHeight = 54.0;\nconst CGFloat MJRefreshFooterHeight = 44.0;\nconst CGFloat MJRefreshFastAnimationDuration = 0.25;\nconst CGFloat MJRefreshSlowAnimationDuration = 0.4;\n\nNSString *const MJRefreshKeyPathContentOffset = @\"contentOffset\";\nNSString *const MJRefreshKeyPathContentInset = @\"contentInset\";\nNSString *const MJRefreshKeyPathContentSize = @\"contentSize\";\nNSString *const MJRefreshKeyPathPanState = @\"state\";\n\nNSString *const MJRefreshHeaderLastUpdatedTimeKey = @\"MJRefreshHeaderLastUpdatedTimeKey\";\n\nNSString *const MJRefreshHeaderIdleText = @\"MJRefreshHeaderIdleText\";\nNSString *const MJRefreshHeaderPullingText = @\"MJRefreshHeaderPullingText\";\nNSString *const MJRefreshHeaderRefreshingText = @\"MJRefreshHeaderRefreshingText\";\n\nNSString *const MJRefreshAutoFooterIdleText = @\"MJRefreshAutoFooterIdleText\";\nNSString *const MJRefreshAutoFooterRefreshingText = @\"MJRefreshAutoFooterRefreshingText\";\nNSString *const MJRefreshAutoFooterNoMoreDataText = @\"MJRefreshAutoFooterNoMoreDataText\";\n\nNSString *const MJRefreshBackFooterIdleText = @\"MJRefreshBackFooterIdleText\";\nNSString *const MJRefreshBackFooterPullingText = @\"MJRefreshBackFooterPullingText\";\nNSString *const MJRefreshBackFooterRefreshingText = @\"MJRefreshBackFooterRefreshingText\";\nNSString *const MJRefreshBackFooterNoMoreDataText = @\"MJRefreshBackFooterNoMoreDataText\";\n\nNSString *const MJRefreshHeaderLastTimeText = @\"MJRefreshHeaderLastTimeText\";\nNSString *const MJRefreshHeaderDateTodayText = @\"MJRefreshHeaderDateTodayText\";\nNSString *const MJRefreshHeaderNoneLastDateText = @\"MJRefreshHeaderNoneLastDateText\";"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/NSBundle+MJRefresh.h",
    "content": "//\n//  NSBundle+MJRefresh.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 16/6/13.\n//  Copyright © 2016年 小码哥. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface NSBundle (MJRefresh)\n+ (instancetype)mj_refreshBundle;\n+ (UIImage *)mj_arrowImage;\n+ (NSString *)mj_localizedStringForKey:(NSString *)key value:(NSString *)value;\n+ (NSString *)mj_localizedStringForKey:(NSString *)key;\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/NSBundle+MJRefresh.m",
    "content": "//\n//  NSBundle+MJRefresh.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 16/6/13.\n//  Copyright © 2016年 小码哥. All rights reserved.\n//\n\n#import \"NSBundle+MJRefresh.h\"\n#import \"MJRefreshComponent.h\"\n\n@implementation NSBundle (MJRefresh)\n+ (instancetype)mj_refreshBundle\n{\n    static NSBundle *refreshBundle = nil;\n    if (refreshBundle == nil) {\n        // 这里不使用mainBundle是为了适配pod 1.x和0.x\n        refreshBundle = [NSBundle bundleWithPath:[[NSBundle bundleForClass:[MJRefreshComponent class]] pathForResource:@\"MJRefresh\" ofType:@\"bundle\"]];\n    }\n    return refreshBundle;\n}\n\n+ (UIImage *)mj_arrowImage\n{\n    static UIImage *arrowImage = nil;\n    if (arrowImage == nil) {\n        arrowImage = [[UIImage imageWithContentsOfFile:[[self mj_refreshBundle] pathForResource:@\"arrow@2x\" ofType:@\"png\"]] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];\n    }\n    return arrowImage;\n}\n\n+ (NSString *)mj_localizedStringForKey:(NSString *)key\n{\n    return [self mj_localizedStringForKey:key value:nil];\n}\n\n+ (NSString *)mj_localizedStringForKey:(NSString *)key value:(NSString *)value\n{\n    static NSBundle *bundle = nil;\n    if (bundle == nil) {\n        // （iOS获取的语言字符串比较不稳定）目前框架只处理en、zh-Hans、zh-Hant三种情况，其他按照系统默认处理\n        NSString *language = [NSLocale preferredLanguages].firstObject;\n        if ([language hasPrefix:@\"en\"]) {\n            language = @\"en\";\n        } else if ([language hasPrefix:@\"zh\"]) {\n            if ([language rangeOfString:@\"Hans\"].location != NSNotFound) {\n                language = @\"zh-Hans\"; // 简体中文\n            } else { // zh-Hant\\zh-HK\\zh-TW\n                language = @\"zh-Hant\"; // 繁體中文\n            }\n        } else {\n            language = @\"en\";\n        }\n        \n        // 从MJRefresh.bundle中查找资源\n        bundle = [NSBundle bundleWithPath:[[NSBundle mj_refreshBundle] pathForResource:language ofType:@\"lproj\"]];\n    }\n    value = [bundle localizedStringForKey:key value:value table:nil];\n    return [[NSBundle mainBundle] localizedStringForKey:key value:value table:nil];\n}\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.h",
    "content": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000\n//  UIScrollView+Extension.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 14-5-28.\n//  Copyright (c) 2014年 小码哥. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface UIScrollView (MJExtension)\n@property (readonly, nonatomic) UIEdgeInsets mj_inset;\n\n@property (assign, nonatomic) CGFloat mj_insetT;\n@property (assign, nonatomic) CGFloat mj_insetB;\n@property (assign, nonatomic) CGFloat mj_insetL;\n@property (assign, nonatomic) CGFloat mj_insetR;\n\n@property (assign, nonatomic) CGFloat mj_offsetX;\n@property (assign, nonatomic) CGFloat mj_offsetY;\n\n@property (assign, nonatomic) CGFloat mj_contentW;\n@property (assign, nonatomic) CGFloat mj_contentH;\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/UIScrollView+MJExtension.m",
    "content": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000\n//  UIScrollView+Extension.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 14-5-28.\n//  Copyright (c) 2014年 小码哥. All rights reserved.\n//\n\n#import \"UIScrollView+MJExtension.h\"\n#import <objc/runtime.h>\n\n#define SYSTEM_VERSION_GREATER_NOT_LESS_THAN(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)\n\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wunguarded-availability-new\"\n\n@implementation UIScrollView (MJExtension)\n\n- (UIEdgeInsets)mj_inset\n{\n#ifdef __IPHONE_11_0\n    if (SYSTEM_VERSION_GREATER_NOT_LESS_THAN(@\"11.0\")) {\n        return self.adjustedContentInset;\n    }\n#endif\n    return self.contentInset;\n}\n\n- (void)setMj_insetT:(CGFloat)mj_insetT\n{\n    UIEdgeInsets inset = self.contentInset;\n    inset.top = mj_insetT;\n#ifdef __IPHONE_11_0\n    if (SYSTEM_VERSION_GREATER_NOT_LESS_THAN(@\"11.0\")) {\n        inset.top -= (self.adjustedContentInset.top - self.contentInset.top);\n    }\n#endif\n    self.contentInset = inset;\n}\n\n- (CGFloat)mj_insetT\n{\n    return self.mj_inset.top;\n}\n\n- (void)setMj_insetB:(CGFloat)mj_insetB\n{\n    UIEdgeInsets inset = self.contentInset;\n    inset.bottom = mj_insetB;\n#ifdef __IPHONE_11_0\n    if (SYSTEM_VERSION_GREATER_NOT_LESS_THAN(@\"11.0\")) {\n        inset.bottom -= (self.adjustedContentInset.bottom - self.contentInset.bottom);\n    }\n#endif\n    self.contentInset = inset;\n}\n\n- (CGFloat)mj_insetB\n{\n    return self.mj_inset.bottom;\n}\n\n- (void)setMj_insetL:(CGFloat)mj_insetL\n{\n    UIEdgeInsets inset = self.contentInset;\n    inset.left = mj_insetL;\n#ifdef __IPHONE_11_0\n    if (SYSTEM_VERSION_GREATER_NOT_LESS_THAN(@\"11.0\")) {\n        inset.left -= (self.adjustedContentInset.left - self.contentInset.left);\n    }\n#endif\n    self.contentInset = inset;\n}\n\n- (CGFloat)mj_insetL\n{\n    return self.mj_inset.left;\n}\n\n- (void)setMj_insetR:(CGFloat)mj_insetR\n{\n    UIEdgeInsets inset = self.contentInset;\n    inset.right = mj_insetR;\n#ifdef __IPHONE_11_0\n    if (SYSTEM_VERSION_GREATER_NOT_LESS_THAN(@\"11.0\")) {\n        inset.right -= (self.adjustedContentInset.right - self.contentInset.right);\n    }\n#endif\n    self.contentInset = inset;\n}\n\n- (CGFloat)mj_insetR\n{\n    return self.mj_inset.right;\n}\n\n- (void)setMj_offsetX:(CGFloat)mj_offsetX\n{\n    CGPoint offset = self.contentOffset;\n    offset.x = mj_offsetX;\n    self.contentOffset = offset;\n}\n\n- (CGFloat)mj_offsetX\n{\n    return self.contentOffset.x;\n}\n\n- (void)setMj_offsetY:(CGFloat)mj_offsetY\n{\n    CGPoint offset = self.contentOffset;\n    offset.y = mj_offsetY;\n    self.contentOffset = offset;\n}\n\n- (CGFloat)mj_offsetY\n{\n    return self.contentOffset.y;\n}\n\n- (void)setMj_contentW:(CGFloat)mj_contentW\n{\n    CGSize size = self.contentSize;\n    size.width = mj_contentW;\n    self.contentSize = size;\n}\n\n- (CGFloat)mj_contentW\n{\n    return self.contentSize.width;\n}\n\n- (void)setMj_contentH:(CGFloat)mj_contentH\n{\n    CGSize size = self.contentSize;\n    size.height = mj_contentH;\n    self.contentSize = size;\n}\n\n- (CGFloat)mj_contentH\n{\n    return self.contentSize.height;\n}\n@end\n#pragma clang diagnostic pop\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.h",
    "content": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000\n//  UIScrollView+MJRefresh.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/3/4.\n//  Copyright (c) 2015年 小码哥. All rights reserved.\n//  给ScrollView增加下拉刷新、上拉刷新的功能\n\n#import <UIKit/UIKit.h>\n#import \"MJRefreshConst.h\"\n\n@class MJRefreshHeader, MJRefreshFooter;\n\n@interface UIScrollView (MJRefresh)\n/** 下拉刷新控件 */\n@property (strong, nonatomic) MJRefreshHeader *mj_header;\n@property (strong, nonatomic) MJRefreshHeader *header MJRefreshDeprecated(\"使用mj_header\");\n/** 上拉刷新控件 */\n@property (strong, nonatomic) MJRefreshFooter *mj_footer;\n@property (strong, nonatomic) MJRefreshFooter *footer MJRefreshDeprecated(\"使用mj_footer\");\n\n#pragma mark - other\n- (NSInteger)mj_totalDataCount;\n@property (copy, nonatomic) void (^mj_reloadDataBlock)(NSInteger totalDataCount);\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/UIScrollView+MJRefresh.m",
    "content": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000\n//  UIScrollView+MJRefresh.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 15/3/4.\n//  Copyright (c) 2015年 小码哥. All rights reserved.\n//\n\n#import \"UIScrollView+MJRefresh.h\"\n#import \"MJRefreshHeader.h\"\n#import \"MJRefreshFooter.h\"\n#import <objc/runtime.h>\n\n@implementation NSObject (MJRefresh)\n\n+ (void)exchangeInstanceMethod1:(SEL)method1 method2:(SEL)method2\n{\n    method_exchangeImplementations(class_getInstanceMethod(self, method1), class_getInstanceMethod(self, method2));\n}\n\n+ (void)exchangeClassMethod1:(SEL)method1 method2:(SEL)method2\n{\n    method_exchangeImplementations(class_getClassMethod(self, method1), class_getClassMethod(self, method2));\n}\n\n@end\n\n@implementation UIScrollView (MJRefresh)\n\n#pragma mark - header\nstatic const char MJRefreshHeaderKey = '\\0';\n- (void)setMj_header:(MJRefreshHeader *)mj_header\n{\n    if (mj_header != self.mj_header) {\n        // 删除旧的，添加新的\n        [self.mj_header removeFromSuperview];\n        [self insertSubview:mj_header atIndex:0];\n        \n        // 存储新的\n        [self willChangeValueForKey:@\"mj_header\"]; // KVO\n        objc_setAssociatedObject(self, &MJRefreshHeaderKey,\n                                 mj_header, OBJC_ASSOCIATION_ASSIGN);\n        [self didChangeValueForKey:@\"mj_header\"]; // KVO\n    }\n}\n\n- (MJRefreshHeader *)mj_header\n{\n    return objc_getAssociatedObject(self, &MJRefreshHeaderKey);\n}\n\n#pragma mark - footer\nstatic const char MJRefreshFooterKey = '\\0';\n- (void)setMj_footer:(MJRefreshFooter *)mj_footer\n{\n    if (mj_footer != self.mj_footer) {\n        // 删除旧的，添加新的\n        [self.mj_footer removeFromSuperview];\n        [self insertSubview:mj_footer atIndex:0];\n        \n        // 存储新的\n        [self willChangeValueForKey:@\"mj_footer\"]; // KVO\n        objc_setAssociatedObject(self, &MJRefreshFooterKey,\n                                 mj_footer, OBJC_ASSOCIATION_ASSIGN);\n        [self didChangeValueForKey:@\"mj_footer\"]; // KVO\n    }\n}\n\n- (MJRefreshFooter *)mj_footer\n{\n    return objc_getAssociatedObject(self, &MJRefreshFooterKey);\n}\n\n#pragma mark - 过期\n- (void)setFooter:(MJRefreshFooter *)footer\n{\n    self.mj_footer = footer;\n}\n\n- (MJRefreshFooter *)footer\n{\n    return self.mj_footer;\n}\n\n- (void)setHeader:(MJRefreshHeader *)header\n{\n    self.mj_header = header;\n}\n\n- (MJRefreshHeader *)header\n{\n    return self.mj_header;\n}\n\n#pragma mark - other\n- (NSInteger)mj_totalDataCount\n{\n    NSInteger totalCount = 0;\n    if ([self isKindOfClass:[UITableView class]]) {\n        UITableView *tableView = (UITableView *)self;\n        \n        for (NSInteger section = 0; section<tableView.numberOfSections; section++) {\n            totalCount += [tableView numberOfRowsInSection:section];\n        }\n    } else if ([self isKindOfClass:[UICollectionView class]]) {\n        UICollectionView *collectionView = (UICollectionView *)self;\n        \n        for (NSInteger section = 0; section<collectionView.numberOfSections; section++) {\n            totalCount += [collectionView numberOfItemsInSection:section];\n        }\n    }\n    return totalCount;\n}\n\nstatic const char MJRefreshReloadDataBlockKey = '\\0';\n- (void)setMj_reloadDataBlock:(void (^)(NSInteger))mj_reloadDataBlock\n{\n    [self willChangeValueForKey:@\"mj_reloadDataBlock\"]; // KVO\n    objc_setAssociatedObject(self, &MJRefreshReloadDataBlockKey, mj_reloadDataBlock, OBJC_ASSOCIATION_COPY_NONATOMIC);\n    [self didChangeValueForKey:@\"mj_reloadDataBlock\"]; // KVO\n}\n\n- (void (^)(NSInteger))mj_reloadDataBlock\n{\n    return objc_getAssociatedObject(self, &MJRefreshReloadDataBlockKey);\n}\n\n- (void)executeReloadDataBlock\n{\n    !self.mj_reloadDataBlock ? : self.mj_reloadDataBlock(self.mj_totalDataCount);\n}\n@end\n\n@implementation UITableView (MJRefresh)\n\n+ (void)load\n{\n    [self exchangeInstanceMethod1:@selector(reloadData) method2:@selector(mj_reloadData)];\n}\n\n- (void)mj_reloadData\n{\n    [self mj_reloadData];\n    \n    [self executeReloadDataBlock];\n}\n@end\n\n@implementation UICollectionView (MJRefresh)\n\n+ (void)load\n{\n    [self exchangeInstanceMethod1:@selector(reloadData) method2:@selector(mj_reloadData)];\n}\n\n- (void)mj_reloadData\n{\n    [self mj_reloadData];\n    \n    [self executeReloadDataBlock];\n}\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/UIView+MJExtension.h",
    "content": "// 代码地址: https://github.com/CoderMJLee/MJRefresh\n// 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000\n//  UIView+Extension.h\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 14-5-28.\n//  Copyright (c) 2014年 小码哥. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface UIView (MJExtension)\n@property (assign, nonatomic) CGFloat mj_x;\n@property (assign, nonatomic) CGFloat mj_y;\n@property (assign, nonatomic) CGFloat mj_w;\n@property (assign, nonatomic) CGFloat mj_h;\n@property (assign, nonatomic) CGSize mj_size;\n@property (assign, nonatomic) CGPoint mj_origin;\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/MJRefresh/UIView+MJExtension.m",
    "content": "//  代码地址: https://github.com/CoderMJLee/MJRefresh\n//  代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000\n//  UIView+Extension.m\n//  MJRefreshExample\n//\n//  Created by MJ Lee on 14-5-28.\n//  Copyright (c) 2014年 小码哥. All rights reserved.\n//\n\n#import \"UIView+MJExtension.h\"\n\n@implementation UIView (MJExtension)\n- (void)setMj_x:(CGFloat)mj_x\n{\n    CGRect frame = self.frame;\n    frame.origin.x = mj_x;\n    self.frame = frame;\n}\n\n- (CGFloat)mj_x\n{\n    return self.frame.origin.x;\n}\n\n- (void)setMj_y:(CGFloat)mj_y\n{\n    CGRect frame = self.frame;\n    frame.origin.y = mj_y;\n    self.frame = frame;\n}\n\n- (CGFloat)mj_y\n{\n    return self.frame.origin.y;\n}\n\n- (void)setMj_w:(CGFloat)mj_w\n{\n    CGRect frame = self.frame;\n    frame.size.width = mj_w;\n    self.frame = frame;\n}\n\n- (CGFloat)mj_w\n{\n    return self.frame.size.width;\n}\n\n- (void)setMj_h:(CGFloat)mj_h\n{\n    CGRect frame = self.frame;\n    frame.size.height = mj_h;\n    self.frame = frame;\n}\n\n- (CGFloat)mj_h\n{\n    return self.frame.size.height;\n}\n\n- (void)setMj_size:(CGSize)mj_size\n{\n    CGRect frame = self.frame;\n    frame.size = mj_size;\n    self.frame = frame;\n}\n\n- (CGSize)mj_size\n{\n    return self.frame.size;\n}\n\n- (void)setMj_origin:(CGPoint)mj_origin\n{\n    CGRect frame = self.frame;\n    frame.origin = mj_origin;\n    self.frame = frame;\n}\n\n- (CGPoint)mj_origin\n{\n    return self.frame.origin;\n}\n@end\n"
  },
  {
    "path": "Pods/MJRefresh/README.md",
    "content": "![(logo)](http://images.cnitblog.com/blog2015/497279/201505/051004492043385.png)\n## MJRefresh\n* An easy way to use pull-to-refresh\n\n## Contents\n* Getting Started\n    * [Features【Support what kinds of controls to refresh】](#Support_what_kinds_of_controls_to_refresh)\n    * [Installation【How to use MJRefresh】](#How_to_use_MJRefresh)\n    * [Who's using【More than hundreds of Apps are using MJRefresh】](#More_than_hundreds_of_Apps_are_using_MJRefresh)\n    * [Classes【The Class Structure Chart of MJRefresh】](#The_Class_Structure_Chart_of_MJRefresh)\n* Comment API\n\t* [MJRefreshComponent.h](#MJRefreshComponent.h)\n\t* [MJRefreshHeader.h](#MJRefreshHeader.h)\n\t* [MJRefreshFooter.h](#MJRefreshFooter.h)\n\t* [MJRefreshAutoFooter.h](#MJRefreshAutoFooter.h)\n* Examples\n    * [Reference](#Reference)\n    * [The drop-down refresh 01-Default](#The_drop-down_refresh_01-Default)\n    * [The drop-down refresh 02-Animation image](#The_drop-down_refresh_02-Animation_image)\n    * [The drop-down refresh 03-Hide the time](#The_drop-down_refresh_03-Hide_the_time)\n    * [The drop-down refresh 04-Hide status and time](#The_drop-down_refresh_04-Hide_status_and_time)\n    * [The drop-down refresh 05-DIY title](#The_drop-down_refresh_05-DIY_title)\n    * [The drop-down refresh 06-DIY the control of refresh](#The_drop-down_refresh_06-DIY_the_control_of_refresh)\n    * [The pull to refresh 01-Default](#The_pull_to_refresh_01-Default)\n    * [The pull to refresh 02-Animation image](#The_pull_to_refresh_02-Animation_image)\n    * [The pull to refresh 03-Hide the title of refresh status](#The_pull_to_refresh_03-Hide_the_title_of_refresh_status)\n    * [The pull to refresh 04-All loaded](#The_pull_to_refresh_04-All_loaded)\n    * [The pull to refresh 05-DIY title](#The_pull_to_refresh_05-DIY_title)\n    * [The pull to refresh 06-Hidden After loaded](#The_pull_to_refresh_06-Hidden_After_loaded)\n    * [The pull to refresh 07-Automatic back of the pull01](#The_pull_to_refresh_07-Automatic_back_of_the_pull01)\n    * [The pull to refresh 08-Automatic back of the pull02](#The_pull_to_refresh_08-Automatic_back_of_the_pull02)\n    * [The pull to refresh 09-DIY the control of refresh(Automatic refresh)](#The_pull_to_refresh_09-DIY_the_control_of_refresh(Automatic_refresh))\n    * [The pull to refresh 10-DIY the control of refresh(Automatic back)](#The_pull_to_refresh_10-DIY_the_control_of_refresh(Automatic_back))\n    * [UICollectionView01-The pull and drop-down refresh](#UICollectionView01-The_pull_and_drop-down_refresh)\n    * [UIWebView01-The drop-down refresh](#UIWebView01-The_drop-down_refresh)\n* [Hope](#Hope)\n\n## <a id=\"Support_what_kinds_of_controls_to_refresh\"></a>Support what kinds of controls to refresh\n* `UIScrollView`、`UITableView`、`UICollectionView`、`UIWebView`\n\n## <a id=\"How_to_use_MJRefresh\"></a>How to use MJRefresh\n* Installation with CocoaPods：`pod 'MJRefresh'`\n* Manual import：\n    * Drag All files in the `MJRefresh` folder to project\n    * Import the main file：`#import \"MJRefresh.h\"`\n\n```objc\nBase                        Custom\nMJRefresh.bundle            MJRefresh.h\nMJRefreshConst.h            MJRefreshConst.m\nUIScrollView+MJExtension.h  UIScrollView+MJExtension.m\nUIScrollView+MJRefresh.h    UIScrollView+MJRefresh.m\nUIView+MJExtension.h        UIView+MJExtension.m\n```\n\n## <a id=\"More_than_hundreds_of_Apps_are_using_MJRefresh\"></a>More than hundreds of Apps are using MJRefresh\n<img src=\"http://images0.cnblogs.com/blog2015/497279/201506/141212365041650.png\" width=\"200\" height=\"300\">\n* More information of App can focus on：[M了个J-博客园](http://www.cnblogs.com/mjios/p/4409853.html)\n\n## <a id=\"The_Class_Structure_Chart_of_MJRefresh\"></a>The Class Structure Chart of MJRefresh\n![](http://images0.cnblogs.com/blog2015/497279/201506/132232456139177.png)\n- `The class of red text` in the chart：You can use them directly\n    - The drop-down refresh control types\n        - Normal：`MJRefreshNormalHeader`\n        - Gif：`MJRefreshGifHeader`\n    - The pull to refresh control types\n        - Auto refresh\n            - Normal：`MJRefreshAutoNormalFooter`\n            - Gif：`MJRefreshAutoGifFooter`\n        - Auto Back\n            - Normal：`MJRefreshBackNormalFooter`\n            - Gif：`MJRefreshBackGifFooter`\n- `The class of non-red text` in the chart：For inheritance，to use DIY the control of refresh\n- About how to DIY the control of refresh，You can refer the Class in below Chart<br>\n<img src=\"http://images0.cnblogs.com/blog2015/497279/201506/141358159107893.png\" width=\"30%\" height=\"30%\">\n\n## <a id=\"MJRefreshComponent.h\"></a>MJRefreshComponent.h\n```objc\n/** The Base Class of refresh control */\n@interface MJRefreshComponent : UIView\n#pragma mark -  Control the state of Refresh \n\n/** BeginRefreshing */\n- (void)beginRefreshing;\n/** EndRefreshing */\n- (void)endRefreshing; \n/** IsRefreshing */\n- (BOOL)isRefreshing;\n\n#pragma mark - Other\n/** According to the drag ratio to change alpha automatically */\n@property (assign, nonatomic, getter=isAutomaticallyChangeAlpha) BOOL automaticallyChangeAlpha;\n@end\n```\n\n## <a id=\"MJRefreshHeader.h\"></a>MJRefreshHeader.h\n```objc\n@interface MJRefreshHeader : MJRefreshComponent\n/** Creat header */\n+ (instancetype)headerWithRefreshingBlock:(MJRefreshComponentRefreshingBlock)refreshingBlock;\n/** Creat header */\n+ (instancetype)headerWithRefreshingTarget:(id)target refreshingAction:(SEL)action;\n\n/** This key is used to storage the time that the last time of drown-down successfully */\n@property (copy, nonatomic) NSString *lastUpdatedTimeKey;\n/** The last time of drown-down successfully */\n@property (strong, nonatomic, readonly) NSDate *lastUpdatedTime;\n\n/** Ignored scrollView contentInset top */\n@property (assign, nonatomic) CGFloat ignoredScrollViewContentInsetTop;\n@end\n```\n\n## <a id=\"MJRefreshFooter.h\"></a>MJRefreshFooter.h\n```objc\n@interface MJRefreshFooter : MJRefreshComponent\n/** Creat footer */\n+ (instancetype)footerWithRefreshingBlock:(MJRefreshComponentRefreshingBlock)refreshingBlock;\n/** Creat footer */\n+ (instancetype)footerWithRefreshingTarget:(id)target refreshingAction:(SEL)action;\n\n/** NoticeNoMoreData */\n- (void)noticeNoMoreData;\n/** ResetNoMoreData（Clear the status of NoMoreData ） */\n- (void)resetNoMoreData;\n\n/** Ignored scrollView contentInset bottom */\n@property (assign, nonatomic) CGFloat ignoredScrollViewContentInsetBottom;\n\n/** Automaticlly show or hidden by the count of data（Show-have data，Hidden- no data） */\n@property (assign, nonatomic) BOOL automaticallyHidden;\n@end\n```\n\n## <a id=\"MJRefreshAutoFooter.h\"></a>MJRefreshAutoFooter.h\n```objc\n@interface MJRefreshAutoFooter : MJRefreshFooter\n/** Is Automatically Refresh(Default is Yes) */\n@property (assign, nonatomic, getter=isAutomaticallyRefresh) BOOL automaticallyRefresh;\n\n/** When there is much at the bottom of the control is automatically refresh(Default is 1.0，Is at the bottom of the control appears in full, will refresh automatically) */\n@property (assign, nonatomic) CGFloat triggerAutomaticallyRefreshPercent;\n@end\n```\n\n## <a id=\"Reference\"></a>Reference\n```objc\n* Due to there are more functions of this framework，Don't write specific text describe its usage\n* You can directly reference examples MJTableViewController、MJCollectionViewController、MJWebViewController，More intuitive and fast.\n```\n<img src=\"http://images0.cnblogs.com/blog2015/497279/201506/141345470048120.png\" width=\"30%\" height=\"30%\">\n\n## <a id=\"The_drop-down_refresh_01-Default\"></a>The drop-down refresh 01-Default\n\n```objc\nself.tableView.header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{\n   //Call this Block When enter the refresh status automatically \n}];\n或\n// Set the callback（Once you enter the refresh status，then call the action of target，that is call [self loadNewData]）\nself.tableView.header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];\n\n// Enter the refresh status immediately\n[self.tableView.header beginRefreshing];\n```\n![(下拉刷新01-普通)](http://images0.cnblogs.com/blog2015/497279/201506/141204343486151.gif)\n\n## <a id=\"The_drop-down_refresh_02-Animation_image\"></a>The drop-down refresh 02-Animation image\n```objc\n// Set the callback（一Once you enter the refresh status，then call the action of target，that is call [self loadNewData]）\nMJRefreshGifHeader *header = [MJRefreshGifHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];\n// Set the ordinary state of animated images\n[header setImages:idleImages forState:MJRefreshStateIdle];\n// Set the pulling state of animated images（Enter the status of refreshing as soon as loosen）\n[header setImages:pullingImages forState:MJRefreshStatePulling];\n// Set the refreshing state of animated images\n[header setImages:refreshingImages forState:MJRefreshStateRefreshing];\n// Set header\nself.tableView.mj_header = header;\n```\n![(下拉刷新02-动画图片)](http://images0.cnblogs.com/blog2015/497279/201506/141204402238389.gif)\n\n## <a id=\"The_drop-down_refresh_03-Hide_the_time\"></a>The drop-down refresh 03-Hide the time\n```objc\n// Hide the time\nheader.lastUpdatedTimeLabel.hidden = YES;\n```\n![(下拉刷新03-隐藏时间)](http://images0.cnblogs.com/blog2015/497279/201506/141204456132944.gif)\n\n## <a id=\"The_drop-down_refresh_04-Hide_status_and_time\"></a>The drop-down refresh 04-Hide status and time\n```objc\n// Hide the time\nheader.lastUpdatedTimeLabel.hidden = YES;\n\n// Hide the status\nheader.stateLabel.hidden = YES;\n```\n![(下拉刷新04-隐藏状态和时间0)](http://images0.cnblogs.com/blog2015/497279/201506/141204508639539.gif)\n\n## <a id=\"The_drop-down_refresh_05-DIY_title\"></a>The drop-down refresh 05-DIY title\n```objc\n// Set title\n[header setTitle:@\"Pull down to refresh\" forState:MJRefreshStateIdle];\n[header setTitle:@\"Release to refresh\" forState:MJRefreshStatePulling];\n[header setTitle:@\"Loading ...\" forState:MJRefreshStateRefreshing];\n\n// Set font\nheader.stateLabel.font = [UIFont systemFontOfSize:15];\nheader.lastUpdatedTimeLabel.font = [UIFont systemFontOfSize:14];\n\n// Set textColor\nheader.stateLabel.textColor = [UIColor redColor];\nheader.lastUpdatedTimeLabel.textColor = [UIColor blueColor];\n```\n![(下拉刷新05-自定义文字)](http://images0.cnblogs.com/blog2015/497279/201506/141204563633593.gif)\n\n## <a id=\"The_drop-down_refresh_06-DIY_the_control_of_refresh\"></a>The drop-down refresh 06-DIY the control of refresh\n```objc\nself.tableView.mj_header = [MJDIYHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];\n// Implementation reference to MJDIYHeader.h和MJDIYHeader.m\n```\n![(下拉刷新06-自定义刷新控件)](http://images0.cnblogs.com/blog2015/497279/201506/141205019261159.gif)\n\n## <a id=\"The_pull_to_refresh_01-Default\"></a>The pull to refresh 01-Default\n```objc\nself.tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{\n    //Call this Block When enter the refresh status automatically\n}];\n或\n// Set the callback（Once you enter the refresh status，then call the action of target，that is call [self loadMoreData]）\nself.tableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];\n```\n![(上拉刷新01-默认)](http://images0.cnblogs.com/blog2015/497279/201506/141205090047696.gif)\n\n## <a id=\"The_pull_to_refresh_02-Animation_image\"></a>The pull to refresh 02-Animation image\n```objc\n// Set the callback（Once you enter the refresh status，then call the action of target，that is call [self loadMoreData]）\nMJRefreshAutoGifFooter *footer = [MJRefreshAutoGifFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];\n\n// Set the refresh image\n[footer setImages:refreshingImages forState:MJRefreshStateRefreshing];\n\n// Set footer\nself.tableView.mj_footer = footer;\n```\n![(上拉刷新02-动画图片)](http://images0.cnblogs.com/blog2015/497279/201506/141205141445793.gif)\n\n## <a id=\"The_pull_to_refresh_03-Hide_the_title_of_refresh_status\"></a>The pull to refresh 03-Hide the title of refresh status\n```objc\n// Hide the title of refresh status\nfooter.refreshingTitleHidden = YES;\n// If does have not above method，then use footer.stateLabel.hidden = YES;\n```\n![(上拉刷新03-隐藏刷新状态的文字)](http://images0.cnblogs.com/blog2015/497279/201506/141205200985774.gif)\n\n## <a id=\"The_pull_to_refresh_04-All_loaded\"></a>The pull to refresh 04-All loaded\n```objc\n//Become the status of NoMoreData\n[footer noticeNoMoreData];\n```\n![(上拉刷新04-全部加载完毕)](http://images0.cnblogs.com/blog2015/497279/201506/141205248634686.gif)\n\n## <a id=\"The_pull_to_refresh_05-DIY_title\"></a>The pull to refresh 05-DIY title\n```objc\n// Set title\n[footer setTitle:@\"Click or drag up to refresh\" forState:MJRefreshStateIdle];\n[footer setTitle:@\"Loading more ...\" forState:MJRefreshStateRefreshing];\n[footer setTitle:@\"No more data\" forState:MJRefreshStateNoMoreData];\n\n// Set font\nfooter.stateLabel.font = [UIFont systemFontOfSize:17];\n\n// Set textColor\nfooter.stateLabel.textColor = [UIColor blueColor];\n```\n![(上拉刷新05-自定义文字)](http://images0.cnblogs.com/blog2015/497279/201506/141205295511153.gif)\n\n## <a id=\"The_pull_to_refresh_06-Hidden_After_loaded\"></a>The pull to refresh 06-Hidden After loaded\n```objc\n//Hidden current control of the pull to refresh\nself.tableView.mj_footer.hidden = YES;\n```\n![(上拉刷新06-加载后隐藏)](http://images0.cnblogs.com/blog2015/497279/201506/141205343481821.gif)\n\n## <a id=\"The_pull_to_refresh_07-Automatic_back_of_the_pull01\"></a>The pull to refresh 07-Automatic back of the pull01\n```objc\nself.tableView.mj_footer = [MJRefreshBackNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];\n```\n![(上拉刷新07-自动回弹的上拉01)](http://images0.cnblogs.com/blog2015/497279/201506/141205392239231.gif)\n\n## <a id=\"The_pull_to_refresh_08-Automatic_back_of_the_pull02\"></a>The pull to refresh 08-Automatic back of the pull02\n```objc\nMJRefreshBackGifFooter *footer = [MJRefreshBackGifFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];\n\n// Set the normal state of the animated image\n[footer setImages:idleImages forState:MJRefreshStateIdle];\n//  Set the pulling state of animated images（Enter the status of refreshing as soon as loosen）\n[footer setImages:pullingImages forState:MJRefreshStatePulling];\n// Set the refreshing state of animated images\n[footer setImages:refreshingImages forState:MJRefreshStateRefreshing];\n\n// Set footer\nself.tableView.mj_footer = footer;\n```\n![(上拉刷新07-自动回弹的上拉02)](http://images0.cnblogs.com/blog2015/497279/201506/141205441443628.gif)\n\n## <a id=\"The_pull_to_refresh_09-DIY_the_control_of_refresh(Automatic_refresh)\"></a>The pull to refresh 09-DIY the control of refresh(Automatic refresh)\n```objc\nself.tableView.mj_footer = [MJDIYAutoFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];\n// Implementation reference to MJDIYAutoFooter.h和MJDIYAutoFooter.m\n```\n![(上拉刷新09-自定义刷新控件(自动刷新))](http://images0.cnblogs.com/blog2015/497279/201506/141205500195866.gif)\n\n## <a id=\"The_pull_to_refresh_10-DIY_the_control_of_refresh(Automatic_back)\"></a>The pull to refresh 10-DIY the control of refresh(Automatic back)\n```objc\nself.tableView.mj_footer = [MJDIYBackFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];\n// Implementation reference to MJDIYBackFooter.h和MJDIYBackFooter.m\n```\n![(上拉刷新10-自定义刷新控件(自动回弹))](http://images0.cnblogs.com/blog2015/497279/201506/141205560666819.gif)\n\n## <a id=\"UICollectionView01-The_pull_and_drop-down_refresh\"></a>UICollectionView01-The pull and drop-down refresh\n```objc\n// The drop-down refresh\nself.collectionView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{\n   //Call this Block When enter the refresh status automatically \n}];\n\n// The pull to refresh\nself.collectionView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{\n   //Call this Block When enter the refresh status automatically\n}];\n```\n![(UICollectionView01-上下拉刷新)](http://images0.cnblogs.com/blog2015/497279/201506/141206021603758.gif)\n\n## <a id=\"UIWebView01-The_drop-down_refresh\"></a>UIWebView01-The drop-down refresh\n```objc\n//Add the control of The drop-down refresh\nself.webView.scrollView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{\n   //Call this Block When enter the refresh status automatically\n}];\n```\n![(UICollectionView01-上下拉刷新)](http://images0.cnblogs.com/blog2015/497279/201506/141206080514524.gif)\n\n## Remind\n* ARC\n* iOS>=6.0\n* iPhone \\ iPad screen anyway\n\n## <a id=\"Hope\"></a>Hope\n* If you find bug when used，Hope you can Issues me，Thank you or try to download the latest code of this framework to see the BUG has been fixed or not）\n* If you find the function is not enough when used，Hope you can Issues me，I very much to add more useful function to this framework ，Thank you !\n* If you want to contribute code for MJRefresh，please Pull Requests me\n*  If you use MJRefresh in your develop app，Hope you can go to[CocoaControls](https://www.cocoacontrols.com/controls/mjrefresh)to add the iTunes path\n of you app，I Will install your app，and according to the usage of many app，to be a better design and improve to MJRefresh，Thank you !\n   * StepO1（WeChat is just an Example，Explore“Your app name itunes”）\n![(step01)](http://ww4.sinaimg.cn/mw1024/800cdf9ctw1eq0viiv5rsj20sm0ea41t.jpg)\n   * StepO2\n![(step02)](http://ww2.sinaimg.cn/mw1024/800cdf9ctw1eq0vilejxlj20tu0me7a0.jpg)\n   * StepO3\n![(step03)](http://ww1.sinaimg.cn/mw1024/800cdf9ctw1eq0viocpo5j20wc0dc0un.jpg)\n   * StepO4\n![(step04)](http://ww3.sinaimg.cn/mw1024/800cdf9ctw1eq0vir137xj20si0gewgu.jpg)\n"
  },
  {
    "path": "Pods/Moya/License.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2017 Artsy, Ash Furrow\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Pods/Moya/Readme.md",
    "content": "<p align=\"center\">\n  <img height=\"160\" src=\"web/logo_github.png\" />\n</p>\n\n# Moya\n\n[![CircleCI](https://img.shields.io/circleci/project/github/Moya/Moya/master.svg)](https://circleci.com/gh/Moya/Moya/tree/master)\n[![codecov.io](https://codecov.io/github/Moya/Moya/coverage.svg?branch=master)](https://codecov.io/github/Moya/Moya?branch=master)\n[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)\n[![CocoaPods compatible](https://img.shields.io/cocoapods/v/Moya.svg)](https://cocoapods.org/pods/Moya)\n[![Swift Package Manager compatible](https://img.shields.io/badge/Swift%20Package%20Manager-compatible-brightgreen.svg)](https://github.com/apple/swift-package-manager)\n\n*A Chinese version of this document can be found [here](Readme_CN.md).*\n\nYou're a smart developer. You probably use [Alamofire](https://github.com/Alamofire/Alamofire) to abstract away access to\n`URLSession` and all those nasty details you don't really care about. But then,\nlike lots of smart developers, you write ad hoc network abstraction layers. They\nare probably called \"APIManager\" or \"NetworkModel\", and they always end in tears.\n\n![Moya Overview](web/diagram.png)\n\nAd hoc network layers are common in iOS apps. They're bad for a few reasons:\n\n- Makes it hard to write new apps (\"where do I begin?\")\n- Makes it hard to maintain existing apps (\"oh my god, this mess...\")\n- Makes it hard to write unit tests (\"how do I do this again?\")\n\nSo the basic idea of Moya is that we want some network abstraction layer that\nsufficiently encapsulates actually calling Alamofire directly. It should be simple\nenough that common things are easy, but comprehensive enough that complicated things\nare also easy.\n\n> If you use Alamofire to abstract away `URLSession`, why not use something\nto abstract away the nitty gritty of URLs, parameters, etc?\n\nSome awesome features of Moya:\n\n- Compile-time checking for correct API endpoint accesses.\n- Lets you define a clear usage of different endpoints with associated enum values.\n- Treats test stubs as first-class citizens so unit testing is super-easy.\n\nYou can check out more about the project direction in the [vision document](Vision.md).\n\n## Sample Project\n\nThere's a sample project in the Demo directory. To use it, run `pod install` to download the required libraries. Have fun!\n\n## Project Status\n\nThis project is actively under development, and is being used in [Artsy's\nnew auction app](https://github.com/Artsy/eidolon). We consider it\nready for production use.\n\n## Installation\n\n### Moya version vs Swift version.\n\nBelow is a table that shows which version of Moya you should use for\nyour Swift version.\n\n| Swift | Moya          | RxMoya        | ReactiveMoya  |\n| ----- | ------------- |---------------|---------------|\n| 4.X   | >= 9.0        | >= 10.0       | >= 9.0        |\n| 3.X   | 8.0.0 - 8.0.5 | 8.0.0 - 8.0.5 | 8.0.0 - 8.0.5 |\n| 2.3   | 7.0.2 - 7.0.4 | 7.0.2 - 7.0.4 | 7.0.2 - 7.0.4 |\n| 2.2   | <= 7.0.1      | <= 7.0.1      | <= 7.0.1      |\n\n**Upgrading to a new major version of Moya? Check out our [migration guides](https://github.com/Moya/Moya/blob/master/docs/MigrationGuides).**\n\n### Swift Package Manager\n\nTo integrate using Apple's Swift package manager, add the following as a dependency to your `Package.swift`:\n\n```swift\n.package(url: \"https://github.com/Moya/Moya.git\", .upToNextMajor(from: \"10.0.0\"))\n```\n\nand then specify `\"Moya\"` as a dependency of the Target in which you wish to use Moya.\nIf you want to use reactive extensions, add also `\"ReactiveMoya\"` or `\"RxMoya\"` as your Target dependency respectively.\nHere's an example `PackageDescription`:\n\n```swift\n// swift-tools-version:4.0\nimport PackageDescription\n\nlet package = Package(\n    name: \"MyPackage\",\n    products: [\n        .library(\n            name: \"MyPackage\",\n            targets: [\"MyPackage\"]),\n    ],\n    dependencies: [\n        .package(url: \"https://github.com/Moya/Moya.git\", .upToNextMajor(from: \"10.0.0\"))\n    ],\n    targets: [\n        .target(\n            name: \"MyPackage\",\n            dependencies: [\"ReactiveMoya\"])\n    ]\n)\n```\n\nNote that as of Moya 10, SPM only works with Swift 4 toolchain and greater.\n\n### CocoaPods\n\nFor Moya, use the following entry in your Podfile:\n\n```rb\npod 'Moya'\n\n# or \n\npod 'Moya/RxSwift'\n\n# or\n\npod 'Moya/ReactiveSwift'\n```\n\nThen run `pod install`.\n\nIn any file you'd like to use Moya in, don't forget to\nimport the framework with `import Moya`.\n\n### Carthage\n\nCarthage users can point to this repository and use whichever\ngenerated framework they'd like, `Moya`, `RxMoya`, or `ReactiveMoya`.\n\nMake the following entry in your Cartfile:\n\n```\ngithub \"Moya/Moya\"\n```\n\nThen run `carthage update`.\n\nIf this is your first time using Carthage in the project, you'll need to go through some additional steps as explained [over at Carthage](https://github.com/Carthage/Carthage#adding-frameworks-to-an-application).\n\n> NOTE: At this time, Carthage does not provide a way to build only specific repository submodules. All submodules and their dependencies will be built with the above command. However, you don't need to copy frameworks you aren't using into your project. For instance, if you aren't using `ReactiveSwift`, feel free to delete that framework along with `ReactiveMoya` from the Carthage Build directory after `carthage update` completes. Or if you are using `ReactiveSwift` but not `RxSwift`, then `RxMoya`, `RxTest`, `RxCocoa`, etc. can safely be deleted.\n\n### Manually\n\n- Open up Terminal, `cd` into your top-level project directory, and run the following command *if* your project is not initialized as a git repository:\n\n```bash\n$ git init\n```\n\n- Add Alamofire, Result & Moya as a git [submodule](http://git-scm.com/docs/git-submodule) by running the following commands:\n\n```bash\n$ git submodule add https://github.com/Alamofire/Alamofire.git\n$ git submodule add https://github.com/antitypical/Result.git\n$ git submodule add https://github.com/Moya/Moya.git\n```\n\n- Open the new `Alamofire` folder, and drag the `Alamofire.xcodeproj` into the Project Navigator of your application's Xcode project. Do the same with the `Result.xcodeproj` in the `Result` folder and `Moya.xcodeproj` in the `Moya` folder.\n\n> They should appear nested underneath your application's blue project icon. Whether it is above or below all the other Xcode groups does not matter.\n\n- Verify that the deployment targets of the `xcodeproj`s match that of your application target in the Project Navigator.\n- Next, select your application project in the Project Navigator (blue project icon) to navigate to the target configuration window and select the application target under the \"Targets\" heading in the sidebar.\n- In the tab bar at the top of that window, open the \"General\" panel.\n- Click on the `+` button under the \"Embedded Binaries\" section.\n- You will see two different `Alamofire.xcodeproj` folders each with two different versions of the `Alamofire.framework` nested inside a `Products` folder.\n\n> It does not matter which `Products` folder you choose from, but it does matter whether you choose the top or bottom `Alamofire.framework`.\n\n- Select the top `Alamofire.framework` for iOS and the bottom one for OS X.\n\n> You can verify which one you selected by inspecting the build log for your project. The build target for `Alamofire` will be listed as either `Alamofire iOS`, `Alamofire macOS`, `Alamofire tvOS` or `Alamofire watchOS`.\n\n- Click on the `+` button under \"Embedded Binaries\" again and add the build target you need for `Result`.\n- Click on the `+` button again and add the correct build target for `Moya`.\n\n- And that's it!\n\n> The three frameworks are automagically added as a target dependency, linked framework and embedded framework in a copy files build phase which is all you need to build on the simulator and a device.\n\n## Usage\n\nAfter [some setup](docs/Examples/Basic.md), using Moya is really simple. You can access an API like this:\n\n```swift\nprovider = MoyaProvider<GitHub>()\nprovider.request(.zen) { result in\n    switch result {\n    case let .success(moyaResponse):\n        let data = moyaResponse.data\n        let statusCode = moyaResponse.statusCode\n        // do something with the response data or statusCode\n    case let .failure(error):\n        // this means there was a network failure - either the request\n        // wasn't sent (connectivity), or no response was received (server\n        // timed out).  If the server responds with a 4xx or 5xx error, that\n        // will be sent as a \".success\"-ful response.\n    }\n}\n```\n\nThat's a basic example. Many API requests need parameters. Moya encodes these\ninto the enum you use to access the endpoint, like this:\n\n```swift\nprovider = MoyaProvider<GitHub>()\nprovider.request(.userProfile(\"ashfurrow\")) { result in\n    // do something with the result\n}\n```\n\nNo more typos in URLs. No more missing parameter values. No more messing with\nparameter encoding.\n\nFor more examples, see the [documentation](docs/Examples).\n\n## Reactive Extensions\n\nEven cooler are the reactive extensions. Moya provides reactive extensions for\n[ReactiveSwift](https://github.com/ReactiveCocoa/ReactiveSwift) and\n[RxSwift](https://github.com/ReactiveX/RxSwift).\n\n### ReactiveSwift\n\n[`ReactiveSwift` extension](docs/ReactiveSwift.md) provides both `reactive.request(:callbackQueue:)` and \n`reactive.requestWithProgress(:callbackQueue:)` methods that immediately return \n`SignalProducer`s that you can start, bind, map, or whatever you want to do. \nTo handle errors, for instance, we could do the following:\n\n```swift\nprovider = MoyaProvider<GitHub>()\nprovider.reactive.request(.userProfile(\"ashfurrow\")).start { event in\n    switch event {\n    case let .value(response):\n        image = UIImage(data: response.data)\n    case let .failed(error):\n        print(error)\n    default:\n        break\n    }\n}\n```\n\n### RxSwift\n\n[`RxSwift` extension](docs/RxSwift.md) also provide both `rx.request(:callbackQueue:)` and \n`rx.requestWithProgress(:callbackQueue:)` methods, but return type is \ndifferent for both. In case of a normal `rx.request(:callbackQueue)`, the\nreturn type is `Single<Response>` which emits either single element or an\nerror. In case of a `rx.requestWithProgress(:callbackQueue:)`, the return \ntype is `Observable<ProgressResponse>`, since we may get multiple events\nfrom progress and one last event which is a response.\n\nTo handle errors, for instance, we could do the following:\n\n```swift\nprovider = MoyaProvider<GitHub>()\nprovider.rx.request(.userProfile(\"ashfurrow\")).subscribe { event in\n    switch event {\n    case let .success(response):\n        image = UIImage(data: response.data)\n    case let .error(error):\n        print(error)\n    }\n}\n```\n\nIn addition to the option of using signals instead of callback blocks, there are\nalso a series of signal operators for RxSwift and ReactiveSwift that will attempt\nto map the data received from the network response into either an image, some JSON,\nor a string, with `mapImage()`, `mapJSON()`, and `mapString()`, respectively. If the mapping is unsuccessful, you'll get an error on the signal. You also get handy methods\nfor filtering out certain status codes. This means that you can place your code for\nhandling API errors like 400's in the same places as code for handling invalid\nresponses.\n\n## Community Projects\n\n[Moya has a great community around it and some people have created some very helpful extensions](https://github.com/Moya/Moya/blob/master/docs/CommunityProjects.md).\n\n## Contributing\n\nHey! Do you like Moya? Awesome! We could actually really use your help!\n\nOpen source isn't just writing code. Moya could use your help with any of the\nfollowing:\n\n- Finding (and reporting!) bugs.\n- New feature suggestions.\n- Answering questions on issues.\n- Documentation improvements.\n- Reviewing pull requests.\n- Helping to manage issue priorities.\n- Fixing bugs/new features.\n\nIf any of that sounds cool to you, send a pull request! After your first\ncontribution, we will add you as a member to the repo so you can merge pull\nrequests and help steer the ship :ship: You can read more details about that [in our contributor guidelines](https://github.com/Moya/Moya/blob/master/Contributing.md).\n\nMoya's community has a tremendous positive energy, and the maintainers are committed to keeping things awesome. Like [in the CocoaPods community](https://github.com/CocoaPods/CocoaPods/wiki/Communication-&-Design-Rules), always assume positive intent; even if a comment sounds mean-spirited, give the person the benefit of the doubt.\n\nPlease note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by [its terms](https://github.com/Moya/Moya/blob/master/Code%20of%20Conduct.md).\n\n### Adding new source files\n\nIf you add or remove a source file from Moya, a corresponding change needs to be made to the `Moya.xcodeproj` project at the root of this repository. This project is used for Carthage. Don't worry, you'll get an automated warning when submitting a pull request if you forget.\n\n### Help us improve Moya documentation\nWhether you’re a core member or a user trying it out for the first time, you can make a valuable contribution to Moya by improving the documentation. Help us by:\n\n- sending us feedback about something you thought was confusing or simply missing\n- suggesting better wording or ways of explaining certain topics\n- sending us a pull request via GitHub\n- improving the [Chinese documentation](Readme_CN.md)\n\n\n## License\n\nMoya is released under an MIT license. See [License.md](License.md) for more information.\n"
  },
  {
    "path": "Pods/Moya/Sources/Moya/AnyEncodable.swift",
    "content": "import Foundation\n\nstruct AnyEncodable: Encodable {\n\n    private let encodable: Encodable\n\n    public init(_ encodable: Encodable) {\n        self.encodable = encodable\n    }\n\n    func encode(to encoder: Encoder) throws {\n        try encodable.encode(to: encoder)\n    }\n}\n"
  },
  {
    "path": "Pods/Moya/Sources/Moya/Cancellable.swift",
    "content": "/// Protocol to define the opaque type returned from a request\npublic protocol Cancellable {\n    var isCancelled: Bool { get }\n    func cancel()\n}\n\ninternal class CancellableWrapper: Cancellable {\n    internal var innerCancellable: Cancellable = SimpleCancellable()\n\n    var isCancelled: Bool { return innerCancellable.isCancelled }\n\n    internal func cancel() {\n        innerCancellable.cancel()\n    }\n}\n\ninternal class SimpleCancellable: Cancellable {\n    var isCancelled = false\n    func cancel() {\n        isCancelled = true\n    }\n}\n"
  },
  {
    "path": "Pods/Moya/Sources/Moya/Endpoint.swift",
    "content": "import Foundation\n\n/// Used for stubbing responses.\npublic enum EndpointSampleResponse {\n\n    /// The network returned a response, including status code and data.\n    case networkResponse(Int, Data)\n\n    /// The network returned response which can be fully customized.\n    case response(HTTPURLResponse, Data)\n\n    /// The network failed to send the request, or failed to retrieve a response (eg a timeout).\n    case networkError(NSError)\n}\n\n/// Class for reifying a target of the `Target` enum unto a concrete `Endpoint`.\nopen class Endpoint<Target> {\n    public typealias SampleResponseClosure = () -> EndpointSampleResponse\n\n    open let url: String\n    open let sampleResponseClosure: SampleResponseClosure\n    open let method: Moya.Method\n    open let task: Task\n    open let httpHeaderFields: [String: String]?\n\n    /// Main initializer for `Endpoint`.\n    public init(url: String,\n                sampleResponseClosure: @escaping SampleResponseClosure,\n                method: Moya.Method,\n                task: Task,\n                httpHeaderFields: [String: String]?) {\n\n        self.url = url\n        self.sampleResponseClosure = sampleResponseClosure\n        self.method = method\n        self.task = task\n        self.httpHeaderFields = httpHeaderFields\n    }\n\n    /// Convenience method for creating a new `Endpoint` with the same properties as the receiver, but with added HTTP header fields.\n    open func adding(newHTTPHeaderFields: [String: String]) -> Endpoint<Target> {\n        return Endpoint(url: url, sampleResponseClosure: sampleResponseClosure, method: method, task: task, httpHeaderFields: add(httpHeaderFields: newHTTPHeaderFields))\n    }\n\n    /// Convenience method for creating a new `Endpoint` with the same properties as the receiver, but with replaced `task` parameter.\n    open func replacing(task: Task) -> Endpoint<Target> {\n        return Endpoint(url: url, sampleResponseClosure: sampleResponseClosure, method: method, task: task, httpHeaderFields: httpHeaderFields)\n    }\n\n    fileprivate func add(httpHeaderFields headers: [String: String]?) -> [String: String]? {\n        guard let unwrappedHeaders = headers, unwrappedHeaders.isEmpty == false else {\n            return self.httpHeaderFields\n        }\n\n        var newHTTPHeaderFields = self.httpHeaderFields ?? [:]\n        unwrappedHeaders.forEach { key, value in\n            newHTTPHeaderFields[key] = value\n        }\n        return newHTTPHeaderFields\n    }\n}\n\n/// Extension for converting an `Endpoint` into a `URLRequest`.\nextension Endpoint {\n    /// Returns the `Endpoint` converted to a `URLRequest` if valid. Throws an error otherwise.\n    public func urlRequest() throws -> URLRequest {\n        guard let requestURL = Foundation.URL(string: url) else {\n            throw MoyaError.requestMapping(url)\n        }\n\n        var request = URLRequest(url: requestURL)\n        request.httpMethod = method.rawValue\n        request.allHTTPHeaderFields = httpHeaderFields\n\n        switch task {\n        case .requestPlain, .uploadFile, .uploadMultipart, .downloadDestination:\n            return request\n        case .requestData(let data):\n            request.httpBody = data\n            return request\n        case let .requestJSONEncodable(encodable):\n            return try request.encoded(encodable: encodable)\n        case let .requestParameters(parameters, parameterEncoding):\n            return try request.encoded(parameters: parameters, parameterEncoding: parameterEncoding)\n        case let .uploadCompositeMultipart(_, urlParameters):\n            let parameterEncoding = URLEncoding(destination: .queryString)\n            return try request.encoded(parameters: urlParameters, parameterEncoding: parameterEncoding)\n        case let .downloadParameters(parameters, parameterEncoding, _):\n            return try request.encoded(parameters: parameters, parameterEncoding: parameterEncoding)\n        case let .requestCompositeData(bodyData: bodyData, urlParameters: urlParameters):\n            request.httpBody = bodyData\n            let parameterEncoding = URLEncoding(destination: .queryString)\n            return try request.encoded(parameters: urlParameters, parameterEncoding: parameterEncoding)\n        case let .requestCompositeParameters(bodyParameters: bodyParameters, bodyEncoding: bodyParameterEncoding, urlParameters: urlParameters):\n            if bodyParameterEncoding is URLEncoding { fatalError(\"URLEncoding is disallowed as bodyEncoding.\") }\n            let bodyfulRequest = try request.encoded(parameters: bodyParameters, parameterEncoding: bodyParameterEncoding)\n            let urlEncoding = URLEncoding(destination: .queryString)\n            return try bodyfulRequest.encoded(parameters: urlParameters, parameterEncoding: urlEncoding)\n        }\n    }\n}\n\n/// Required for using `Endpoint` as a key type in a `Dictionary`.\nextension Endpoint: Equatable, Hashable {\n    public var hashValue: Int {\n        let request = try? urlRequest()\n        return request?.hashValue ?? url.hashValue\n    }\n\n    /// Note: If both Endpoints fail to produce a URLRequest the comparison will\n    /// fall back to comparing each Endpoint's hashValue.\n    public static func == <T>(lhs: Endpoint<T>, rhs: Endpoint<T>) -> Bool {\n        let lhsRequest = try? lhs.urlRequest()\n        let rhsRequest = try? rhs.urlRequest()\n        if lhsRequest != nil, rhsRequest == nil { return false }\n        if lhsRequest == nil, rhsRequest != nil { return false }\n        if lhsRequest == nil, rhsRequest == nil { return lhs.hashValue == rhs.hashValue }\n        return (lhsRequest == rhsRequest)\n    }\n}\n"
  },
  {
    "path": "Pods/Moya/Sources/Moya/Image.swift",
    "content": "#if os(iOS) || os(watchOS) || os(tvOS)\n    import UIKit.UIImage\n    public typealias ImageType = UIImage\n#elseif os(OSX)\n    import AppKit.NSImage\n    public typealias ImageType = NSImage\n#endif\n\n/// An alias for the SDK's image type.\npublic typealias Image = ImageType\n"
  },
  {
    "path": "Pods/Moya/Sources/Moya/Moya+Alamofire.swift",
    "content": "import Foundation\nimport Alamofire\n\npublic typealias Manager = Alamofire.SessionManager\ninternal typealias Request = Alamofire.Request\ninternal typealias DownloadRequest = Alamofire.DownloadRequest\ninternal typealias UploadRequest = Alamofire.UploadRequest\ninternal typealias DataRequest = Alamofire.DataRequest\n\ninternal typealias URLRequestConvertible = Alamofire.URLRequestConvertible\n\n/// Represents an HTTP method.\npublic typealias Method = Alamofire.HTTPMethod\n\n/// Choice of parameter encoding.\npublic typealias ParameterEncoding = Alamofire.ParameterEncoding\npublic typealias JSONEncoding = Alamofire.JSONEncoding\npublic typealias URLEncoding = Alamofire.URLEncoding\npublic typealias PropertyListEncoding = Alamofire.PropertyListEncoding\n\n/// Multipart form\npublic typealias RequestMultipartFormData = Alamofire.MultipartFormData\n\n/// Multipart form data encoding result.\npublic typealias MultipartFormDataEncodingResult = Manager.MultipartFormDataEncodingResult\npublic typealias DownloadDestination = Alamofire.DownloadRequest.DownloadFileDestination\n\n/// Make the Alamofire Request type conform to our type, to prevent leaking Alamofire to plugins.\nextension Request: RequestType { }\n\n/// Internal token that can be used to cancel requests\npublic final class CancellableToken: Cancellable, CustomDebugStringConvertible {\n    let cancelAction: () -> Void\n    let request: Request?\n    public fileprivate(set) var isCancelled = false\n\n    fileprivate var lock: DispatchSemaphore = DispatchSemaphore(value: 1)\n\n    public func cancel() {\n        _ = lock.wait(timeout: DispatchTime.distantFuture)\n        defer { lock.signal() }\n        guard !isCancelled else { return }\n        isCancelled = true\n        cancelAction()\n    }\n\n    public init(action: @escaping () -> Void) {\n        self.cancelAction = action\n        self.request = nil\n    }\n\n    init(request: Request) {\n        self.request = request\n        self.cancelAction = {\n            request.cancel()\n        }\n    }\n\n    public var debugDescription: String {\n        guard let request = self.request else {\n            return \"Empty Request\"\n        }\n        return request.debugDescription\n    }\n\n}\n\ninternal typealias RequestableCompletion = (HTTPURLResponse?, URLRequest?, Data?, Swift.Error?) -> Void\n\ninternal protocol Requestable {\n    func response(callbackQueue: DispatchQueue?, completionHandler: @escaping RequestableCompletion) -> Self\n}\n\nextension DataRequest: Requestable {\n    internal func response(callbackQueue: DispatchQueue?, completionHandler: @escaping RequestableCompletion) -> Self {\n        return response(queue: callbackQueue) { handler  in\n            completionHandler(handler.response, handler.request, handler.data, handler.error)\n        }\n    }\n}\n\nextension DownloadRequest: Requestable {\n    internal func response(callbackQueue: DispatchQueue?, completionHandler: @escaping RequestableCompletion) -> Self {\n        return response(queue: callbackQueue) { handler  in\n            completionHandler(handler.response, handler.request, nil, handler.error)\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/Moya/Sources/Moya/MoyaError.swift",
    "content": "import Foundation\n\npublic enum MoyaError: Swift.Error {\n\n    /// Indicates a response failed to map to an image.\n    case imageMapping(Response)\n\n    /// Indicates a response failed to map to a JSON structure.\n    case jsonMapping(Response)\n\n    /// Indicates a response failed to map to a String.\n    case stringMapping(Response)\n\n    /// Indicates a response failed to map to a Decodable object.\n    case objectMapping(Swift.Error, Response)\n\n    /// Indicates that Encodable couldn't be encoded into Data\n    case encodableMapping(Swift.Error)\n\n    /// Indicates a response failed with an invalid HTTP status code.\n    case statusCode(Response)\n\n    /// Indicates a response failed due to an underlying `Error`.\n    case underlying(Swift.Error, Response?)\n\n    /// Indicates that an `Endpoint` failed to map to a `URLRequest`.\n    case requestMapping(String)\n\n    /// Indicates that an `Endpoint` failed to encode the parameters for the `URLRequest`.\n    case parameterEncoding(Swift.Error)\n}\n\npublic extension MoyaError {\n    /// Depending on error type, returns a `Response` object.\n    var response: Moya.Response? {\n        switch self {\n        case .imageMapping(let response): return response\n        case .jsonMapping(let response): return response\n        case .stringMapping(let response): return response\n        case .objectMapping(_, let response): return response\n        case .statusCode(let response): return response\n        case .underlying(_, let response): return response\n        case .encodableMapping: return nil\n        case .requestMapping: return nil\n        case .parameterEncoding: return nil\n        }\n    }\n}\n\n// MARK: - Error Descriptions\n\nextension MoyaError: LocalizedError {\n    public var errorDescription: String? {\n        switch self {\n        case .imageMapping:\n            return \"Failed to map data to an Image.\"\n        case .jsonMapping:\n            return \"Failed to map data to JSON.\"\n        case .stringMapping:\n            return \"Failed to map data to a String.\"\n        case .objectMapping:\n            return \"Failed to map data to a Decodable object.\"\n        case .encodableMapping:\n            return \"Failed to encode Encodable object into data.\"\n        case .statusCode:\n            return \"Status code didn't fall within the given range.\"\n        case .requestMapping:\n            return \"Failed to map Endpoint to a URLRequest.\"\n        case .parameterEncoding(let error):\n            return \"Failed to encode parameters for URLRequest. \\(error.localizedDescription)\"\n        case .underlying(let error, _):\n            return error.localizedDescription\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/Moya/Sources/Moya/MoyaProvider+Defaults.swift",
    "content": "import Foundation\n\n/// These functions are default mappings to `MoyaProvider`'s properties: endpoints, requests, manager, etc.\npublic extension MoyaProvider {\n    public final class func defaultEndpointMapping(for target: Target) -> Endpoint<Target> {\n        return Endpoint(\n            url: URL(target: target).absoluteString,\n            sampleResponseClosure: { .networkResponse(200, target.sampleData) },\n            method: target.method,\n            task: target.task,\n            httpHeaderFields: target.headers\n        )\n    }\n\n    public final class func defaultRequestMapping(for endpoint: Endpoint<Target>, closure: RequestResultClosure) {\n        do {\n            let urlRequest = try endpoint.urlRequest()\n            closure(.success(urlRequest))\n        } catch MoyaError.requestMapping(let url) {\n            closure(.failure(MoyaError.requestMapping(url)))\n        } catch MoyaError.parameterEncoding(let error) {\n            closure(.failure(MoyaError.parameterEncoding(error)))\n        } catch {\n            closure(.failure(MoyaError.underlying(error, nil)))\n        }\n    }\n\n    public final class func defaultAlamofireManager() -> Manager {\n        let configuration = URLSessionConfiguration.default\n        configuration.httpAdditionalHeaders = Manager.defaultHTTPHeaders\n\n        let manager = Manager(configuration: configuration)\n        manager.startRequestsImmediately = false\n        return manager\n    }\n}\n"
  },
  {
    "path": "Pods/Moya/Sources/Moya/MoyaProvider+Internal.swift",
    "content": "import Foundation\nimport Result\n\n// MARK: - Method\n\nextension Method {\n    public var supportsMultipart: Bool {\n        switch self {\n        case .post, .put, .patch, .connect:\n            return true\n        case .get, .delete, .head, .options, .trace:\n            return false\n        }\n    }\n}\n\n// MARK: - MoyaProvider\n\n/// Internal extension to keep the inner-workings outside the main Moya.swift file.\npublic extension MoyaProvider {\n    /// Performs normal requests.\n    func requestNormal(_ target: Target, callbackQueue: DispatchQueue?, progress: Moya.ProgressBlock?, completion: @escaping Moya.Completion) -> Cancellable {\n        let endpoint = self.endpoint(target)\n        let stubBehavior = self.stubClosure(target)\n        let cancellableToken = CancellableWrapper()\n\n        // Allow plugins to modify response\n        let pluginsWithCompletion: Moya.Completion = { result in\n            let processedResult = self.plugins.reduce(result) { $1.process($0, target: target) }\n            completion(processedResult)\n        }\n\n        if trackInflights {\n            objc_sync_enter(self)\n            var inflightCompletionBlocks = self.inflightRequests[endpoint]\n            inflightCompletionBlocks?.append(pluginsWithCompletion)\n            self.inflightRequests[endpoint] = inflightCompletionBlocks\n            objc_sync_exit(self)\n\n            if inflightCompletionBlocks != nil {\n                return cancellableToken\n            } else {\n                objc_sync_enter(self)\n                self.inflightRequests[endpoint] = [pluginsWithCompletion]\n                objc_sync_exit(self)\n            }\n        }\n\n        let performNetworking = { (requestResult: Result<URLRequest, MoyaError>) in\n            if cancellableToken.isCancelled {\n                self.cancelCompletion(pluginsWithCompletion, target: target)\n                return\n            }\n\n            var request: URLRequest!\n\n            switch requestResult {\n            case .success(let urlRequest):\n                request = urlRequest\n            case .failure(let error):\n                pluginsWithCompletion(.failure(error))\n                return\n            }\n\n            // Allow plugins to modify request\n            let preparedRequest = self.plugins.reduce(request) { $1.prepare($0, target: target) }\n\n            let networkCompletion: Moya.Completion = { result in\n              if self.trackInflights {\n                self.inflightRequests[endpoint]?.forEach { $0(result) }\n\n                objc_sync_enter(self)\n                self.inflightRequests.removeValue(forKey: endpoint)\n                objc_sync_exit(self)\n              } else {\n                pluginsWithCompletion(result)\n              }\n            }\n\n            cancellableToken.innerCancellable = self.performRequest(target, request: preparedRequest, callbackQueue: callbackQueue, progress: progress, completion: networkCompletion, endpoint: endpoint, stubBehavior: stubBehavior)\n        }\n\n        requestClosure(endpoint, performNetworking)\n\n        return cancellableToken\n    }\n\n    // swiftlint:disable:next function_parameter_count\n    private func performRequest(_ target: Target, request: URLRequest, callbackQueue: DispatchQueue?, progress: Moya.ProgressBlock?, completion: @escaping Moya.Completion, endpoint: Endpoint<Target>, stubBehavior: Moya.StubBehavior) -> Cancellable {\n        switch stubBehavior {\n        case .never:\n            switch target.task {\n            case .requestPlain, .requestData, .requestJSONEncodable, .requestParameters, .requestCompositeData, .requestCompositeParameters:\n                return self.sendRequest(target, request: request, callbackQueue: callbackQueue, progress: progress, completion: completion)\n            case .uploadFile(let file):\n                return self.sendUploadFile(target, request: request, callbackQueue: callbackQueue, file: file, progress: progress, completion: completion)\n            case .uploadMultipart(let multipartBody), .uploadCompositeMultipart(let multipartBody, _):\n                guard !multipartBody.isEmpty && target.method.supportsMultipart else {\n                    fatalError(\"\\(target) is not a multipart upload target.\")\n                }\n                return self.sendUploadMultipart(target, request: request, callbackQueue: callbackQueue, multipartBody: multipartBody, progress: progress, completion: completion)\n            case .downloadDestination(let destination), .downloadParameters(_, _, let destination):\n                return self.sendDownloadRequest(target, request: request, callbackQueue: callbackQueue, destination: destination, progress: progress, completion: completion)\n            }\n        default:\n            return self.stubRequest(target, request: request, callbackQueue: callbackQueue, completion: completion, endpoint: endpoint, stubBehavior: stubBehavior)\n        }\n    }\n\n    func cancelCompletion(_ completion: Moya.Completion, target: Target) {\n        let error = MoyaError.underlying(NSError(domain: NSURLErrorDomain, code: NSURLErrorCancelled, userInfo: nil), nil)\n        plugins.forEach { $0.didReceive(.failure(error), target: target) }\n        completion(.failure(error))\n    }\n\n    /// Creates a function which, when called, executes the appropriate stubbing behavior for the given parameters.\n    public final func createStubFunction(_ token: CancellableToken, forTarget target: Target, withCompletion completion: @escaping Moya.Completion, endpoint: Endpoint<Target>, plugins: [PluginType], request: URLRequest) -> (() -> Void) { // swiftlint:disable:this function_parameter_count\n        return {\n            if token.isCancelled {\n                self.cancelCompletion(completion, target: target)\n                return\n            }\n\n            switch endpoint.sampleResponseClosure() {\n            case .networkResponse(let statusCode, let data):\n                let response = Moya.Response(statusCode: statusCode, data: data, request: request, response: nil)\n                plugins.forEach { $0.didReceive(.success(response), target: target) }\n                completion(.success(response))\n            case .response(let customResponse, let data):\n                let response = Moya.Response(statusCode: customResponse.statusCode, data: data, request: request, response: customResponse)\n                plugins.forEach { $0.didReceive(.success(response), target: target) }\n                completion(.success(response))\n            case .networkError(let error):\n                let error = MoyaError.underlying(error, nil)\n                plugins.forEach { $0.didReceive(.failure(error), target: target) }\n                completion(.failure(error))\n            }\n        }\n    }\n\n    /// Notify all plugins that a stub is about to be performed. You must call this if overriding `stubRequest`.\n    final func notifyPluginsOfImpendingStub(for request: URLRequest, target: Target) {\n        let alamoRequest = manager.request(request as URLRequestConvertible)\n        plugins.forEach { $0.willSend(alamoRequest, target: target) }\n        alamoRequest.cancel()\n    }\n}\n\nprivate extension MoyaProvider {\n    func sendUploadMultipart(_ target: Target, request: URLRequest, callbackQueue: DispatchQueue?, multipartBody: [MultipartFormData], progress: Moya.ProgressBlock? = nil, completion: @escaping Moya.Completion) -> CancellableWrapper {\n        let cancellable = CancellableWrapper()\n\n        let multipartFormData: (RequestMultipartFormData) -> Void = { form in\n            for bodyPart in multipartBody {\n                switch bodyPart.provider {\n                case .data(let data):\n                    form.append(data: data, bodyPart: bodyPart)\n                case .file(let url):\n                    form.append(fileURL: url, bodyPart: bodyPart)\n                case .stream(let stream, let length):\n                    form.append(stream: stream, length: length, bodyPart: bodyPart)\n                }\n            }\n        }\n\n        manager.upload(multipartFormData: multipartFormData, with: request) { result in\n            switch result {\n            case .success(let alamoRequest, _, _):\n                if cancellable.isCancelled {\n                    self.cancelCompletion(completion, target: target)\n                    return\n                }\n                cancellable.innerCancellable = self.sendAlamofireRequest(alamoRequest, target: target, callbackQueue: callbackQueue, progress: progress, completion: completion)\n            case .failure(let error):\n                completion(.failure(MoyaError.underlying(error as NSError, nil)))\n            }\n        }\n\n        return cancellable\n    }\n\n    func sendUploadFile(_ target: Target, request: URLRequest, callbackQueue: DispatchQueue?, file: URL, progress: ProgressBlock? = nil, completion: @escaping Completion) -> CancellableToken {\n        let uploadRequest = manager.upload(file, with: request)\n        let alamoRequest = target.validate ? uploadRequest.validate() : uploadRequest\n        return self.sendAlamofireRequest(alamoRequest, target: target, callbackQueue: callbackQueue, progress: progress, completion: completion)\n    }\n\n    func sendDownloadRequest(_ target: Target, request: URLRequest, callbackQueue: DispatchQueue?, destination: @escaping DownloadDestination, progress: ProgressBlock? = nil, completion: @escaping Completion) -> CancellableToken {\n        let downloadRequest = manager.download(request, to: destination)\n        let alamoRequest = target.validate ? downloadRequest.validate() : downloadRequest\n        return self.sendAlamofireRequest(alamoRequest, target: target, callbackQueue: callbackQueue, progress: progress, completion: completion)\n    }\n\n    func sendRequest(_ target: Target, request: URLRequest, callbackQueue: DispatchQueue?, progress: Moya.ProgressBlock?, completion: @escaping Moya.Completion) -> CancellableToken {\n        let initialRequest = manager.request(request as URLRequestConvertible)\n        let alamoRequest = target.validate ? initialRequest.validate() : initialRequest\n        return sendAlamofireRequest(alamoRequest, target: target, callbackQueue: callbackQueue, progress: progress, completion: completion)\n    }\n\n    // swiftlint:disable:next cyclomatic_complexity\n    func sendAlamofireRequest<T>(_ alamoRequest: T, target: Target, callbackQueue: DispatchQueue?, progress progressCompletion: Moya.ProgressBlock?, completion: @escaping Moya.Completion) -> CancellableToken where T: Requestable, T: Request {\n        // Give plugins the chance to alter the outgoing request\n        let plugins = self.plugins\n        plugins.forEach { $0.willSend(alamoRequest, target: target) }\n\n        var progressAlamoRequest = alamoRequest\n        let progressClosure: (Progress) -> Void = { progress in\n            let sendProgress: () -> Void = {\n                progressCompletion?(ProgressResponse(progress: progress))\n            }\n\n            if let callbackQueue = callbackQueue {\n                callbackQueue.async(execute: sendProgress)\n            } else {\n                sendProgress()\n            }\n        }\n\n        // Perform the actual request\n        if progressCompletion != nil {\n            switch progressAlamoRequest {\n            case let downloadRequest as DownloadRequest:\n                if let downloadRequest = downloadRequest.downloadProgress(closure: progressClosure) as? T {\n                    progressAlamoRequest = downloadRequest\n                }\n            case let uploadRequest as UploadRequest:\n                if let uploadRequest = uploadRequest.uploadProgress(closure: progressClosure) as? T {\n                    progressAlamoRequest = uploadRequest\n                }\n            case let dataRequest as DataRequest:\n                if let dataRequest = dataRequest.downloadProgress(closure: progressClosure) as? T {\n                    progressAlamoRequest = dataRequest\n                }\n            default: break\n            }\n        }\n\n        let completionHandler: RequestableCompletion = { response, request, data, error in\n            let result = convertResponseToResult(response, request: request, data: data, error: error)\n            // Inform all plugins about the response\n            plugins.forEach { $0.didReceive(result, target: target) }\n            if let progressCompletion = progressCompletion {\n                switch progressAlamoRequest {\n                case let downloadRequest as DownloadRequest:\n                    progressCompletion(ProgressResponse(progress: downloadRequest.progress, response: result.value))\n                case let uploadRequest as UploadRequest:\n                    progressCompletion(ProgressResponse(progress: uploadRequest.uploadProgress, response: result.value))\n                case let dataRequest as DataRequest:\n                    progressCompletion(ProgressResponse(progress: dataRequest.progress, response: result.value))\n                default:\n                    progressCompletion(ProgressResponse(response: result.value))\n                }\n            }\n            completion(result)\n        }\n\n        progressAlamoRequest = progressAlamoRequest.response(callbackQueue: callbackQueue, completionHandler: completionHandler)\n\n        progressAlamoRequest.resume()\n\n        return CancellableToken(request: progressAlamoRequest)\n    }\n}\n"
  },
  {
    "path": "Pods/Moya/Sources/Moya/MoyaProvider.swift",
    "content": "import Foundation\nimport Result\n\n/// Closure to be executed when a request has completed.\npublic typealias Completion = (_ result: Result<Moya.Response, MoyaError>) -> Void\n\n/// Closure to be executed when progress changes.\npublic typealias ProgressBlock = (_ progress: ProgressResponse) -> Void\n\npublic struct ProgressResponse {\n    public let response: Response?\n    public let progressObject: Progress?\n\n    public init(progress: Progress? = nil, response: Response? = nil) {\n        self.progressObject = progress\n        self.response = response\n    }\n\n    public var progress: Double {\n        return progressObject?.fractionCompleted ?? 1.0\n    }\n\n    public var completed: Bool {\n        return progress == 1.0 && response != nil\n    }\n}\n\npublic protocol MoyaProviderType: class {\n    associatedtype Target: TargetType\n\n    func request(_ target: Target, callbackQueue: DispatchQueue?, progress: Moya.ProgressBlock?, completion: @escaping Moya.Completion) -> Cancellable\n}\n\n/// Request provider class. Requests should be made through this class only.\nopen class MoyaProvider<Target: TargetType>: MoyaProviderType {\n\n    /// Closure that defines the endpoints for the provider.\n    public typealias EndpointClosure = (Target) -> Endpoint<Target>\n\n    /// Closure that decides if and what request should be performed\n    public typealias RequestResultClosure = (Result<URLRequest, MoyaError>) -> Void\n\n    /// Closure that resolves an `Endpoint` into a `RequestResult`.\n    public typealias RequestClosure = (Endpoint<Target>, @escaping RequestResultClosure) -> Void\n\n    /// Closure that decides if/how a request should be stubbed.\n    public typealias StubClosure = (Target) -> Moya.StubBehavior\n\n    open let endpointClosure: EndpointClosure\n    open let requestClosure: RequestClosure\n    open let stubClosure: StubClosure\n    open let manager: Manager\n\n    /// A list of plugins\n    /// e.g. for logging, network activity indicator or credentials\n    open let plugins: [PluginType]\n\n    open let trackInflights: Bool\n\n    open internal(set) var inflightRequests: [Endpoint<Target>: [Moya.Completion]] = [:]\n\n    /// Propagated to Alamofire as callback queue. If nil - the Alamofire default (as of their API in 2017 - the main queue) will be used.\n    let callbackQueue: DispatchQueue?\n\n    /// Initializes a provider.\n    public init(endpointClosure: @escaping EndpointClosure = MoyaProvider.defaultEndpointMapping,\n                requestClosure: @escaping RequestClosure = MoyaProvider.defaultRequestMapping,\n                stubClosure: @escaping StubClosure = MoyaProvider.neverStub,\n                callbackQueue: DispatchQueue? = nil,\n                manager: Manager = MoyaProvider<Target>.defaultAlamofireManager(),\n                plugins: [PluginType] = [],\n                trackInflights: Bool = false) {\n\n        self.endpointClosure = endpointClosure\n        self.requestClosure = requestClosure\n        self.stubClosure = stubClosure\n        self.manager = manager\n        self.plugins = plugins\n        self.trackInflights = trackInflights\n        self.callbackQueue = callbackQueue\n    }\n\n    /// Returns an `Endpoint` based on the token, method, and parameters by invoking the `endpointClosure`.\n    open func endpoint(_ token: Target) -> Endpoint<Target> {\n        return endpointClosure(token)\n    }\n\n    /// Designated request-making method. Returns a `Cancellable` token to cancel the request later.\n    @discardableResult\n    open func request(_ target: Target,\n                      callbackQueue: DispatchQueue? = .none,\n                      progress: ProgressBlock? = .none,\n                      completion: @escaping Completion) -> Cancellable {\n\n        let callbackQueue = callbackQueue ?? self.callbackQueue\n        return requestNormal(target, callbackQueue: callbackQueue, progress: progress, completion: completion)\n    }\n\n    // swiftlint:disable function_parameter_count\n    /// When overriding this method, take care to `notifyPluginsOfImpendingStub` and to perform the stub using the `createStubFunction` method.\n    /// Note: this was previously in an extension, however it must be in the original class declaration to allow subclasses to override.\n    @discardableResult\n    open func stubRequest(_ target: Target, request: URLRequest, callbackQueue: DispatchQueue?, completion: @escaping Moya.Completion, endpoint: Endpoint<Target>, stubBehavior: Moya.StubBehavior) -> CancellableToken {\n        let callbackQueue = callbackQueue ?? self.callbackQueue\n        let cancellableToken = CancellableToken { }\n        notifyPluginsOfImpendingStub(for: request, target: target)\n        let plugins = self.plugins\n        let stub: () -> Void = createStubFunction(cancellableToken, forTarget: target, withCompletion: completion, endpoint: endpoint, plugins: plugins, request: request)\n        switch stubBehavior {\n        case .immediate:\n            switch callbackQueue {\n            case .none:\n                stub()\n            case .some(let callbackQueue):\n                callbackQueue.async(execute: stub)\n            }\n        case .delayed(let delay):\n            let killTimeOffset = Int64(CDouble(delay) * CDouble(NSEC_PER_SEC))\n            let killTime = DispatchTime.now() + Double(killTimeOffset) / Double(NSEC_PER_SEC)\n            (callbackQueue ?? DispatchQueue.main).asyncAfter(deadline: killTime) {\n                stub()\n            }\n        case .never:\n            fatalError(\"Method called to stub request when stubbing is disabled.\")\n        }\n\n        return cancellableToken\n    }\n    // swiftlint:enable function_parameter_count\n}\n\n/// Mark: Stubbing\n\n/// Controls how stub responses are returned.\npublic enum StubBehavior {\n\n    /// Do not stub.\n    case never\n\n    /// Return a response immediately.\n    case immediate\n\n    /// Return a response after a delay.\n    case delayed(seconds: TimeInterval)\n}\n\npublic extension MoyaProvider {\n\n    // Swift won't let us put the StubBehavior enum inside the provider class, so we'll\n    // at least add some class functions to allow easy access to common stubbing closures.\n\n    public final class func neverStub(_: Target) -> Moya.StubBehavior {\n        return .never\n    }\n\n    public final class func immediatelyStub(_: Target) -> Moya.StubBehavior {\n        return .immediate\n    }\n\n    public final class func delayedStub(_ seconds: TimeInterval) -> (Target) -> Moya.StubBehavior {\n        return { _ in return .delayed(seconds: seconds) }\n    }\n}\n\npublic func convertResponseToResult(_ response: HTTPURLResponse?, request: URLRequest?, data: Data?, error: Swift.Error?) ->\n    Result<Moya.Response, MoyaError> {\n        switch (response, data, error) {\n        case let (.some(response), data, .none):\n            let response = Moya.Response(statusCode: response.statusCode, data: data ?? Data(), request: request, response: response)\n            return .success(response)\n        case let (.some(response), _, .some(error)):\n            let response = Moya.Response(statusCode: response.statusCode, data: data ?? Data(), request: request, response: response)\n            let error = MoyaError.underlying(error, response)\n            return .failure(error)\n        case let (_, _, .some(error)):\n            let error = MoyaError.underlying(error, nil)\n            return .failure(error)\n        default:\n            let error = MoyaError.underlying(NSError(domain: NSURLErrorDomain, code: NSURLErrorUnknown, userInfo: nil), nil)\n            return .failure(error)\n        }\n}\n"
  },
  {
    "path": "Pods/Moya/Sources/Moya/MultiTarget.swift",
    "content": "import Foundation\n\n/// A `TargetType` used to enable `MoyaProvider` to process multiple `TargetType`s.\npublic enum MultiTarget: TargetType {\n    /// The embedded `TargetType`.\n    case target(TargetType)\n\n    public init(_ target: TargetType) {\n        self = MultiTarget.target(target)\n    }\n\n    public var path: String {\n        return target.path\n    }\n\n    public var baseURL: URL {\n        return target.baseURL\n    }\n\n    public var method: Moya.Method {\n        return target.method\n    }\n\n    public var sampleData: Data {\n        return target.sampleData\n    }\n\n    public var task: Task {\n        return target.task\n    }\n\n    public var validate: Bool {\n        return target.validate\n    }\n\n    public var headers: [String: String]? {\n        return target.headers\n    }\n\n    /// The embedded `TargetType`.\n    public var target: TargetType {\n        switch self {\n        case .target(let t): return t\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/Moya/Sources/Moya/MultipartFormData.swift",
    "content": "import Foundation\n\n/// Represents \"multipart/form-data\" for an upload.\npublic struct MultipartFormData {\n\n    /// Method to provide the form data.\n    public enum FormDataProvider {\n        case data(Foundation.Data)\n        case file(URL)\n        case stream(InputStream, UInt64)\n    }\n\n    /// Initialize a new `MultipartFormData`.\n    public init(provider: FormDataProvider, name: String, fileName: String? = nil, mimeType: String? = nil) {\n        self.provider = provider\n        self.name = name\n        self.fileName = fileName\n        self.mimeType = mimeType\n    }\n\n    /// The method being used for providing form data.\n    public let provider: FormDataProvider\n\n    /// The name.\n    public let name: String\n\n    /// The file name.\n    public let fileName: String?\n\n    /// The MIME type\n    public let mimeType: String?\n}\n\n// MARK: RequestMultipartFormData appending\ninternal extension RequestMultipartFormData {\n    func append(data: Data, bodyPart: MultipartFormData) {\n        if let mimeType = bodyPart.mimeType {\n            if let fileName = bodyPart.fileName {\n                append(data, withName: bodyPart.name, fileName: fileName, mimeType: mimeType)\n            } else {\n                append(data, withName: bodyPart.name, mimeType: mimeType)\n            }\n        } else {\n            append(data, withName: bodyPart.name)\n        }\n    }\n\n    func append(fileURL url: URL, bodyPart: MultipartFormData) {\n        if let fileName = bodyPart.fileName, let mimeType = bodyPart.mimeType {\n            append(url, withName: bodyPart.name, fileName: fileName, mimeType: mimeType)\n        } else {\n            append(url, withName: bodyPart.name)\n        }\n    }\n\n    func append(stream: InputStream, length: UInt64, bodyPart: MultipartFormData) {\n        append(stream, withLength: length, name: bodyPart.name, fileName: bodyPart.fileName ?? \"\", mimeType: bodyPart.mimeType ?? \"\")\n    }\n}\n"
  },
  {
    "path": "Pods/Moya/Sources/Moya/Plugin.swift",
    "content": "import Foundation\nimport Result\n\n/// A Moya Plugin receives callbacks to perform side effects wherever a request is sent or received.\n///\n/// for example, a plugin may be used to\n///     - log network requests\n///     - hide and show a network activity indicator\n///     - inject additional information into a request\npublic protocol PluginType {\n    /// Called to modify a request before sending\n    func prepare(_ request: URLRequest, target: TargetType) -> URLRequest\n\n    /// Called immediately before a request is sent over the network (or stubbed).\n    func willSend(_ request: RequestType, target: TargetType)\n\n    /// Called after a response has been received, but before the MoyaProvider has invoked its completion handler.\n    func didReceive(_ result: Result<Moya.Response, MoyaError>, target: TargetType)\n\n    /// Called to modify a result before completion\n    func process(_ result: Result<Moya.Response, MoyaError>, target: TargetType) -> Result<Moya.Response, MoyaError>\n}\n\npublic extension PluginType {\n    func prepare(_ request: URLRequest, target: TargetType) -> URLRequest { return request }\n    func willSend(_ request: RequestType, target: TargetType) { }\n    func didReceive(_ result: Result<Moya.Response, MoyaError>, target: TargetType) { }\n    func process(_ result: Result<Moya.Response, MoyaError>, target: TargetType) -> Result<Moya.Response, MoyaError> { return result }\n}\n\n/// Request type used by `willSend` plugin function.\npublic protocol RequestType {\n\n    // Note:\n    //\n    // We use this protocol instead of the Alamofire request to avoid leaking that abstraction.\n    // A plugin should not know about Alamofire at all.\n\n    /// Retrieve an `NSURLRequest` representation.\n    var request: URLRequest? { get }\n\n    /// Authenticates the request with a username and password.\n    func authenticate(user: String, password: String, persistence: URLCredential.Persistence) -> Self\n\n    /// Authenticates the request with an `NSURLCredential` instance.\n    func authenticate(usingCredential credential: URLCredential) -> Self\n}\n"
  },
  {
    "path": "Pods/Moya/Sources/Moya/Plugins/AccessTokenPlugin.swift",
    "content": "import Foundation\nimport Result\n\n// MARK: - AccessTokenAuthorizable\n\n/// A protocol for controlling the behavior of `AccessTokenPlugin`.\npublic protocol AccessTokenAuthorizable {\n\n    /// Represents the authorization header to use for requests.\n    var authorizationType: AuthorizationType { get }\n}\n\n// MARK: - AuthorizationType\n\n/// An enum representing the header to use with an `AccessTokenPlugin`\npublic enum AuthorizationType: String {\n    case none\n    case basic = \"Basic\"\n    case bearer = \"Bearer\"\n}\n\n// MARK: - AccessTokenPlugin\n\n/**\n A plugin for adding basic or bearer-type authorization headers to requests. Example:\n\n ```\n Authorization: Bearer <token>\n Authorization: Basic <token>\n ```\n\n*/\npublic struct AccessTokenPlugin: PluginType {\n\n    /// A closure returning the access token to be applied in the header.\n    public let tokenClosure: () -> String\n\n    /**\n     Initialize a new `AccessTokenPlugin`.\n\n     - parameters:\n       - tokenClosure: A closure returning the token to be applied in the pattern `Authorization: <AuthorizationType> <token>`\n    */\n    public init(tokenClosure: @escaping @autoclosure () -> String) {\n        self.tokenClosure = tokenClosure\n    }\n\n    /**\n     Prepare a request by adding an authorization header if necessary.\n\n     - parameters:\n       - request: The request to modify.\n       - target: The target of the request.\n     - returns: The modified `URLRequest`.\n    */\n    public func prepare(_ request: URLRequest, target: TargetType) -> URLRequest {\n        guard let authorizable = target as? AccessTokenAuthorizable else { return request }\n\n        let authorizationType = authorizable.authorizationType\n\n        var request = request\n\n        switch authorizationType {\n        case .basic, .bearer:\n            let authValue = authorizationType.rawValue + \" \" + tokenClosure()\n            request.addValue(authValue, forHTTPHeaderField: \"Authorization\")\n        case .none:\n            break\n        }\n\n        return request\n    }\n}\n"
  },
  {
    "path": "Pods/Moya/Sources/Moya/Plugins/CredentialsPlugin.swift",
    "content": "import Foundation\nimport Result\n\n/// Provides each request with optional URLCredentials.\npublic final class CredentialsPlugin: PluginType {\n\n    public typealias CredentialClosure = (TargetType) -> URLCredential?\n    let credentialsClosure: CredentialClosure\n\n    public init(credentialsClosure: @escaping CredentialClosure) {\n        self.credentialsClosure = credentialsClosure\n    }\n\n    // MARK: Plugin\n\n    public func willSend(_ request: RequestType, target: TargetType) {\n        if let credentials = credentialsClosure(target) {\n            _ = request.authenticate(usingCredential: credentials)\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/Moya/Sources/Moya/Plugins/NetworkActivityPlugin.swift",
    "content": "import Foundation\nimport Result\n\n/// Network activity change notification type.\npublic enum NetworkActivityChangeType {\n    case began, ended\n}\n\n/// Notify a request's network activity changes (request begins or ends).\npublic final class NetworkActivityPlugin: PluginType {\n\n    public typealias NetworkActivityClosure = (_ change: NetworkActivityChangeType, _ target: TargetType) -> Void\n    let networkActivityClosure: NetworkActivityClosure\n\n    public init(networkActivityClosure: @escaping NetworkActivityClosure) {\n        self.networkActivityClosure = networkActivityClosure\n    }\n\n    // MARK: Plugin\n\n    /// Called by the provider as soon as the request is about to start\n    public func willSend(_ request: RequestType, target: TargetType) {\n        networkActivityClosure(.began, target)\n    }\n\n    /// Called by the provider as soon as a response arrives, even if the request is canceled.\n    public func didReceive(_ result: Result<Moya.Response, MoyaError>, target: TargetType) {\n        networkActivityClosure(.ended, target)\n    }\n}\n"
  },
  {
    "path": "Pods/Moya/Sources/Moya/Plugins/NetworkLoggerPlugin.swift",
    "content": "import Foundation\nimport Result\n\n/// Logs network activity (outgoing requests and incoming responses).\npublic final class NetworkLoggerPlugin: PluginType {\n    fileprivate let loggerId = \"Moya_Logger\"\n    fileprivate let dateFormatString = \"dd/MM/yyyy HH:mm:ss\"\n    fileprivate let dateFormatter = DateFormatter()\n    fileprivate let separator = \", \"\n    fileprivate let terminator = \"\\n\"\n    fileprivate let cURLTerminator = \"\\\\\\n\"\n    fileprivate let output: (_ separator: String, _ terminator: String, _ items: Any...) -> Void\n    fileprivate let requestDataFormatter: ((Data) -> (String))?\n    fileprivate let responseDataFormatter: ((Data) -> (Data))?\n\n    /// If true, also logs response body data.\n    public let isVerbose: Bool\n    public let cURL: Bool\n\n    public init(verbose: Bool = false, cURL: Bool = false, output: ((_ separator: String, _ terminator: String, _ items: Any...) -> Void)? = nil, requestDataFormatter: ((Data) -> (String))? = nil, responseDataFormatter: ((Data) -> (Data))? = nil) {\n        self.cURL = cURL\n        self.isVerbose = verbose\n        self.output = output ?? NetworkLoggerPlugin.reversedPrint\n        self.requestDataFormatter = requestDataFormatter\n        self.responseDataFormatter = responseDataFormatter\n    }\n\n    public func willSend(_ request: RequestType, target: TargetType) {\n        if let request = request as? CustomDebugStringConvertible, cURL {\n            output(separator, terminator, request.debugDescription)\n            return\n        }\n        outputItems(logNetworkRequest(request.request as URLRequest?))\n    }\n\n    public func didReceive(_ result: Result<Moya.Response, MoyaError>, target: TargetType) {\n        if case .success(let response) = result {\n            outputItems(logNetworkResponse(response.response, data: response.data, target: target))\n        } else {\n            outputItems(logNetworkResponse(nil, data: nil, target: target))\n        }\n    }\n\n    fileprivate func outputItems(_ items: [String]) {\n        if isVerbose {\n            items.forEach { output(separator, terminator, $0) }\n        } else {\n            output(separator, terminator, items)\n        }\n    }\n}\n\nprivate extension NetworkLoggerPlugin {\n\n    var date: String {\n        dateFormatter.dateFormat = dateFormatString\n        dateFormatter.locale = Locale(identifier: \"en_US_POSIX\")\n        return dateFormatter.string(from: Date())\n    }\n\n    func format(_ loggerId: String, date: String, identifier: String, message: String) -> String {\n        return \"\\(loggerId): [\\(date)] \\(identifier): \\(message)\"\n    }\n\n    func logNetworkRequest(_ request: URLRequest?) -> [String] {\n\n        var output = [String]()\n\n        output += [format(loggerId, date: date, identifier: \"Request\", message: request?.description ?? \"(invalid request)\")]\n\n        if let headers = request?.allHTTPHeaderFields {\n            output += [format(loggerId, date: date, identifier: \"Request Headers\", message: headers.description)]\n        }\n\n        if let bodyStream = request?.httpBodyStream {\n            output += [format(loggerId, date: date, identifier: \"Request Body Stream\", message: bodyStream.description)]\n        }\n\n        if let httpMethod = request?.httpMethod {\n            output += [format(loggerId, date: date, identifier: \"HTTP Request Method\", message: httpMethod)]\n        }\n\n        if let body = request?.httpBody, let stringOutput = requestDataFormatter?(body) ?? String(data: body, encoding: .utf8), isVerbose {\n            output += [format(loggerId, date: date, identifier: \"Request Body\", message: stringOutput)]\n        }\n\n        return output\n    }\n\n    func logNetworkResponse(_ response: HTTPURLResponse?, data: Data?, target: TargetType) -> [String] {\n        guard let response = response else {\n           return [format(loggerId, date: date, identifier: \"Response\", message: \"Received empty network response for \\(target).\")]\n        }\n\n        var output = [String]()\n\n        output += [format(loggerId, date: date, identifier: \"Response\", message: response.description)]\n\n        if let data = data, let stringData = String(data: responseDataFormatter?(data) ?? data, encoding: String.Encoding.utf8), isVerbose {\n            output += [stringData]\n        }\n\n        return output\n    }\n}\n\nfileprivate extension NetworkLoggerPlugin {\n    static func reversedPrint(_ separator: String, terminator: String, items: Any...) {\n        for item in items {\n            print(item, separator: separator, terminator: terminator)\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/Moya/Sources/Moya/Response.swift",
    "content": "import Foundation\n\n/// Represents a response to a `MoyaProvider.request`.\npublic final class Response: CustomDebugStringConvertible, Equatable {\n    public let statusCode: Int\n    public let data: Data\n    public let request: URLRequest?\n    public let response: HTTPURLResponse?\n\n    /// Initialize a new `Response`.\n    public init(statusCode: Int, data: Data, request: URLRequest? = nil, response: HTTPURLResponse? = nil) {\n        self.statusCode = statusCode\n        self.data = data\n        self.request = request\n        self.response = response\n    }\n\n    /// A text description of the `Response`.\n    public var description: String {\n        return \"Status Code: \\(statusCode), Data Length: \\(data.count)\"\n    }\n\n    /// A text description of the `Response`. Suitable for debugging.\n    public var debugDescription: String {\n        return description\n    }\n\n    public static func == (lhs: Response, rhs: Response) -> Bool {\n        return lhs.statusCode == rhs.statusCode\n            && lhs.data == rhs.data\n            && lhs.response == rhs.response\n    }\n}\n\npublic extension Response {\n\n    /**\n     Returns the `Response` if the `statusCode` falls within the specified range.\n\n     - parameters:\n        - statusCodes: The range of acceptable status codes.\n     - throws: `MoyaError.statusCode` when others are encountered.\n    */\n    public func filter(statusCodes: ClosedRange<Int>) throws -> Response {\n        guard statusCodes.contains(statusCode) else {\n            throw MoyaError.statusCode(self)\n        }\n        return self\n    }\n\n    /**\n     Returns the `Response` if it has the specified `statusCode`.\n\n     - parameters:\n        - statusCode: The acceptable status code.\n     - throws: `MoyaError.statusCode` when others are encountered.\n    */\n    public func filter(statusCode: Int) throws -> Response {\n        return try filter(statusCodes: statusCode...statusCode)\n    }\n\n    /**\n     Returns the `Response` if the `statusCode` falls within the range 200 - 299.\n\n     - throws: `MoyaError.statusCode` when others are encountered.\n    */\n    public func filterSuccessfulStatusCodes() throws -> Response {\n        return try filter(statusCodes: 200...299)\n    }\n\n    /**\n     Returns the `Response` if the `statusCode` falls within the range 200 - 399.\n\n     - throws: `MoyaError.statusCode` when others are encountered.\n    */\n    public func filterSuccessfulStatusAndRedirectCodes() throws -> Response {\n        return try filter(statusCodes: 200...399)\n    }\n\n    /// Maps data received from the signal into a UIImage.\n    func mapImage() throws -> Image {\n        guard let image = Image(data: data) else {\n            throw MoyaError.imageMapping(self)\n        }\n        return image\n    }\n\n    /// Maps data received from the signal into a JSON object.\n    func mapJSON(failsOnEmptyData: Bool = true) throws -> Any {\n        do {\n            return try JSONSerialization.jsonObject(with: data, options: .allowFragments)\n        } catch {\n            if data.count < 1 && !failsOnEmptyData {\n                return NSNull()\n            }\n            throw MoyaError.jsonMapping(self)\n        }\n    }\n\n    /// Maps data received from the signal into a String.\n    ///\n    /// - parameter atKeyPath: Optional key path at which to parse string.\n    public func mapString(atKeyPath keyPath: String? = nil) throws -> String {\n        if let keyPath = keyPath {\n            // Key path was provided, try to parse string at key path\n            guard let jsonDictionary = try mapJSON() as? NSDictionary,\n                let string = jsonDictionary.value(forKeyPath: keyPath) as? String else {\n                    throw MoyaError.stringMapping(self)\n            }\n            return string\n        } else {\n            // Key path was not provided, parse entire response as string\n            guard let string = String(data: data, encoding: .utf8) else {\n                throw MoyaError.stringMapping(self)\n            }\n            return string\n        }\n    }\n\n    /// Maps data received from the signal into a Decodable object.\n    ///\n    /// - parameter atKeyPath: Optional key path at which to parse object.\n    /// - parameter using: A `JSONDecoder` instance which is used to decode data to an object.\n    func map<D: Decodable>(_ type: D.Type, atKeyPath keyPath: String? = nil, using decoder: JSONDecoder = JSONDecoder()) throws -> D {\n        let serializeToData: (Any) throws -> Data? = { (jsonObject) in\n            guard JSONSerialization.isValidJSONObject(jsonObject) else {\n                return nil\n            }\n            do {\n                return try JSONSerialization.data(withJSONObject: jsonObject)\n            } catch {\n                throw MoyaError.jsonMapping(self)\n            }\n        }\n        let jsonData: Data\n        if let keyPath = keyPath {\n            guard let jsonObject = (try mapJSON() as? NSDictionary)?.value(forKeyPath: keyPath) else {\n                throw MoyaError.jsonMapping(self)\n            }\n\n            if let data = try serializeToData(jsonObject) {\n                jsonData = data\n            } else {\n                let wrappedJsonObject = [\"value\": jsonObject]\n                let wrappedJsonData: Data\n                if let data = try serializeToData(wrappedJsonObject) {\n                    wrappedJsonData = data\n                } else {\n                    throw MoyaError.jsonMapping(self)\n                }\n                do {\n                    return try decoder.decode(DecodableWrapper<D>.self, from: wrappedJsonData).value\n                } catch let error {\n                    throw MoyaError.objectMapping(error, self)\n                }\n            }\n        } else {\n            jsonData = data\n        }\n        do {\n            return try decoder.decode(D.self, from: jsonData)\n        } catch let error {\n            throw MoyaError.objectMapping(error, self)\n        }\n    }\n}\n\nprivate struct DecodableWrapper<T: Decodable>: Decodable {\n    let value: T\n}\n"
  },
  {
    "path": "Pods/Moya/Sources/Moya/TargetType.swift",
    "content": "import Foundation\n\n/// The protocol used to define the specifications necessary for a `MoyaProvider`.\npublic protocol TargetType {\n\n    /// The target's base `URL`.\n    var baseURL: URL { get }\n\n    /// The path to be appended to `baseURL` to form the full `URL`.\n    var path: String { get }\n\n    /// The HTTP method used in the request.\n    var method: Moya.Method { get }\n\n    /// Provides stub data for use in testing.\n    var sampleData: Data { get }\n\n    /// The type of HTTP task to be performed.\n    var task: Task { get }\n\n    /// Whether or not to perform Alamofire validation. Defaults to `false`.\n    var validate: Bool { get }\n\n    /// The headers to be used in the request.\n    var headers: [String: String]? { get }\n}\n\npublic extension TargetType {\n    var validate: Bool {\n        return false\n    }\n}\n"
  },
  {
    "path": "Pods/Moya/Sources/Moya/Task.swift",
    "content": "import Foundation\n\n/// Represents an HTTP task.\npublic enum Task {\n\n    /// A request with no additional data.\n    case requestPlain\n\n    /// A requests body set with data.\n    case requestData(Data)\n\n    /// A request body set with `Encodable` type\n    case requestJSONEncodable(Encodable)\n\n    /// A requests body set with encoded parameters.\n    case requestParameters(parameters: [String: Any], encoding: ParameterEncoding)\n\n    /// A requests body set with data, combined with url parameters.\n    case requestCompositeData(bodyData: Data, urlParameters: [String: Any])\n\n    /// A requests body set with encoded parameters combined with url parameters.\n    case requestCompositeParameters(bodyParameters: [String: Any], bodyEncoding: ParameterEncoding, urlParameters: [String: Any])\n\n    /// A file upload task.\n    case uploadFile(URL)\n\n    /// A \"multipart/form-data\" upload task.\n    case uploadMultipart([MultipartFormData])\n\n    /// A \"multipart/form-data\" upload task  combined with url parameters.\n    case uploadCompositeMultipart([MultipartFormData], urlParameters: [String: Any])\n\n    /// A file download task to a destination.\n    case downloadDestination(DownloadDestination)\n\n    /// A file download task to a destination with extra parameters using the given encoding.\n    case downloadParameters(parameters: [String: Any], encoding: ParameterEncoding, destination: DownloadDestination)\n}\n"
  },
  {
    "path": "Pods/Moya/Sources/Moya/URL+Moya.swift",
    "content": "import Foundation\n\npublic extension URL {\n\n    /// Initialize URL from Moya's `TargetType`.\n    init<T: TargetType>(target: T) {\n        // When a TargetType's path is empty, URL.appendingPathComponent may introduce trailing /, which may not be wanted in some cases\n        // See: https://github.com/Moya/Moya/pull/1053\n        // And: https://github.com/Moya/Moya/issues/1049\n        if target.path.isEmpty {\n            self = target.baseURL\n        } else {\n            self = target.baseURL.appendingPathComponent(target.path)\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/Moya/Sources/Moya/URLRequest+Encoding.swift",
    "content": "import Foundation\n\ninternal extension URLRequest {\n\n    mutating func encoded(encodable: Encodable) throws -> URLRequest {\n        do {\n            let encodable = AnyEncodable(encodable)\n            httpBody = try JSONEncoder().encode(encodable)\n\n            let contentTypeHeaderName = \"Content-Type\"\n            if value(forHTTPHeaderField: contentTypeHeaderName) == nil {\n                setValue(\"application/json\", forHTTPHeaderField: contentTypeHeaderName)\n            }\n\n            return self\n        } catch {\n            throw MoyaError.encodableMapping(error)\n        }\n    }\n\n    func encoded(parameters: [String: Any], parameterEncoding: ParameterEncoding) throws -> URLRequest {\n        do {\n            return try parameterEncoding.encode(self, with: parameters)\n        } catch {\n            throw MoyaError.parameterEncoding(error)\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/NSObject+Rx/HasDisposeBag.swift",
    "content": "import Foundation\nimport RxSwift\nimport ObjectiveC\n\nfileprivate var disposeBagContext: UInt8 = 0\n\n/// each HasDisposeBag offers a unique RxSwift DisposeBag instance\npublic protocol HasDisposeBag: class {\n\n    /// a unique RxSwift DisposeBag instance\n    var disposeBag: DisposeBag { get set }\n}\n\nextension HasDisposeBag {\n\n    func synchronizedBag<T>( _ action: () -> T) -> T {\n        objc_sync_enter(self)\n        let result = action()\n        objc_sync_exit(self)\n        return result\n    }\n\n    public var disposeBag: DisposeBag {\n        get {\n            return synchronizedBag {\n                if let disposeObject = objc_getAssociatedObject(self, &disposeBagContext) as? DisposeBag {\n                    return disposeObject\n                }\n                let disposeObject = DisposeBag()\n                objc_setAssociatedObject(self, &disposeBagContext, disposeObject, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n                return disposeObject\n            }\n        }\n\n        set {\n            synchronizedBag {\n                objc_setAssociatedObject(self, &disposeBagContext, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n            }\n        }\n    }\n}\n\n\n\n"
  },
  {
    "path": "Pods/NSObject+Rx/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Ash Furrow\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "Pods/NSObject+Rx/NSObject+Rx.swift",
    "content": "import Foundation\nimport RxSwift\nimport ObjectiveC\n\nfileprivate var disposeBagContext: UInt8 = 0\n\nextension Reactive where Base: AnyObject {\n    func synchronizedBag<T>( _ action: () -> T) -> T {\n        objc_sync_enter(self.base)\n        let result = action()\n        objc_sync_exit(self.base)\n        return result\n    }\n}\n\npublic extension Reactive where Base: AnyObject {\n\n    /// a unique DisposeBag that is related to the Reactive.Base instance only for Reference type\n    public var disposeBag: DisposeBag {\n        get {\n            return synchronizedBag {\n                if let disposeObject = objc_getAssociatedObject(base, &disposeBagContext) as? DisposeBag {\n                    return disposeObject\n                }\n                let disposeObject = DisposeBag()\n                objc_setAssociatedObject(base, &disposeBagContext, disposeObject, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n                return disposeObject\n            }\n        }\n        \n        set {\n            synchronizedBag {\n                objc_setAssociatedObject(base, &disposeBagContext, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/NSObject+Rx/Readme.md",
    "content": "[![Build Status](https://travis-ci.org/RxSwiftCommunity/NSObject-Rx.svg?branch=master)](https://travis-ci.org/RxSwiftCommunity/NSObject-Rx)\n\nNSObject+Rx\n===========\n\nIf you're using [RxSwift](https://github.com/ReactiveX/RxSwift), you've probably encountered the following code more than a few times.\n\n```swift\nclass MyObject: Whatever {\n\tlet disposeBag = DisposeBag()\n\n\t...\n}\n```\n\nYou're actually not the only one; it has been typed many, many times.\n\n[![Search screenshot showing many, many results.](assets/screenshot.png)](https://github.com/search?q=let+disposeBag+%3D+DisposeBag%28%29&type=Code&utf8=✓)\n\nInstead of adding a new property to every object, use this library to add it for you, to any subclass of `NSObject`.\n\n```swift\nthing\n  .bind(to: otherThing)\n  .disposed(by: rx.disposeBag)\n```\n\nSweet.\n\nIt'll work just like a property: when the instance is deinit'd, the `DisposeBag` gets disposed. It's also a read/write property, so you can use your own, too.\n\nIf you want to add a DisposeBag to an Object that does not inherit from NSObject, you can also implement the protocol `HasDisposeBag`, and you're good to go. This protocol provides a default DisposeBag called `disposeBag`.\n\nInstalling\n----------\n\n#### CocoaPods\n\nAdd to your `Podfile`:\n\n```ruby\npod 'NSObject+Rx'\n```\n\nAnd that'll be 👌\n\n#### Carthage\n\nAdd to `Cartfile`:\n```\ngithub \"RxSwiftCommunity/NSObject-Rx\"\n```\nAdd frameworks to your project (no need to \"copy items if needed\")\n\nRun `carthage update` or `carthage update --platform ios` if you target iOS only\n\nAdd run script build phase `/usr/local/bin/carthage copy-frameworks`\nwith input files being:\n\n```\n$(SRCROOT)/Carthage/Build/iOS/RxSwift.framework\n$(SRCROOT)/Carthage/Build/iOS/NSObject_Rx.framework\n```\n\nAnd rule ✌️\n\nContributing\n------------\n\nSource files are in the root directory. We use CocoaPods to develop, check out the unit tests in the Demo project.\n\nLicense\n-------\n\nMIT obvs.\n\n![Tim Cook dancing to the sound of a permissive license.](http://i.imgur.com/mONiWzj.gif)\n"
  },
  {
    "path": "Pods/ObjectMapper/LICENSE",
    "content": "The MIT License (MIT)\nCopyright (c) 2014 Hearst\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "Pods/ObjectMapper/README-CN.md",
    "content": "# ObjectMapper-CN-Guide\n> 文档由Swift老司机活动中心负责翻译，欢迎关注[@SwiftOldDriver](http://weibo.com/6062089411)。翻译有问题可以到 [ObjectMapper-CN-Guide](https://github.com/SwiftOldDriver/ObjectMapper-CN-Guide) 提 PR。\n\n[ObjectMapper](https://github.com/Hearst-DD/ObjectMapper) 是一个使用 Swift 编写的用于 model 对象（类和结构体）和 JSON  之间转换的框架。\n\n- [特性](#特性)\n- [基础使用方法](#基础使用方法)\n- [映射嵌套对象](#映射嵌套对象)\n- [自定义转换规则](#自定义转换规则)\n- [继承](#继承)\n- [泛型对象](#泛型对象)\n- [映射时的上下文对象](#映射时的上下文对象)\n- [ObjectMapper + Alamofire](#objectmapper--alamofire) \n- [ObjectMapper + Realm](#objectmapper--realm)\n- [待完成](#待完成)\n- [安装](#安装)\n\n# 特性:\n- 把 JSON 映射成对象 \n- 把对象映射 JSON\n- 支持嵌套对象 (单独的成员变量、在数组或字典中都可以)\n- 在转换过程支持自定义规则\n- 支持结构体（ Struct ）\n- [Immutable support](#immutablemappable-protocol-beta) (目前还在 beta )\n\n# 基础使用方法\n为了支持映射，类或者结构体只需要实现```Mappable```协议。这个协议包含以下方法：\n```swift\ninit?(map: Map)\nmutating func mapping(map: Map)\n```\nObjectMapper使用自定义的```<-``` 运算符来声明成员变量和 JSON 的映射关系。\n```swift\nclass User: Mappable {\n    var username: String?\n    var age: Int?\n    var weight: Double!\n    var array: [AnyObject]?\n    var dictionary: [String : AnyObject] = [:]\n    var bestFriend: User?                       // 嵌套的 User 对象\n    var friends: [User]?                        // Users 的数组\n    var birthday: NSDate?\n\n    required init?(map: Map) {\n\n    }\n\n    // Mappable\n    func mapping(map: Map) {\n        username    <- map[\"username\"]\n        age         <- map[\"age\"]\n        weight      <- map[\"weight\"]\n        array       <- map[\"arr\"]\n        dictionary  <- map[\"dict\"]\n        bestFriend  <- map[\"best_friend\"]\n        friends     <- map[\"friends\"]\n        birthday    <- (map[\"birthday\"], DateTransform())\n    }\n}\n\nstruct Temperature: Mappable {\n    var celsius: Double?\n    var fahrenheit: Double?\n\n    init?(map: Map) {\n\n    }\n\n    mutating func mapping(map: Map) {\n        celsius \t<- map[\"celsius\"]\n        fahrenheit \t<- map[\"fahrenheit\"]\n    }\n}\n```\n\n一旦你的对象实现了 `Mappable`, ObjectMapper就可以让你轻松的实现和 JSON 之间的转换。\n\n把 JSON 字符串转成 model 对象：\n\n```swift\nlet user = User(JSONString: JSONString)\n```\n\n把一个 model 转成 JSON 字符串：\n\n```swift\nlet JSONString = user.toJSONString(prettyPrint: true)\n```\n\n也可以使用`Mapper.swift`类来完成转换（这个类还额外提供了一些函数来处理一些特殊的情况：\n\n```swift\n// 把 JSON 字符串转成 Model\nlet user = Mapper<User>().map(JSONString: JSONString)\n// 根据 Model 生成 JSON 字符串\nlet JSONString = Mapper().toJSONString(user, prettyPrint: true)\n```\n\nObjectMapper支持以下的类型映射到对象中：\n\n- `Int`\n- `Bool`\n- `Double`\n- `Float`\n- `String`\n- `RawRepresentable` (枚举)\n- `Array<AnyObject>`\n- `Dictionary<String, AnyObject>`\n- `Object<T: Mappable>`\n- `Array<T: Mappable>`\n- `Array<Array<T: Mappable>>`\n- `Set<T: Mappable>` \n- `Dictionary<String, T: Mappable>`\n- `Dictionary<String, Array<T: Mappable>>`\n- 以上所有的 Optional 类型\n- 以上所有的隐式强制解包类型（Implicitly Unwrapped Optional）\n\n## `Mappable` 协议\n\n#### `mutating func mapping(map: Map)` \n所有的映射最后都会调用到这个函数。当解析 JSON 时，这个函数会在对象创建成功后被执行。当生成 JSON 时就只有这个函数会被对象调用。\n\n#### `init?(map: Map)` \n这个可失败的初始化函数是 ObjectMapper 创建对象的时候使用的。开发者可以通过这个函数在映射前校验 JSON 。如果在这个方法里返回 nil 就不会执行 `mapping` 函数。可以通过传入的保存着 JSON 的  `Map` 对象进行校验：\n\n```swift\nrequired init?(map: Map){\n\t// 检查 JSON 里是否有一定要有的 \"name\" 属性\n\tif map.JSONDictionary[\"name\"] == nil {\n\t\treturn nil\n\t}\n}\n```\n\n## `StaticMappable` 协议\n`StaticMappable` 是 `Mappable` 之外的另一种选择。 这个协议可以让开发者通过一个静态函数初始化对象而不是通过 `init?(map: Map)`。\n\n注意: `StaticMappable` 和 `Mappable` 都继承了 `BaseMappable` 协议。 `BaseMappable` 协议声明了 `mapping(map: Map)` 函数。\n\n#### `static func objectForMapping(map: Map) -> BaseMappable?` \nObjectMapper 使用这个函数获取对象后进行映射。开发者需要在这个函数里返回一个实现 `BaseMappable` 对象的实例。这个函数也可以用于：\n\n- 在对象进行映射前校验 JSON \n- 提供一个缓存过的对象用于映射\n- 返回另外一种类型的对象（当然是必须实现了 BaseMappable）用于映射。比如你可能通过检查 JSON 推断出用于映射的对象 ([看这个例子](https://github.com/Hearst-DD/ObjectMapper/blob/master/ObjectMapperTests/ClassClusterTests.swift#L62))。\n\n如果你需要在 extension 里实现 ObjectMapper，你需要选择这个协议而不是 `Mappable` 。\n\n## `ImmutableMappable` Protocol (Beta)\n\n> ⚠️ 这个特性还处于 Beta 阶段。正式发布时 API 可能会完全不同。\n\n使用 `ImmutableMappable` 可以映射不可变的属性。下面的表格展示了 `ImmutableMappable` 和 `Mappable` 的不同：\n\n<table>\n  <tr>\n    <th>ImmutableMappable</th>\n    <th>Mappable</th>\n  </tr>\n  <tr>\n    <th colspan=\"2\">Properties</th>\n  </tr>\n  <tr>\n    <td>\n<pre>\n<strong>let</strong> id: Int\n<strong>let</strong> name: String?\n</pre>\n  </td>\n    <td>\n<pre>\nvar id: Int!\nvar name: String?\n</pre>\n    </td>\n  </tr>\n  <tr>\n    <th colspan=\"2\">JSON -> Model</th>\n  </tr>\n  <tr>\n    <td>\n<pre>\ninit(map: Map) <strong>throws</strong> {\n  id   = <strong>try</strong> map.value(\"id\")\n  name = <strong>try?</strong> map.value(\"name\")\n}\n</pre>\n  </td>\n    <td>\n<pre>\nmutating func mapping(map: Map) {\n  id   <- map[\"id\"]\n  name <- map[\"name\"]\n}\n</pre>\n    </td>\n  </tr>\n  <tr>\n    <th colspan=\"2\">Model -> JSON</th>\n  </tr>\n  <tr>\n    <td>\n<pre>\nmutating func mapping(map: Map) {\n  id   <strong>>>></strong> map[\"id\"]\n  name <strong>>>></strong> map[\"name\"]\n}\n</pre>\n    </td>\n    <td>\n<pre>\nmutating func mapping(map: Map) {\n  id   <- map[\"id\"]\n  name <- map[\"name\"]\n}\n</pre>\n    </td>\n  </tr>\n  <tr>\n    <th colspan=\"2\">Initializing</th>\n  </tr>\n  <tr>\n    <td>\n<pre>\n<strong>try</strong> User(JSONString: JSONString)\n</pre>\n    </td>\n    <td>\n<pre>\nUser(JSONString: JSONString)\n</pre>\n    </td>\n  </tr>\n</table>\n\n#### `init(map: Map) throws`\n\n这个可能抛出异常的初始化函数用于在提供的 `Map` 里映射不可变属性。每个不可变的初始化属性都要在这个初始化函数里初始化。\n\n当发生下列情况时初始化函数会抛出一个错误：\n\n- `Map` 根据提供的键名获取不到对应值\n- `Map` 使用 `Transform` 后没有得到值 \n\n`ImmutableMappable` 使用 `Map.value(_:using:)` 方法从  `Map` 中获取值。因为可能抛出异常，这个方法在使用时需要使用  `try` 关键字。 `Optional` 的属性可以简单的用  `try?` 处理。\n\n```swift\ninit(map: Map) throws {\n    name      = try map.value(\"name\") // throws an error when it fails\n    createdAt = try map.value(\"createdAt\", using: DateTransform()) // throws an error when it fails\n    updatedAt = try? map.value(\"updatedAt\", using: DateTransform()) // optional\n    posts     = (try? map.value(\"posts\")) ?? [] // optional + default value\n}\n```\n\n#### `mutating func mapping(map: Map)`\n\n这个方法是在 Model 转回 JSON 时调用的。因为不可变的属性不能被 `<-` 映射，所以映射回来时需要使用 `>>>` 。\n\n```swift\nmutating func mapping(map: Map) {\n    name      >>> map[\"name\"]\n    createdAt >>> (map[\"createdAt\"], DateTransform())\n    updatedAt >>> (map[\"updatedAt\"], DateTransform())\n    posts     >>> map[\"posts\"]\n}\n```\n# 轻松映射嵌套对象\n\nObjectMapper 支持使用点语法来轻松实现嵌套对象的映射。比如有如下的 JSON 字符串：\n\n```json\n\"distance\" : {\n     \"text\" : \"102 ft\",\n     \"value\" : 31\n}\n```\n你可以通过这种写法直接访问到嵌套对象：\n\n```swift\nfunc mapping(map: Map) {\n    distance <- map[\"distance.value\"]\n}\n```\n嵌套的键名也支持访问数组中的值。如果有一个返回的 JSON 是一个包含 distance 的数组，可以通过这种写法访问：\n\n```\ndistance <- map[\"distances.0.value\"]\n```\n如果你的键名刚好含有 `.` 符号，你需要特别声明关闭上面提到的获取嵌套对象功能：\n\n```swift\nfunc mapping(map: Map) {\n    identifier <- map[\"app.identifier\", nested: false]\n}\n```\n如果刚好有嵌套的对象的键名还有 `.` ,可以在中间加入一个自定义的分割符（[#629](https://github.com/Hearst-DD/ObjectMapper/pull/629)）:\n```swift\nfunc mapping(map: Map) {\n    appName <- map[\"com.myapp.info->com.myapp.name\", delimiter: \"->\"]\n}\n```\n这种情况的 JSON 是这样的：\n\n```json\n\"com.myapp.info\" : {\n     \"com.myapp.name\" : \"SwiftOldDriver\"\n}\n```\n\n# 自定义转换规则\nObjectMapper 也支持在映射时自定义转换规则。如果要使用自定义转换，创建一个 tuple（元祖）包含 ```map[\"field_name\"]``` 和你要使用的变换放在 ```<-``` 的右边：\n\n```swift\nbirthday <- (map[\"birthday\"], DateTransform())\n```\n当解析 JSON 时上面的转换会把 JSON 里面的 Int 值转成一个 NSDate ，如果是对象转为 JSON 时，则会把 NSDate 对象转成 Int 值。\n\n只要实现```TransformType``` 协议就可以轻松的创建自定义的转换规则：\n\n```swift\npublic protocol TransformType {\n    associatedtype Object\n    associatedtype JSON\n\n    func transformFromJSON(_ value: Any?) -> Object?\n    func transformToJSON(_ value: Object?) -> JSON?\n}\n```\n\n### TransformOf\n大多数情况下你都可以使用框架提供的转换类 ```TransformOf``` 来快速的实现一个期望的转换。 ```TransformOf``` 的初始化需要两个类型和两个闭包。两个类型声明了转换的目标类型和源类型，闭包则实现具体转换逻辑。\n\n举个例子，如果你想要把一个 JSON 字符串转成 Int ，你可以像这样使用 ```TransformOf``` ：\n\n```swift\nlet transform = TransformOf<Int, String>(fromJSON: { (value: String?) -> Int? in \n    // 把值从 String? 转成 Int?\n    return Int(value!)\n}, toJSON: { (value: Int?) -> String? in\n    // 把值从 Int? 转成 String?\n    if let value = value {\n        return String(value)\n    }\n    return nil\n})\n\nid <- (map[\"id\"], transform)\n```\n这是一种更省略的写法：\n\n```swift\nid <- (map[\"id\"], TransformOf<Int, String>(fromJSON: { Int($0!) }, toJSON: { $0.map { String($0) } }))\n```\n# 继承\n\n实现了  ```Mappable``` 协议的类可以容易的被继承。当继承一个 mappable 的类时，使用这样的结构：\n\n```swift\nclass Base: Mappable {\n\tvar base: String?\n\t\n\trequired init?(map: Map) {\n\n\t}\n\n\tfunc mapping(map: Map) {\n\t\tbase <- map[\"base\"]\n\t}\n}\n\nclass Subclass: Base {\n\tvar sub: String?\n\n\trequired init?(map: Map) {\n\t\tsuper.init(map)\n\t}\n\n\toverride func mapping(map: Map) {\n\t\tsuper.mapping(map)\n\t\t\n\t\tsub <- map[\"sub\"]\n\t}\n}\n```\n\n注意确认子类中的实现调用了父类中正确的初始化器和映射函数。\n\n# 泛型对象\n\nObjectMapper 可以处理泛型只要这个泛型也实现了`Mappable`协议。看这个例子：\n\n```swift\nclass Result<T: Mappable>: Mappable {\n    var result: T?\n\n    required init?(map: Map){\n\n    }\n\n    func mapping(map: Map) {\n        result <- map[\"result\"]\n    }\n}\n\nlet result = Mapper<Result<User>>().map(JSON)\n```\n# 映射时的上下文对象\n\n`Map` 是在映射时传入的对象，带有一个 optional  `MapContext` 对象，开发者可以通过使用这个对象在映射时传入一些信息。\n\n为了使用这个特性，需要先创建一个对象实现了 `MapContext` 协议（这个协议是空的），然后在初始化时传入 `Mapper` 中。\n\n```swift\nstruct Context: MapContext {\n\tvar importantMappingInfo = \"映射时需要知道的额外信息\"\n}\n\nclass User: Mappable {\n\tvar name: String?\n\t\n\trequired init?(map: Map){\n\t\n\t}\n\t\n\tfunc mapping(map: Map){\n\t\tif let context = map.context as? Context {\n\t\t\t// 获取到额外的信息\n\t\t}\n\t}\n}\n\nlet context = Context()\nlet user = Mapper<User>(context: context).map(JSONString)\n```\n\n# ObjectMapper + Alamofire\n\n如果网络层你使用的是  [Alamofire](https://github.com/Alamofire/Alamofire) ，并且你希望把返回的结果转换成 Swift 对象，你可以使用 [AlamofireObjectMapper](https://github.com/tristanhimmelman/AlamofireObjectMapper) 。这是一个使用 ObjectMapper 实现的把返回的 JSON 自动转成 Swift 对象的 Alamofire 的扩展。 \n\n\n# ObjectMapper + Realm\n\nObjectMapper 可以和 Realm 一起配合使用。使用下面的声明结构就可以使用 ObjectMapper 生成 Realm 对象：\n\n```swift\nclass Model: Object, Mappable {\n\tdynamic var name = \"\"\n\n\trequired convenience init?(map: Map) {\n\t\tself.init()\n\t}\n\n\tfunc mapping(map: Map) {\n\t\tname <- map[\"name\"]\n\t}\n}\n```\n\n如果你想要序列化相关联的 RealmObject，你可以使用 [ObjectMapper+Realm](https://github.com/jakenberg/ObjectMapper-Realm)。这是一个简单的 Realm 扩展，用于把任意的 JSON 序列化成 Realm 的类（ealm's List class。）\n\n注意：使用 ObjectMappers 的 `toJSON` 函数来生成 JSON 字符串只在 Realm 的写事务中有效（write transaction）。这是因为 ObjectMapper 在解析和生成时在映射函数（ `<-` ）中使用  `inout` 作为标记（ flag ）。Realm 会检测到标记并且强制要求 `toJSON` 函数只能在一个写的事务中调用，即使这个对象并没有被修改。\n\n# 待完成\n- 改善错误的处理。可能使用 `throws` 来处理。\n- 相关类的文档完善\n\n# 安装\n### Cocoapods\n如果你的项目使用 [CocoaPods 0.36 及以上](http://blog.cocoapods.org/Pod-Authors-Guide-to-CocoaPods-Frameworks/) 的版本，你可以把下面内容添加到在 `Podfile` 中，将 ObjectMapper 添加到你的项目中:\n\n```ruby\npod 'ObjectMapper', '~> 2.2'\n```\n\n### Carthage\n如果你的项目使用  [Carthage](https://github.com/Carthage/Carthage) ，你可以把下面的内容添加到 `Cartfile` 中，将 ObjectMapper 的依赖到你的项目中：\n\n```\ngithub \"Hearst-DD/ObjectMapper\" ~> 2.2\n```\n\n### Swift Package Manager\n如果你的项目使用  [Swift Package Manager](https://swift.org/package-manager/) ，那么你可以把下面内容添加到 `Package.swift` 中的 `dependencies` 数组中，将 ObjectMapper 的依赖到你的项目中：\n\n```swift\n.Package(url: \"https://github.com/Hearst-DD/ObjectMapper.git\", majorVersion: 2, minor: 2),\n```\n\n\n### Submodule\n此外，ObjectMapper 也可以作为一个 submodule 添加到项目中：\n\n1. 打开终端，使用 `cd` 命令进入项目文件的根目录下，然后在终端中输入 `git submodule add https://github.com/Hearst-DD/ObjectMapper.git` ，把 ObjectMapper 作为项目的一个 [submodule](http://git-scm.com/docs/git-submodule) 添加进来。\n2. 打开 `ObjectMapper` 文件，并将 `ObjectMapper.xcodeproj` 拖进你 app 项目的文件导航中。\n3. 在 Xcode 中，文件导航中点击蓝色项目图标进入到 target 配置界面，在侧边栏的 \"TARGETS\" 下选择主工程对应的target。\n4. 确保 `ObjectMapper.framework` 的部署版本( deployment target )和主工程的部署版本保持一致。\n5. 在配置界面的顶部选项栏中，打开 \"Build Phases\" 面板。\n6. 展开 \"Target Dependencies\" 组，并添加 `ObjectMapper.framework` 。\n7. 点击面板左上角的 `+` 按钮,选择 \"New Copy Files Phase\"。将这个阶段重命名为 \"Copy Frameworks\"，设置  \"Destination\" 为 \"Frameworks\"，最后添加 `ObjectMapper.framework` 。  \n\n\n"
  },
  {
    "path": "Pods/ObjectMapper/Sources/CustomDateFormatTransform.swift",
    "content": "//\n//  CustomDateFormatTransform.swift\n//  ObjectMapper\n//\n//  Created by Dan McCracken on 3/8/15.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2016 Hearst\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\nopen class CustomDateFormatTransform: DateFormatterTransform {\n\t\n    public init(formatString: String) {\n\t\tlet formatter = DateFormatter()\n\t\tformatter.locale = Locale(identifier: \"en_US_POSIX\")\n\t\tformatter.dateFormat = formatString\n\t\t\n\t\tsuper.init(dateFormatter: formatter)\n    }\n}\n"
  },
  {
    "path": "Pods/ObjectMapper/Sources/DataTransform.swift",
    "content": "//\n//  DataTransform.swift\n//  ObjectMapper\n//\n//  Created by Yagrushkin, Evgeny on 8/30/16.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2016 Hearst\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\nopen class DataTransform: TransformType {\n\tpublic typealias Object = Data\n\tpublic typealias JSON = String\n\t\n\tpublic init() {}\n\t\n\topen func transformFromJSON(_ value: Any?) -> Data? {\n\t\tguard let string = value as? String else{\n\t\t\treturn nil\n\t\t}\n\t\treturn Data(base64Encoded: string)\n\t}\n\t\n\topen func transformToJSON(_ value: Data?) -> String? {\n\t\tguard let data = value else{\n\t\t\treturn nil\n\t\t}\n\t\treturn data.base64EncodedString()\n\t}\n}\n"
  },
  {
    "path": "Pods/ObjectMapper/Sources/DateFormatterTransform.swift",
    "content": "//\n//  DateFormatterTransform.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2015-03-09.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2016 Hearst\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\nopen class DateFormatterTransform: TransformType {\n\tpublic typealias Object = Date\n\tpublic typealias JSON = String\n\t\n\tpublic let dateFormatter: DateFormatter\n\t\n\tpublic init(dateFormatter: DateFormatter) {\n\t\tself.dateFormatter = dateFormatter\n\t}\n\t\n\topen func transformFromJSON(_ value: Any?) -> Date? {\n\t\tif let dateString = value as? String {\n\t\t\treturn dateFormatter.date(from: dateString)\n\t\t}\n\t\treturn nil\n\t}\n\t\n\topen func transformToJSON(_ value: Date?) -> String? {\n\t\tif let date = value {\n\t\t\treturn dateFormatter.string(from: date)\n\t\t}\n\t\treturn nil\n\t}\n}\n"
  },
  {
    "path": "Pods/ObjectMapper/Sources/DateTransform.swift",
    "content": "//\n//  DateTransform.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2014-10-13.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2016 Hearst\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\nopen class DateTransform: TransformType {\n\tpublic typealias Object = Date\n\tpublic typealias JSON = Double\n\n\tpublic init() {}\n\n\topen func transformFromJSON(_ value: Any?) -> Date? {\n\t\tif let timeInt = value as? Double {\n\t\t\treturn Date(timeIntervalSince1970: TimeInterval(timeInt))\n\t\t}\n\t\t\n\t\tif let timeStr = value as? String {\n\t\t\treturn Date(timeIntervalSince1970: TimeInterval(atof(timeStr)))\n\t\t}\n\t\t\n\t\treturn nil\n\t}\n\n\topen func transformToJSON(_ value: Date?) -> Double? {\n\t\tif let date = value {\n\t\t\treturn Double(date.timeIntervalSince1970)\n\t\t}\n\t\treturn nil\n\t}\n}\n"
  },
  {
    "path": "Pods/ObjectMapper/Sources/DictionaryTransform.swift",
    "content": "//\n//  DictionaryTransform.swift\n//  ObjectMapper\n//\n//  Created by Milen Halachev on 7/20/16.\n//  Copyright © 2016 hearst. All rights reserved.\n//\n\nimport Foundation\n\n///Transforms [String: AnyObject] <-> [Key: Value] where Key is RawRepresentable as String, Value is Mappable\npublic struct DictionaryTransform<Key, Value>: TransformType where Key: Hashable, Key: RawRepresentable, Key.RawValue == String, Value: Mappable {\n\t\n\tpublic init() {\n\t\t\n\t}\n\t\n\tpublic func transformFromJSON(_ value: Any?) -> [Key: Value]? {\n\t\t\n\t\tguard let json = value as? [String: Any] else {\n\t\t\t\n\t\t\treturn nil\n\t\t}\n\t\t\n\t\tlet result = json.reduce([:]) { (result, element) -> [Key: Value] in\n\t\t\t\n\t\t\tguard\n\t\t\tlet key = Key(rawValue: element.0),\n\t\t\tlet valueJSON = element.1 as? [String: Any],\n\t\t\tlet value = Value(JSON: valueJSON)\n\t\t\telse {\n\t\t\t\t\n\t\t\t\treturn result\n\t\t\t}\n\t\t\t\n\t\t\tvar result = result\n\t\t\tresult[key] = value\n\t\t\treturn result\n\t\t}\n\t\t\n\t\treturn result\n\t}\n\t\n\tpublic func transformToJSON(_ value: [Key: Value]?) -> Any? {\n\t\t\n\t\tlet result = value?.reduce([:]) { (result, element) -> [String: Any] in\n\t\t\t\n\t\t\tlet key = element.0.rawValue\n\t\t\tlet value = element.1.toJSON()\n\t\t\t\n\t\t\tvar result = result\n\t\t\tresult[key] = value\n\t\t\treturn result\n\t\t}\n\t\t\n\t\treturn result\n\t}\n}\n"
  },
  {
    "path": "Pods/ObjectMapper/Sources/EnumOperators.swift",
    "content": "//\n//  EnumOperators.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2016-09-26.\n//  Copyright © 2016 hearst. All rights reserved.\n//\n\nimport Foundation\n\n\n// MARK:- Raw Representable types\n\n/// Object of Raw Representable type\npublic func <- <T: RawRepresentable>(left: inout T, right: Map) {\n\tleft <- (right, EnumTransform())\n}\n\npublic func >>> <T: RawRepresentable>(left: T, right: Map) {\n\tleft >>> (right, EnumTransform())\n}\n\n\n/// Optional Object of Raw Representable type\npublic func <- <T: RawRepresentable>(left: inout T?, right: Map) {\n\tleft <- (right, EnumTransform())\n}\n\npublic func >>> <T: RawRepresentable>(left: T?, right: Map) {\n\tleft >>> (right, EnumTransform())\n}\n\n\n/// Implicitly Unwrapped Optional Object of Raw Representable type\npublic func <- <T: RawRepresentable>(left: inout T!, right: Map) {\n\tleft <- (right, EnumTransform())\n}\n\n// MARK:- Arrays of Raw Representable type\n\n/// Array of Raw Representable object\npublic func <- <T: RawRepresentable>(left: inout [T], right: Map) {\n\tleft <- (right, EnumTransform())\n}\n\npublic func >>> <T: RawRepresentable>(left: [T], right: Map) {\n\tleft >>> (right, EnumTransform())\n}\n\n\n/// Array of Raw Representable object\npublic func <- <T: RawRepresentable>(left: inout [T]?, right: Map) {\n\tleft <- (right, EnumTransform())\n}\n\npublic func >>> <T: RawRepresentable>(left: [T]?, right: Map) {\n\tleft >>> (right, EnumTransform())\n}\n\n\n/// Array of Raw Representable object\npublic func <- <T: RawRepresentable>(left: inout [T]!, right: Map) {\n\tleft <- (right, EnumTransform())\n}\n\n// MARK:- Dictionaries of Raw Representable type\n\n/// Dictionary of Raw Representable object\npublic func <- <T: RawRepresentable>(left: inout [String: T], right: Map) {\n\tleft <- (right, EnumTransform())\n}\n\npublic func >>> <T: RawRepresentable>(left: [String: T], right: Map) {\n\tleft >>> (right, EnumTransform())\n}\n\n\n/// Dictionary of Raw Representable object\npublic func <- <T: RawRepresentable>(left: inout [String: T]?, right: Map) {\n\tleft <- (right, EnumTransform())\n}\n\npublic func >>> <T: RawRepresentable>(left: [String: T]?, right: Map) {\n\tleft >>> (right, EnumTransform())\n}\n\n\n/// Dictionary of Raw Representable object\npublic func <- <T: RawRepresentable>(left: inout [String: T]!, right: Map) {\n\tleft <- (right, EnumTransform())\n}\n"
  },
  {
    "path": "Pods/ObjectMapper/Sources/EnumTransform.swift",
    "content": "//\n//  EnumTransform.swift\n//  ObjectMapper\n//\n//  Created by Kaan Dedeoglu on 3/20/15.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2016 Hearst\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\nopen class EnumTransform<T: RawRepresentable>: TransformType {\n\tpublic typealias Object = T\n\tpublic typealias JSON = T.RawValue\n\t\n\tpublic init() {}\n\t\n\topen func transformFromJSON(_ value: Any?) -> T? {\n\t\tif let raw = value as? T.RawValue {\n\t\t\treturn T(rawValue: raw)\n\t\t}\n\t\treturn nil\n\t}\n\t\n\topen func transformToJSON(_ value: T?) -> T.RawValue? {\n\t\tif let obj = value {\n\t\t\treturn obj.rawValue\n\t\t}\n\t\treturn nil\n\t}\n}\n"
  },
  {
    "path": "Pods/ObjectMapper/Sources/FromJSON.swift",
    "content": "//\n//  FromJSON.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2014-10-09.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2016 Hearst\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\ninternal final class FromJSON {\n\t\n\t/// Basic type\n\tclass func basicType<FieldType>(_ field: inout FieldType, object: FieldType?) {\n\t\tif let value = object {\n\t\t\tfield = value\n\t\t}\n\t}\n\t\n\t/// optional basic type\n\tclass func optionalBasicType<FieldType>(_ field: inout FieldType?, object: FieldType?) {\n\t\tfield = object\n\t}\n\t\n\t/// Implicitly unwrapped optional basic type\n\tclass func optionalBasicType<FieldType>(_ field: inout FieldType!, object: FieldType?) {\n\t\tfield = object\n\t}\n\t\n\t/// Mappable object\n\tclass func object<N: BaseMappable>(_ field: inout N, map: Map) {\n\t\tif map.toObject {\n\t\t\tfield = Mapper(context: map.context).map(JSONObject: map.currentValue, toObject: field)\n\t\t} else if let value: N = Mapper(context: map.context).map(JSONObject: map.currentValue) {\n\t\t\tfield = value\n\t\t}\n\t}\n\t\n\t/// Optional Mappable Object\n\n\tclass func optionalObject<N: BaseMappable>(_ field: inout N?, map: Map) {\n\t\tif let f = field , map.toObject && map.currentValue != nil {\n\t\t\t field = Mapper(context: map.context).map(JSONObject: map.currentValue, toObject: f)\n\t\t} else {\n\t\t\tfield = Mapper(context: map.context).map(JSONObject: map.currentValue)\n\t\t}\n\t}\n\t\n\t/// Implicitly unwrapped Optional Mappable Object\n\tclass func optionalObject<N: BaseMappable>(_ field: inout N!, map: Map) {\n\t\tif let f = field , map.toObject && map.currentValue != nil {\n\t\t\tfield = Mapper(context: map.context).map(JSONObject: map.currentValue, toObject: f)\n\t\t} else {\n\t\t\tfield = Mapper(context: map.context).map(JSONObject: map.currentValue)\n\t\t}\n\t}\n\t\n\t/// mappable object array\n\tclass func objectArray<N: BaseMappable>(_ field: inout Array<N>, map: Map) {\n\t\tif let objects = Mapper<N>(context: map.context).mapArray(JSONObject: map.currentValue) {\n\t\t\tfield = objects\n\t\t}\n\t}\n\t\n\t/// optional mappable object array\n\n\tclass func optionalObjectArray<N: BaseMappable>(_ field: inout Array<N>?, map: Map) {\n\t\tif let objects: Array<N> = Mapper(context: map.context).mapArray(JSONObject: map.currentValue) {\n\t\t\tfield = objects\n\t\t} else {\n\t\t\tfield = nil\n\t\t}\n\t}\n\t\n\t/// Implicitly unwrapped optional mappable object array\n\tclass func optionalObjectArray<N: BaseMappable>(_ field: inout Array<N>!, map: Map) {\n\t\tif let objects: Array<N> = Mapper(context: map.context).mapArray(JSONObject: map.currentValue) {\n\t\t\tfield = objects\n\t\t} else {\n\t\t\tfield = nil\n\t\t}\n\t}\n\t\n\t/// mappable object array\n\tclass func twoDimensionalObjectArray<N: BaseMappable>(_ field: inout Array<Array<N>>, map: Map) {\n\t\tif let objects = Mapper<N>(context: map.context).mapArrayOfArrays(JSONObject: map.currentValue) {\n\t\t\tfield = objects\n\t\t}\n\t}\n\t\n\t/// optional mappable 2 dimentional object array\n\tclass func optionalTwoDimensionalObjectArray<N: BaseMappable>(_ field: inout Array<Array<N>>?, map: Map) {\n\t\tfield = Mapper(context: map.context).mapArrayOfArrays(JSONObject: map.currentValue)\n\t}\n\t\n\t/// Implicitly unwrapped optional 2 dimentional mappable object array\n\tclass func optionalTwoDimensionalObjectArray<N: BaseMappable>(_ field: inout Array<Array<N>>!, map: Map) {\n\t\tfield = Mapper(context: map.context).mapArrayOfArrays(JSONObject: map.currentValue)\n\t}\n\t\n\t/// Dctionary containing Mappable objects\n\tclass func objectDictionary<N: BaseMappable>(_ field: inout Dictionary<String, N>, map: Map) {\n\t\tif map.toObject {\n\t\t\tfield = Mapper<N>(context: map.context).mapDictionary(JSONObject: map.currentValue, toDictionary: field)\n\t\t} else {\n\t\t\tif let objects = Mapper<N>(context: map.context).mapDictionary(JSONObject: map.currentValue) {\n\t\t\t\tfield = objects\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/// Optional dictionary containing Mappable objects\n\tclass func optionalObjectDictionary<N: BaseMappable>(_ field: inout Dictionary<String, N>?, map: Map) {\n\t\tif let f = field , map.toObject && map.currentValue != nil {\n\t\t\tfield = Mapper(context: map.context).mapDictionary(JSONObject: map.currentValue, toDictionary: f)\n\t\t} else {\n\t\t\tfield = Mapper(context: map.context).mapDictionary(JSONObject: map.currentValue)\n\t\t}\n\t}\n\t\n\t/// Implicitly unwrapped Dictionary containing Mappable objects\n\tclass func optionalObjectDictionary<N: BaseMappable>(_ field: inout Dictionary<String, N>!, map: Map) {\n\t\tif let f = field , map.toObject && map.currentValue != nil {\n\t\t\tfield = Mapper(context: map.context).mapDictionary(JSONObject: map.currentValue, toDictionary: f)\n\t\t} else {\n\t\t\tfield = Mapper(context: map.context).mapDictionary(JSONObject: map.currentValue)\n\t\t}\n\t}\n\t\n\t/// Dictionary containing Array of Mappable objects\n\tclass func objectDictionaryOfArrays<N: BaseMappable>(_ field: inout Dictionary<String, [N]>, map: Map) {\n\t\tif let objects = Mapper<N>(context: map.context).mapDictionaryOfArrays(JSONObject: map.currentValue) {\n\t\t\tfield = objects\n\t\t}\n\t}\n\t\n\t/// Optional Dictionary containing Array of Mappable objects\n\tclass func optionalObjectDictionaryOfArrays<N: BaseMappable>(_ field: inout Dictionary<String, [N]>?, map: Map) {\n\t\tfield = Mapper<N>(context: map.context).mapDictionaryOfArrays(JSONObject: map.currentValue)\n\t}\n\t\n\t/// Implicitly unwrapped Dictionary containing Array of Mappable objects\n\tclass func optionalObjectDictionaryOfArrays<N: BaseMappable>(_ field: inout Dictionary<String, [N]>!, map: Map) {\n\t\tfield = Mapper<N>(context: map.context).mapDictionaryOfArrays(JSONObject: map.currentValue)\n\t}\n\t\n\t/// mappable object Set\n\tclass func objectSet<N: BaseMappable>(_ field: inout Set<N>, map: Map) {\n\t\tif let objects = Mapper<N>(context: map.context).mapSet(JSONObject: map.currentValue) {\n\t\t\tfield = objects\n\t\t}\n\t}\n\t\n\t/// optional mappable object array\n\tclass func optionalObjectSet<N: BaseMappable>(_ field: inout Set<N>?, map: Map) {\n\t\tfield = Mapper(context: map.context).mapSet(JSONObject: map.currentValue)\n\t}\n\t\n\t/// Implicitly unwrapped optional mappable object array\n\tclass func optionalObjectSet<N: BaseMappable>(_ field: inout Set<N>!, map: Map) {\n\t\tfield = Mapper(context: map.context).mapSet(JSONObject: map.currentValue)\n\t}\t\n}\n"
  },
  {
    "path": "Pods/ObjectMapper/Sources/HexColorTransform.swift",
    "content": "//\n//  HexColorTransform.swift\n//  ObjectMapper\n//\n//  Created by Vitaliy Kuzmenko on 10/10/16.\n//  Copyright © 2016 hearst. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS) || os(watchOS)\nimport UIKit\n#elseif os(macOS)\nimport Cocoa\n#endif\n\n#if os(iOS) || os(tvOS) || os(watchOS) || os(macOS)\nopen class HexColorTransform: TransformType {\n\t\n\t#if os(iOS) || os(tvOS) || os(watchOS)\n\tpublic typealias Object = UIColor\n\t#else\n\tpublic typealias Object = NSColor\n\t#endif\n\t\n\tpublic typealias JSON = String\n\t\n\tvar prefix: Bool = false\n\t\n\tvar alpha: Bool = false\n\t\n\tpublic init(prefixToJSON: Bool = false, alphaToJSON: Bool = false) {\n\t\talpha = alphaToJSON\n\t\tprefix = prefixToJSON\n\t}\n\t\n\topen func transformFromJSON(_ value: Any?) -> Object? {\n\t\tif let rgba = value as? String {\n\t\t\tif rgba.hasPrefix(\"#\") {\n\t\t\t\tlet index = rgba.index(rgba.startIndex, offsetBy: 1)\n\t\t\t\tlet hex = String(rgba[index...])\n\t\t\t\treturn getColor(hex: hex)\n\t\t\t} else {\n\t\t\t\treturn getColor(hex: rgba)\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\t\n\topen func transformToJSON(_ value: Object?) -> JSON? {\n\t\tif let value = value {\n\t\t\treturn hexString(color: value)\n\t\t}\n\t\treturn nil\n\t}\n\t\n\tfileprivate func hexString(color: Object) -> String {\n\t\tlet comps = color.cgColor.components!\n\t\tlet compsCount = color.cgColor.numberOfComponents\n\t\tlet r: Int\n\t\tlet g: Int\n\t\tvar b: Int\n\t\tlet a = Int(comps[compsCount - 1] * 255)\n\t\tif compsCount == 4 { // RGBA\n\t\t\tr = Int(comps[0] * 255)\n\t\t\tg = Int(comps[1] * 255)\n\t\t\tb = Int(comps[2] * 255)\n\t\t} else { // Grayscale\n\t\t\tr = Int(comps[0] * 255)\n\t\t\tg = Int(comps[0] * 255)\n\t\t\tb = Int(comps[0] * 255)\n\t\t}\n\t\tvar hexString: String = \"\"\n\t\tif prefix {\n\t\t\thexString = \"#\"\n\t\t}\n\t\thexString += String(format: \"%02X%02X%02X\", r, g, b)\n\t\t\n\t\tif alpha {\n\t\t\thexString += String(format: \"%02X\", a)\n\t\t}\n\t\treturn hexString\n\t}\n\t\n\tfileprivate func getColor(hex: String) -> Object? {\n\t\tvar red: CGFloat   = 0.0\n\t\tvar green: CGFloat = 0.0\n\t\tvar blue: CGFloat  = 0.0\n\t\tvar alpha: CGFloat = 1.0\n\t\t\n\t\tlet scanner = Scanner(string: hex)\n\t\tvar hexValue: CUnsignedLongLong = 0\n\t\tif scanner.scanHexInt64(&hexValue) {\n\t\t\tswitch (hex.count) {\n\t\t\tcase 3:\n\t\t\t\tred   = CGFloat((hexValue & 0xF00) >> 8)       / 15.0\n\t\t\t\tgreen = CGFloat((hexValue & 0x0F0) >> 4)       / 15.0\n\t\t\t\tblue  = CGFloat(hexValue & 0x00F)              / 15.0\n\t\t\tcase 4:\n\t\t\t\tred   = CGFloat((hexValue & 0xF000) >> 12)     / 15.0\n\t\t\t\tgreen = CGFloat((hexValue & 0x0F00) >> 8)      / 15.0\n\t\t\t\tblue  = CGFloat((hexValue & 0x00F0) >> 4)      / 15.0\n\t\t\t\talpha = CGFloat(hexValue & 0x000F)             / 15.0\n\t\t\tcase 6:\n\t\t\t\tred   = CGFloat((hexValue & 0xFF0000) >> 16)   / 255.0\n\t\t\t\tgreen = CGFloat((hexValue & 0x00FF00) >> 8)    / 255.0\n\t\t\t\tblue  = CGFloat(hexValue & 0x0000FF)           / 255.0\n\t\t\tcase 8:\n\t\t\t\tred   = CGFloat((hexValue & 0xFF000000) >> 24) / 255.0\n\t\t\t\tgreen = CGFloat((hexValue & 0x00FF0000) >> 16) / 255.0\n\t\t\t\tblue  = CGFloat((hexValue & 0x0000FF00) >> 8)  / 255.0\n\t\t\t\talpha = CGFloat(hexValue & 0x000000FF)         / 255.0\n\t\t\tdefault:\n\t\t\t\t// Invalid RGB string, number of characters after '#' should be either 3, 4, 6 or 8\n\t\t\t\treturn nil\n\t\t\t}\n\t\t} else {\n\t\t\t// \"Scan hex error\n\t\t\treturn nil\n\t\t}\n\t\t#if os(iOS) || os(tvOS) || os(watchOS)\n\t\t\treturn UIColor(red: red, green: green, blue: blue, alpha: alpha)\n\t\t#else\n\t\t\treturn NSColor(calibratedRed: red, green: green, blue: blue, alpha: alpha)\n\t\t#endif\n\t}\n}\n#endif\n"
  },
  {
    "path": "Pods/ObjectMapper/Sources/ISO8601DateTransform.swift",
    "content": "//\n//  ISO8601DateTransform.swift\n//  ObjectMapper\n//\n//  Created by Jean-Pierre Mouilleseaux on 21 Nov 2014.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2016 Hearst\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\npublic extension DateFormatter {\n\tpublic convenience init(withFormat format : String, locale : String) {\n\t\tself.init()\n\t\tself.locale = Locale(identifier: locale)\n\t\tdateFormat = format\n\t}\n}\n\nopen class ISO8601DateTransform: DateFormatterTransform {\n\t\n\tstatic let reusableISODateFormatter = DateFormatter(withFormat: \"yyyy-MM-dd'T'HH:mm:ssZZZZZ\", locale: \"en_US_POSIX\")\n\n\tpublic init() {\n\t\tsuper.init(dateFormatter: ISO8601DateTransform.reusableISODateFormatter)\n\t}\n}\n\n"
  },
  {
    "path": "Pods/ObjectMapper/Sources/ImmutableMappable.swift",
    "content": "//\n//  ImmutableMappble.swift\n//  ObjectMapper\n//\n//  Created by Suyeol Jeon on 23/09/2016.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2016 Hearst\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\npublic protocol ImmutableMappable: BaseMappable {\n\tinit(map: Map) throws\n}\n\npublic extension ImmutableMappable {\n\t\n\t/// Implement this method to support object -> JSON transform.\n\tpublic func mapping(map: Map) {}\n\t\n\t/// Initializes object from a JSON String\n\tpublic init(JSONString: String, context: MapContext? = nil) throws {\n\t\tself = try Mapper(context: context).map(JSONString: JSONString)\n\t}\n\t\n\t/// Initializes object from a JSON Dictionary\n\tpublic init(JSON: [String: Any], context: MapContext? = nil) throws {\n\t\tself = try Mapper(context: context).map(JSON: JSON)\n\t}\n\t\n\t/// Initializes object from a JSONObject\n\tpublic init(JSONObject: Any, context: MapContext? = nil) throws {\n\t\tself = try Mapper(context: context).map(JSONObject: JSONObject)\n\t}\n\t\n}\n\npublic extension Map {\n\n\tfileprivate func currentValue(for key: String, nested: Bool? = nil, delimiter: String = \".\") -> Any? {\n\t\tlet isNested = nested ?? key.contains(delimiter)\n\t\treturn self[key, nested: isNested, delimiter: delimiter].currentValue\n\t}\n\t\n\t// MARK: Basic\n\n\t/// Returns a value or throws an error.\n\tpublic func value<T>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> T {\n\t\tlet currentValue = self.currentValue(for: key, nested: nested, delimiter: delimiter)\n\t\tguard let value = currentValue as? T else {\n\t\t\tthrow MapError(key: key, currentValue: currentValue, reason: \"Cannot cast to '\\(T.self)'\", file: file, function: function, line: line)\n\t\t}\n\t\treturn value\n\t}\n\n\t/// Returns a transformed value or throws an error.\n\tpublic func value<Transform: TransformType>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", using transform: Transform, file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> Transform.Object {\n\t\tlet currentValue = self.currentValue(for: key, nested: nested, delimiter: delimiter)\n\t\tguard let value = transform.transformFromJSON(currentValue) else {\n\t\t\tthrow MapError(key: key, currentValue: currentValue, reason: \"Cannot transform to '\\(Transform.Object.self)' using \\(transform)\", file: file, function: function, line: line)\n\t\t}\n\t\treturn value\n\t}\n\t\n\t/// Returns a RawRepresentable type or throws an error.\n\tpublic func value<T: RawRepresentable>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> T {\n\t\treturn try self.value(key, nested: nested, delimiter: delimiter, using: EnumTransform(), file: file, function: function, line: line)\n\t}\n\t\n\t/// Returns a `[RawRepresentable]` type or throws an error.\n\tpublic func value<T: RawRepresentable>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> [T] {\n\t\treturn try self.value(key, nested: nested, delimiter: delimiter, using: EnumTransform(), file: file, function: function, line: line)\n\t}\n\n\t// MARK: BaseMappable\n\n\t/// Returns a `BaseMappable` object or throws an error.\n\tpublic func value<T: BaseMappable>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> T {\n\t\tlet currentValue = self.currentValue(for: key, nested: nested, delimiter: delimiter)\n\t\tguard let JSONObject = currentValue else {\n\t\t\tthrow MapError(key: key, currentValue: currentValue, reason: \"Found unexpected nil value\", file: file, function: function, line: line)\n\t\t}\n\t\treturn try Mapper<T>(context: context).mapOrFail(JSONObject: JSONObject)\n\t}\n\n\t// MARK: [BaseMappable]\n\n\t/// Returns a `[BaseMappable]` or throws an error.\n\tpublic func value<T: BaseMappable>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> [T] {\n\t\tlet currentValue = self.currentValue(for: key, nested: nested, delimiter: delimiter)\n\t\tguard let jsonArray = currentValue as? [Any] else {\n\t\t\tthrow MapError(key: key, currentValue: currentValue, reason: \"Cannot cast to '[Any]'\", file: file, function: function, line: line)\n\t\t}\n\t\t\n\t\treturn try jsonArray.map { JSONObject -> T in\n\t\t\treturn try Mapper<T>(context: context).mapOrFail(JSONObject: JSONObject)\n\t\t}\n\t}\n\n\t/// Returns a `[BaseMappable]` using transform or throws an error.\n\tpublic func value<Transform: TransformType>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", using transform: Transform, file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> [Transform.Object] {\n\t\tlet currentValue = self.currentValue(for: key, nested: nested, delimiter: delimiter)\n\t\tguard let jsonArray = currentValue as? [Any] else {\n\t\t\tthrow MapError(key: key, currentValue: currentValue, reason: \"Cannot cast to '[Any]'\", file: file, function: function, line: line)\n\t\t}\n\t\t\n\t\treturn try jsonArray.map { json -> Transform.Object in\n\t\t\tguard let object = transform.transformFromJSON(json) else {\n\t\t\t\tthrow MapError(key: \"\\(key)\", currentValue: json, reason: \"Cannot transform to '\\(Transform.Object.self)' using \\(transform)\", file: file, function: function, line: line)\n\t\t\t}\n\t\t\treturn object\n\t\t}\n\t}\n\n\t// MARK: [String: BaseMappable]\n\n\t/// Returns a `[String: BaseMappable]` or throws an error.\n\tpublic func value<T: BaseMappable>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> [String: T] {\n\t\t\n\t\tlet currentValue = self.currentValue(for: key, nested: nested, delimiter: delimiter)\n\t\tguard let jsonDictionary = currentValue as? [String: Any] else {\n\t\t\tthrow MapError(key: key, currentValue: currentValue, reason: \"Cannot cast to '[String: Any]'\", file: file, function: function, line: line)\n\t\t}\n\t\tvar value: [String: T] = [:]\n\t\tfor (key, json) in jsonDictionary {\n\t\t\tvalue[key] = try Mapper<T>(context: context).mapOrFail(JSONObject: json)\n\t\t}\n\t\treturn value\n\t}\n\n\t/// Returns a `[String: BaseMappable]` using transform or throws an error.\n\tpublic func value<Transform: TransformType>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", using transform: Transform, file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> [String: Transform.Object] {\n\t\t\n\t\tlet currentValue = self.currentValue(for: key, nested: nested, delimiter: delimiter)\n\t\tguard let jsonDictionary = currentValue as? [String: Any] else {\n\t\t\tthrow MapError(key: key, currentValue: currentValue, reason: \"Cannot cast to '[String: Any]'\", file: file, function: function, line: line)\n\t\t}\n\t\tvar value: [String: Transform.Object] = [:]\n\t\tfor (key, json) in jsonDictionary {\n\t\t\tguard let object = transform.transformFromJSON(json) else {\n\t\t\t\tthrow MapError(key: key, currentValue: json, reason: \"Cannot transform to '\\(Transform.Object.self)' using \\(transform)\", file: file, function: function, line: line)\n\t\t\t}\n\t\t\tvalue[key] = object\n\t\t}\n\t\treturn value\n\t}\n\t\n\t// MARK: [[BaseMappable]]\n\t/// Returns a `[[BaseMappable]]` or throws an error.\n\tpublic func value<T: BaseMappable>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> [[T]] {\n\t\t\n\t\tlet currentValue = self.currentValue(for: key, nested: nested, delimiter: delimiter)\n\t\tguard let json2DArray = currentValue as? [[Any]] else {\n\t\t\tthrow MapError(key: key, currentValue: currentValue, reason: \"Cannot cast to '[[Any]]'\", file: file, function: function, line: line)\n\t\t}\n\t\treturn try json2DArray.map { jsonArray in\n\t\t\ttry jsonArray.map { jsonObject -> T in\n\t\t\t\treturn try Mapper<T>(context: context).mapOrFail(JSONObject: jsonObject)\n\t\t\t}\n\t\t}\n\t}\n\t\n\t/// Returns a `[[BaseMappable]]` using transform or throws an error.\n\tpublic func value<Transform: TransformType>(_ key: String, nested: Bool? = nil, delimiter: String = \".\", using transform: Transform, file: StaticString = #file, function: StaticString = #function, line: UInt = #line) throws -> [[Transform.Object]] {\n\t\t\n\t\tlet currentValue = self.currentValue(for: key, nested: nested, delimiter: delimiter)\n\t\tguard let json2DArray = currentValue as? [[Any]] else {\n\t\t\tthrow MapError(key: key, currentValue: currentValue, reason: \"Cannot cast to '[[Any]]'\",\n\t\t\t               file: file, function: function, line: line)\n\t\t}\n\t\t\n\t\treturn try json2DArray.map { jsonArray in\n\t\t\ttry jsonArray.map { json -> Transform.Object in\n\t\t\t\tguard let object = transform.transformFromJSON(json) else {\n\t\t\t\t\tthrow MapError(key: \"\\(key)\", currentValue: json, reason: \"Cannot transform to '\\(Transform.Object.self)' using \\(transform)\", file: file, function: function, line: line)\n\t\t\t\t}\n\t\t\t\treturn object\n\t\t\t}\n\t\t}\n\t}\n}\n\npublic extension Mapper where N: ImmutableMappable {\n\t\n\tpublic func map(JSON: [String: Any]) throws -> N {\n\t\treturn try self.mapOrFail(JSON: JSON)\n\t}\n\t\n\tpublic func map(JSONString: String) throws -> N {\n\t\treturn try mapOrFail(JSONString: JSONString)\n\t}\n\t\n\tpublic func map(JSONObject: Any) throws -> N {\n\t\treturn try mapOrFail(JSONObject: JSONObject)\n\t}\n\t\n\t// MARK: Array mapping functions\n\t\n\tpublic func mapArray(JSONArray: [[String: Any]]) throws -> [N] {\n\t\treturn try JSONArray.flatMap(mapOrFail)\n\t}\n\t\n\tpublic func mapArray(JSONString: String) throws -> [N] {\n\t\tguard let JSONObject = Mapper.parseJSONString(JSONString: JSONString) else {\n\t\t\tthrow MapError(key: nil, currentValue: JSONString, reason: \"Cannot convert string into Any'\")\n\t\t}\n\t\t\n\t\treturn try mapArray(JSONObject: JSONObject)\n\t}\n\t\n\tpublic func mapArray(JSONObject: Any) throws -> [N] {\n\t\tguard let JSONArray = JSONObject as? [[String: Any]] else {\n\t\t\tthrow MapError(key: nil, currentValue: JSONObject, reason: \"Cannot cast to '[[String: Any]]'\")\n\t\t}\n\t\t\n\t\treturn try mapArray(JSONArray: JSONArray)\n\t}\n\n\t// MARK: Dictionary mapping functions\n\n\tpublic func mapDictionary(JSONString: String) throws -> [String: N] {\n\t\tguard let JSONObject = Mapper.parseJSONString(JSONString: JSONString) else {\n\t\t\tthrow MapError(key: nil, currentValue: JSONString, reason: \"Cannot convert string into Any'\")\n\t\t}\n\n\t\treturn try mapDictionary(JSONObject: JSONObject)\n\t}\n\n\tpublic func mapDictionary(JSONObject: Any?) throws -> [String: N] {\n\t\tguard let JSON = JSONObject as? [String: [String: Any]] else {\n\t\t\tthrow MapError(key: nil, currentValue: JSONObject, reason: \"Cannot cast to '[String: [String: Any]]''\")\n\t\t}\n\n\t\treturn try mapDictionary(JSON: JSON)\n\t}\n\n\tpublic func mapDictionary(JSON: [String: [String: Any]]) throws -> [String: N] {\n\t\treturn try JSON.filterMap(mapOrFail)\n\t}\n\n\t// MARK: Dictinoary of arrays mapping functions\n\n\tpublic func mapDictionaryOfArrays(JSONObject: Any?) throws -> [String: [N]] {\n\t\tguard let JSON = JSONObject as? [String: [[String: Any]]] else {\n\t\t\tthrow MapError(key: nil, currentValue: JSONObject, reason: \"Cannot cast to '[String: [String: Any]]''\")\n\t\t}\n\t\treturn try mapDictionaryOfArrays(JSON: JSON)\n\t}\n\n\tpublic func mapDictionaryOfArrays(JSON: [String: [[String: Any]]]) throws -> [String: [N]] {\n\t\treturn try JSON.filterMap { array -> [N] in\n\t\t\ttry mapArray(JSONArray: array)\n\t\t}\n\t}\n\n\t// MARK: 2 dimentional array mapping functions\n\n\tpublic func mapArrayOfArrays(JSONObject: Any?) throws -> [[N]] {\n\t\tguard let JSONArray = JSONObject as? [[[String: Any]]] else {\n\t\t\tthrow MapError(key: nil, currentValue: JSONObject, reason: \"Cannot cast to '[[[String: Any]]]''\")\n\t\t}\n\t\treturn try JSONArray.map(mapArray)\n\t}\n\n}\n\ninternal extension Mapper {\n\n\tinternal func mapOrFail(JSON: [String: Any]) throws -> N {\n\t\tlet map = Map(mappingType: .fromJSON, JSON: JSON, context: context, shouldIncludeNilValues: shouldIncludeNilValues)\n\t\t\n\t\t// Check if object is ImmutableMappable, if so use ImmutableMappable protocol for mapping\n\t\tif let klass = N.self as? ImmutableMappable.Type,\n\t\t\tvar object = try klass.init(map: map) as? N {\n\t\t\tobject.mapping(map: map)\n\t\t\treturn object\n\t\t}\n\t\t\n\t\t// If not, map the object the standard way\n\t\tguard let value = self.map(JSON: JSON) else {\n\t\t\tthrow MapError(key: nil, currentValue: JSON, reason: \"Cannot map to '\\(N.self)'\")\n\t\t}\n\t\treturn value\n\t}\n\n\tinternal func mapOrFail(JSONString: String) throws -> N {\n\t\tguard let JSON = Mapper.parseJSONStringIntoDictionary(JSONString: JSONString) else {\n\t\t\tthrow MapError(key: nil, currentValue: JSONString, reason: \"Cannot parse into '[String: Any]'\")\n\t\t}\n\t\treturn try mapOrFail(JSON: JSON)\n\t}\n\n\tinternal func mapOrFail(JSONObject: Any) throws -> N {\n\t\tguard let JSON = JSONObject as? [String: Any] else {\n\t\t\tthrow MapError(key: nil, currentValue: JSONObject, reason: \"Cannot cast to '[String: Any]'\")\n\t\t}\n\t\treturn try mapOrFail(JSON: JSON)\n\t}\n\n}\n"
  },
  {
    "path": "Pods/ObjectMapper/Sources/IntegerOperators.swift",
    "content": "//\n//  IntegerOperators.swift\n//  ObjectMapper\n//\n//  Created by Suyeol Jeon on 17/02/2017.\n//  Copyright © 2017 hearst. All rights reserved.\n//\n\nimport Foundation\n\n// MARK: - Signed Integer\n\n/// SignedInteger mapping\npublic func <- <T: SignedInteger>(left: inout T, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tlet value: T = toSignedInteger(right.currentValue) ?? 0\n\t\tFromJSON.basicType(&left, object: value)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\n/// Optional SignedInteger mapping\npublic func <- <T: SignedInteger>(left: inout T?, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tlet value: T? = toSignedInteger(right.currentValue)\n\t\tFromJSON.basicType(&left, object: value)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\n/// ImplicitlyUnwrappedOptional SignedInteger mapping\npublic func <- <T: SignedInteger>(left: inout T!, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tlet value: T! = toSignedInteger(right.currentValue)\n\t\tFromJSON.basicType(&left, object: value)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\n\n// MARK: - Unsigned Integer\n\n/// UnsignedInteger mapping\npublic func <- <T: UnsignedInteger>(left: inout T, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tlet value: T = toUnsignedInteger(right.currentValue) ?? 0\n\t\tFromJSON.basicType(&left, object: value)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\n\n/// Optional UnsignedInteger mapping\npublic func <- <T: UnsignedInteger>(left: inout T?, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tlet value: T? = toUnsignedInteger(right.currentValue)\n\t\tFromJSON.basicType(&left, object: value)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\n/// ImplicitlyUnwrappedOptional UnsignedInteger mapping\npublic func <- <T: UnsignedInteger>(left: inout T!, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tlet value: T! = toUnsignedInteger(right.currentValue)\n\t\tFromJSON.basicType(&left, object: value)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\n// MARK: - Casting Utils\n\n/// Convert any value to `SignedInteger`.\nprivate func toSignedInteger<T: SignedInteger>(_ value: Any?) -> T? {\n\tguard\n\t\tlet value = value,\n\t\tcase let number as NSNumber = value\n\telse {\n\t\treturn nil\n\t}\n\n\tif T.self ==   Int.self, let x = Int(exactly: number.int64Value) {\n\t\treturn T.init(x)\n\t}\n\tif T.self ==  Int8.self, let x = Int8(exactly: number.int64Value) {\n\t\treturn T.init(x)\n\t}\n\tif T.self == Int16.self, let x = Int16(exactly: number.int64Value) {\n\t\treturn T.init(x)\n\t}\n\tif T.self == Int32.self, let x = Int32(exactly: number.int64Value) {\n\t\treturn T.init(x)\n\t}\n\tif T.self == Int64.self, let x = Int64(exactly: number.int64Value) {\n\t\treturn T.init(x)\n\t}\n\n\treturn nil\n}\n\n/// Convert any value to `UnsignedInteger`.\nprivate func toUnsignedInteger<T: UnsignedInteger>(_ value: Any?) -> T? {\n\tguard\n\t\tlet value = value,\n\t\tcase let number as NSNumber = value\n\telse {\n\t\treturn nil\n\t}\n\n\tif T.self == UInt.self, let x = UInt(exactly: number.uint64Value) {\n\t\treturn T.init(x)\n\t}\n\tif T.self == UInt8.self, let x = UInt8(exactly: number.uint64Value) {\n\t\treturn T.init(x)\n\t}\n\tif T.self == UInt16.self, let x = UInt16(exactly: number.uint64Value) {\n\t\treturn T.init(x)\n\t}\n\tif T.self == UInt32.self, let x = UInt32(exactly: number.uint64Value) {\n\t\treturn T.init(x)\n\t}\n\tif T.self == UInt64.self, let x = UInt64(exactly: number.uint64Value) {\n\t\treturn T.init(x)\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "Pods/ObjectMapper/Sources/Map.swift",
    "content": "//\n//  Map.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2015-10-09.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2016 Hearst\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n\nimport Foundation\n\n/// MapContext is available for developers who wish to pass information around during the mapping process.\npublic protocol MapContext {\n\t\n}\n\n/// A class used for holding mapping data\npublic final class Map {\n\tpublic let mappingType: MappingType\n\t\n\tpublic internal(set) var JSON: [String: Any] = [:]\n\tpublic internal(set) var isKeyPresent = false\n\tpublic internal(set) var currentValue: Any?\n\tpublic internal(set) var currentKey: String?\n\tvar keyIsNested = false\n\tpublic internal(set) var nestedKeyDelimiter: String = \".\"\n\tpublic var context: MapContext?\n\tpublic var shouldIncludeNilValues = false  /// If this is set to true, toJSON output will include null values for any variables that are not set.\n\t\n\tpublic let toObject: Bool // indicates whether the mapping is being applied to an existing object\n\t\n\tpublic init(mappingType: MappingType, JSON: [String: Any], toObject: Bool = false, context: MapContext? = nil, shouldIncludeNilValues: Bool = false) {\n\t\t\n\t\tself.mappingType = mappingType\n\t\tself.JSON = JSON\n\t\tself.toObject = toObject\n\t\tself.context = context\n\t\tself.shouldIncludeNilValues = shouldIncludeNilValues\n\t}\n\t\n\t/// Sets the current mapper value and key.\n\t/// The Key paramater can be a period separated string (ex. \"distance.value\") to access sub objects.\n\tpublic subscript(key: String) -> Map {\n\t\t// save key and value associated to it\n\t\treturn self[key, delimiter: \".\", ignoreNil: false]\n\t}\n\t\n\tpublic subscript(key: String, delimiter delimiter: String) -> Map {\n\t\tlet nested = key.contains(delimiter)\n\t\treturn self[key, nested: nested, delimiter: delimiter, ignoreNil: false]\n\t}\n\t\n\tpublic subscript(key: String, nested nested: Bool) -> Map {\n\t\treturn self[key, nested: nested, delimiter: \".\", ignoreNil: false]\n\t}\n\t\n\tpublic subscript(key: String, nested nested: Bool, delimiter delimiter: String) -> Map {\n\t\treturn self[key, nested: nested, delimiter: delimiter, ignoreNil: false]\n\t}\n\t\n\tpublic subscript(key: String, ignoreNil ignoreNil: Bool) -> Map {\n\t\treturn self[key, delimiter: \".\", ignoreNil: ignoreNil]\n\t}\n\t\n\tpublic subscript(key: String, delimiter delimiter: String, ignoreNil ignoreNil: Bool) -> Map {\n\t\tlet nested = key.contains(delimiter)\n\t\treturn self[key, nested: nested, delimiter: delimiter, ignoreNil: ignoreNil]\n\t}\n\t\n\tpublic subscript(key: String, nested nested: Bool, ignoreNil ignoreNil: Bool) -> Map {\n\t\treturn self[key, nested: nested, delimiter: \".\", ignoreNil: ignoreNil]\n\t}\n\t\n\tpublic subscript(key: String, nested nested: Bool, delimiter delimiter: String, ignoreNil ignoreNil: Bool) -> Map {\n\t\t// save key and value associated to it\n\t\tcurrentKey = key\n\t\tkeyIsNested = nested\n\t\tnestedKeyDelimiter = delimiter\n\t\t\n\t\tif mappingType == .fromJSON {\n\t\t\t// check if a value exists for the current key\n\t\t\t// do this pre-check for performance reasons\n\t\t\tif nested == false {\n\t\t\t\tlet object = JSON[key]\n\t\t\t\tlet isNSNull = object is NSNull\n\t\t\t\tisKeyPresent = isNSNull ? true : object != nil\n\t\t\t\tcurrentValue = isNSNull ? nil : object\n\t\t\t} else {\n\t\t\t\t// break down the components of the key that are separated by .\n\t\t\t\t(isKeyPresent, currentValue) = valueFor(ArraySlice(key.components(separatedBy: delimiter)), dictionary: JSON)\n\t\t\t}\n\t\t\t\n\t\t\t// update isKeyPresent if ignoreNil is true\n\t\t\tif ignoreNil && currentValue == nil {\n\t\t\t\tisKeyPresent = false\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn self\n\t}\n\t\n\tpublic func value<T>() -> T? {\n\t\treturn currentValue as? T\n\t}\n\t\n}\n\n/// Fetch value from JSON dictionary, loop through keyPathComponents until we reach the desired object\nprivate func valueFor(_ keyPathComponents: ArraySlice<String>, dictionary: [String: Any]) -> (Bool, Any?) {\n\t// Implement it as a tail recursive function.\n\tif keyPathComponents.isEmpty {\n\t\treturn (false, nil)\n\t}\n\t\n\tif let keyPath = keyPathComponents.first {\n\t\tlet object = dictionary[keyPath]\n\t\tif object is NSNull {\n\t\t\treturn (true, nil)\n\t\t} else if keyPathComponents.count > 1, let dict = object as? [String: Any] {\n\t\t\tlet tail = keyPathComponents.dropFirst()\n\t\t\treturn valueFor(tail, dictionary: dict)\n\t\t} else if keyPathComponents.count > 1, let array = object as? [Any] {\n\t\t\tlet tail = keyPathComponents.dropFirst()\n\t\t\treturn valueFor(tail, array: array)\n\t\t} else {\n\t\t\treturn (object != nil, object)\n\t\t}\n\t}\n\t\n\treturn (false, nil)\n}\n\n/// Fetch value from JSON Array, loop through keyPathComponents them until we reach the desired object\nprivate func valueFor(_ keyPathComponents: ArraySlice<String>, array: [Any]) -> (Bool, Any?) {\n\t// Implement it as a tail recursive function.\n\t\n\tif keyPathComponents.isEmpty {\n\t\treturn (false, nil)\n\t}\n\t\n\t//Try to convert keypath to Int as index\n\tif let keyPath = keyPathComponents.first,\n\t\tlet index = Int(keyPath) , index >= 0 && index < array.count {\n\t\t\n\t\tlet object = array[index]\n\t\t\n\t\tif object is NSNull {\n\t\t\treturn (true, nil)\n\t\t} else if keyPathComponents.count > 1, let array = object as? [Any]  {\n\t\t\tlet tail = keyPathComponents.dropFirst()\n\t\t\treturn valueFor(tail, array: array)\n\t\t} else if  keyPathComponents.count > 1, let dict = object as? [String: Any] {\n\t\t\tlet tail = keyPathComponents.dropFirst()\n\t\t\treturn valueFor(tail, dictionary: dict)\n\t\t} else {\n\t\t\treturn (true, object)\n\t\t}\n\t}\n\t\n\treturn (false, nil)\n}\n"
  },
  {
    "path": "Pods/ObjectMapper/Sources/MapError.swift",
    "content": "//\n//  MapError.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2016-09-26.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2016 Hearst\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\npublic struct MapError: Error {\n\tpublic var key: String?\n\tpublic var currentValue: Any?\n\tpublic var reason: String?\n\tpublic var file: StaticString?\n\tpublic var function: StaticString?\n\tpublic var line: UInt?\n\t\n\tpublic init(key: String?, currentValue: Any?, reason: String?, file: StaticString? = nil, function: StaticString? = nil, line: UInt? = nil) {\n\t\tself.key = key\n\t\tself.currentValue = currentValue\n\t\tself.reason = reason\n\t\tself.file = file\n\t\tself.function = function\n\t\tself.line = line\n\t}\n}\n\nextension MapError: CustomStringConvertible {\n\t\n\tprivate var location: String? {\n\t\tguard let file = file, let function = function, let line = line else { return nil }\n\t\tlet fileName = ((String(describing: file).components(separatedBy: \"/\").last ?? \"\").components(separatedBy: \".\").first ?? \"\")\n\t\treturn \"\\(fileName).\\(function):\\(line)\"\n\t}\n\t\n\tpublic var description: String {\n\t\tlet info: [(String, Any?)] = [\n\t\t\t(\"- reason\", reason),\n\t\t\t(\"- location\", location),\n\t\t\t(\"- key\", key),\n\t\t\t(\"- currentValue\", currentValue),\n\t\t\t]\n\t\tlet infoString = info.map { \"\\($0.0): \\($0.1 ?? \"nil\")\" }.joined(separator: \"\\n\")\n\t\treturn \"Got an error while mapping.\\n\\(infoString)\"\n\t}\n\t\n}\n"
  },
  {
    "path": "Pods/ObjectMapper/Sources/Mappable.swift",
    "content": "//\n//  Mappable.swift\n//  ObjectMapper\n//\n//  Created by Scott Hoyt on 10/25/15.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2016 Hearst\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\n/// BaseMappable should not be implemented directly. Mappable or StaticMappable should be used instead\npublic protocol BaseMappable {\n\t/// This function is where all variable mappings should occur. It is executed by Mapper during the mapping (serialization and deserialization) process.\n\tmutating func mapping(map: Map)\n}\n\npublic protocol Mappable: BaseMappable {\n    /// This function can be used to validate JSON prior to mapping. Return nil to cancel mapping at this point\n    init?(map: Map)\n}\n\npublic protocol StaticMappable: BaseMappable {\n\t/// This is function that can be used to:\n\t///\t\t1) provide an existing cached object to be used for mapping\n\t///\t\t2) return an object of another class (which conforms to BaseMappable) to be used for mapping. For instance, you may inspect the JSON to infer the type of object that should be used for any given mapping\n\tstatic func objectForMapping(map: Map) -> BaseMappable?\n}\n\npublic extension BaseMappable {\n\t\n\t/// Initializes object from a JSON String\n\tpublic init?(JSONString: String, context: MapContext? = nil) {\n\t\tif let obj: Self = Mapper(context: context).map(JSONString: JSONString) {\n\t\t\tself = obj\n\t\t} else {\n\t\t\treturn nil\n\t\t}\n\t}\n\t\n\t/// Initializes object from a JSON Dictionary\n\tpublic init?(JSON: [String: Any], context: MapContext? = nil) {\n\t\tif let obj: Self = Mapper(context: context).map(JSON: JSON) {\n\t\t\tself = obj\n\t\t} else {\n\t\t\treturn nil\n\t\t}\n\t}\n\t\n\t/// Returns the JSON Dictionary for the object\n\tpublic func toJSON() -> [String: Any] {\n\t\treturn Mapper().toJSON(self)\n\t}\n\t\n\t/// Returns the JSON String for the object\n\tpublic func toJSONString(prettyPrint: Bool = false) -> String? {\n\t\treturn Mapper().toJSONString(self, prettyPrint: prettyPrint)\n\t}\n}\n\npublic extension Array where Element: BaseMappable {\n\t\n\t/// Initialize Array from a JSON String\n\tpublic init?(JSONString: String, context: MapContext? = nil) {\n\t\tif let obj: [Element] = Mapper(context: context).mapArray(JSONString: JSONString) {\n\t\t\tself = obj\n\t\t} else {\n\t\t\treturn nil\n\t\t}\n\t}\n\t\n\t/// Initialize Array from a JSON Array\n\tpublic init(JSONArray: [[String: Any]], context: MapContext? = nil) {\n\t\tlet obj: [Element] = Mapper(context: context).mapArray(JSONArray: JSONArray)\n\t\tself = obj\n\t}\n\t\n\t/// Returns the JSON Array\n\tpublic func toJSON() -> [[String: Any]] {\n\t\treturn Mapper().toJSONArray(self)\n\t}\n\t\n\t/// Returns the JSON String for the object\n\tpublic func toJSONString(prettyPrint: Bool = false) -> String? {\n\t\treturn Mapper().toJSONString(self, prettyPrint: prettyPrint)\n\t}\n}\n\npublic extension Set where Element: BaseMappable {\n\t\n\t/// Initializes a set from a JSON String\n\tpublic init?(JSONString: String, context: MapContext? = nil) {\n\t\tif let obj: Set<Element> = Mapper(context: context).mapSet(JSONString: JSONString) {\n\t\t\tself = obj\n\t\t} else {\n\t\t\treturn nil\n\t\t}\n\t}\n\t\n\t/// Initializes a set from JSON\n\tpublic init?(JSONArray: [[String: Any]], context: MapContext? = nil) {\n\t\tguard let obj = Mapper(context: context).mapSet(JSONArray: JSONArray) as Set<Element>? else {\n            return nil\n        }\n\t\tself = obj\n\t}\n\t\n\t/// Returns the JSON Set\n\tpublic func toJSON() -> [[String: Any]] {\n\t\treturn Mapper().toJSONSet(self)\n\t}\n\t\n\t/// Returns the JSON String for the object\n\tpublic func toJSONString(prettyPrint: Bool = false) -> String? {\n\t\treturn Mapper().toJSONString(self, prettyPrint: prettyPrint)\n\t}\n}\n"
  },
  {
    "path": "Pods/ObjectMapper/Sources/Mapper.swift",
    "content": "//\n//  Mapper.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2014-10-09.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2016 Hearst\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\npublic enum MappingType {\n\tcase fromJSON\n\tcase toJSON\n}\n\n/// The Mapper class provides methods for converting Model objects to JSON and methods for converting JSON to Model objects\npublic final class Mapper<N: BaseMappable> {\n\t\n\tpublic var context: MapContext?\n\tpublic var shouldIncludeNilValues = false /// If this is set to true, toJSON output will include null values for any variables that are not set.\n\t\n\tpublic init(context: MapContext? = nil, shouldIncludeNilValues: Bool = false){\n\t\tself.context = context\n\t\tself.shouldIncludeNilValues = shouldIncludeNilValues\n\t}\n\t\n\t// MARK: Mapping functions that map to an existing object toObject\n\t\n\t/// Maps a JSON object to an existing Mappable object if it is a JSON dictionary, or returns the passed object as is\n\tpublic func map(JSONObject: Any?, toObject object: N) -> N {\n\t\tif let JSON = JSONObject as? [String: Any] {\n\t\t\treturn map(JSON: JSON, toObject: object)\n\t\t}\n\t\t\n\t\treturn object\n\t}\n\t\n\t/// Map a JSON string onto an existing object\n\tpublic func map(JSONString: String, toObject object: N) -> N {\n\t\tif let JSON = Mapper.parseJSONStringIntoDictionary(JSONString: JSONString) {\n\t\t\treturn map(JSON: JSON, toObject: object)\n\t\t}\n\t\treturn object\n\t}\n\t\n\t/// Maps a JSON dictionary to an existing object that conforms to Mappable.\n\t/// Usefull for those pesky objects that have crappy designated initializers like NSManagedObject\n\tpublic func map(JSON: [String: Any], toObject object: N) -> N {\n\t\tvar mutableObject = object\n\t\tlet map = Map(mappingType: .fromJSON, JSON: JSON, toObject: true, context: context, shouldIncludeNilValues: shouldIncludeNilValues)\n\t\tmutableObject.mapping(map: map)\n\t\treturn mutableObject\n\t}\n\n\t//MARK: Mapping functions that create an object\n\t\n\t/// Map a JSON string to an object that conforms to Mappable\n\tpublic func map(JSONString: String) -> N? {\n\t\tif let JSON = Mapper.parseJSONStringIntoDictionary(JSONString: JSONString) {\n\t\t\treturn map(JSON: JSON)\n\t\t}\n\t\t\n\t\treturn nil\n\t}\n\t\n\t/// Maps a JSON object to a Mappable object if it is a JSON dictionary or NSString, or returns nil.\n\tpublic func map(JSONObject: Any?) -> N? {\n\t\tif let JSON = JSONObject as? [String: Any] {\n\t\t\treturn map(JSON: JSON)\n\t\t}\n\n\t\treturn nil\n\t}\n\n\t/// Maps a JSON dictionary to an object that conforms to Mappable\n\tpublic func map(JSON: [String: Any]) -> N? {\n\t\tlet map = Map(mappingType: .fromJSON, JSON: JSON, context: context, shouldIncludeNilValues: shouldIncludeNilValues)\n\t\t\n\t\tif let klass = N.self as? StaticMappable.Type { // Check if object is StaticMappable\n\t\t\tif var object = klass.objectForMapping(map: map) as? N {\n\t\t\t\tobject.mapping(map: map)\n\t\t\t\treturn object\n\t\t\t}\n\t\t} else if let klass = N.self as? Mappable.Type { // Check if object is Mappable\n\t\t\tif var object = klass.init(map: map) as? N {\n\t\t\t\tobject.mapping(map: map)\n\t\t\t\treturn object\n\t\t\t}\n\t\t} else if let klass = N.self as? ImmutableMappable.Type { // Check if object is ImmutableMappable\n\t\t\tdo {\n\t\t\t\treturn try klass.init(map: map) as? N\n\t\t\t} catch let error {\n\t\t\t\t#if DEBUG\n\t\t\t\tlet exception: NSException\n\t\t\t\tif let mapError = error as? MapError {\n\t\t\t\t\texception = NSException(name: .init(rawValue: \"MapError\"), reason: mapError.description, userInfo: nil)\n\t\t\t\t} else {\n\t\t\t\t\texception = NSException(name: .init(rawValue: \"ImmutableMappableError\"), reason: error.localizedDescription, userInfo: nil)\n\t\t\t\t}\n\t\t\t\texception.raise()\n\t\t\t\t#else\n\t\t\t\tNSLog(\"\\(error)\")\n\t\t\t\t#endif\n\t\t\t}\n\t\t} else {\n\t\t\t// Ensure BaseMappable is not implemented directly\n\t\t\tassert(false, \"BaseMappable should not be implemented directly. Please implement Mappable, StaticMappable or ImmutableMappable\")\n\t\t}\n\t\t\n\t\treturn nil\n\t}\n\n\t// MARK: Mapping functions for Arrays and Dictionaries\n\t\n\t/// Maps a JSON array to an object that conforms to Mappable\n\tpublic func mapArray(JSONString: String) -> [N]? {\n\t\tlet parsedJSON: Any? = Mapper.parseJSONString(JSONString: JSONString)\n\n\t\tif let objectArray = mapArray(JSONObject: parsedJSON) {\n\t\t\treturn objectArray\n\t\t}\n\n\t\t// failed to parse JSON into array form\n\t\t// try to parse it into a dictionary and then wrap it in an array\n\t\tif let object = map(JSONObject: parsedJSON) {\n\t\t\treturn [object]\n\t\t}\n\n\t\treturn nil\n\t}\n\t\n\t/// Maps a JSON object to an array of Mappable objects if it is an array of JSON dictionary, or returns nil.\n\tpublic func mapArray(JSONObject: Any?) -> [N]? {\n\t\tif let JSONArray = JSONObject as? [[String: Any]] {\n\t\t\treturn mapArray(JSONArray: JSONArray)\n\t\t}\n\n\t\treturn nil\n\t}\n\t\n\t/// Maps an array of JSON dictionary to an array of Mappable objects\n\tpublic func mapArray(JSONArray: [[String: Any]]) -> [N] {\n\t\t// map every element in JSON array to type N\n\t\tlet result = JSONArray.flatMap(map)\n\t\treturn result\n\t}\n\t\n\t/// Maps a JSON object to a dictionary of Mappable objects if it is a JSON dictionary of dictionaries, or returns nil.\n\tpublic func mapDictionary(JSONString: String) -> [String: N]? {\n\t\tlet parsedJSON: Any? = Mapper.parseJSONString(JSONString: JSONString)\n\t\treturn mapDictionary(JSONObject: parsedJSON)\n\t}\n\t\n\t/// Maps a JSON object to a dictionary of Mappable objects if it is a JSON dictionary of dictionaries, or returns nil.\n\tpublic func mapDictionary(JSONObject: Any?) -> [String: N]? {\n\t\tif let JSON = JSONObject as? [String: [String: Any]] {\n\t\t\treturn mapDictionary(JSON: JSON)\n\t\t}\n\n\t\treturn nil\n\t}\n\n\t/// Maps a JSON dictionary of dictionaries to a dictionary of Mappable objects\n\tpublic func mapDictionary(JSON: [String: [String: Any]]) -> [String: N]? {\n\t\t// map every value in dictionary to type N\n\t\tlet result = JSON.filterMap(map)\n\t\tif result.isEmpty == false {\n\t\t\treturn result\n\t\t}\n\t\t\n\t\treturn nil\n\t}\n\t\n\t/// Maps a JSON object to a dictionary of Mappable objects if it is a JSON dictionary of dictionaries, or returns nil.\n\tpublic func mapDictionary(JSONObject: Any?, toDictionary dictionary: [String: N]) -> [String: N] {\n\t\tif let JSON = JSONObject as? [String : [String : Any]] {\n\t\t\treturn mapDictionary(JSON: JSON, toDictionary: dictionary)\n\t\t}\n\t\t\n\t\treturn dictionary\n\t}\n\t\n    /// Maps a JSON dictionary of dictionaries to an existing dictionary of Mappable objects\n    public func mapDictionary(JSON: [String: [String: Any]], toDictionary dictionary: [String: N]) -> [String: N] {\n\t\tvar mutableDictionary = dictionary\n        for (key, value) in JSON {\n            if let object = dictionary[key] {\n\t\t\t\t_ = map(JSON: value, toObject: object)\n            } else {\n\t\t\t\tmutableDictionary[key] = map(JSON: value)\n            }\n        }\n        \n        return mutableDictionary\n    }\n\t\n\t/// Maps a JSON object to a dictionary of arrays of Mappable objects\n\tpublic func mapDictionaryOfArrays(JSONObject: Any?) -> [String: [N]]? {\n\t\tif let JSON = JSONObject as? [String: [[String: Any]]] {\n\t\t\treturn mapDictionaryOfArrays(JSON: JSON)\n\t\t}\n\t\t\n\t\treturn nil\n\t}\n\t\n\t///Maps a JSON dictionary of arrays to a dictionary of arrays of Mappable objects\n\tpublic func mapDictionaryOfArrays(JSON: [String: [[String: Any]]]) -> [String: [N]]? {\n\t\t// map every value in dictionary to type N\n\t\tlet result = JSON.filterMap {\n\t\t\tmapArray(JSONArray: $0)\n        }\n        \n\t\tif result.isEmpty == false {\n\t\t\treturn result\n\t\t}\n        \n\t\treturn nil\n\t}\n\t\n\t/// Maps an 2 dimentional array of JSON dictionaries to a 2 dimentional array of Mappable objects\n\tpublic func mapArrayOfArrays(JSONObject: Any?) -> [[N]]? {\n\t\tif let JSONArray = JSONObject as? [[[String: Any]]] {\n\t\t\tvar objectArray = [[N]]()\n\t\t\tfor innerJSONArray in JSONArray {\n\t\t\t\tlet array = mapArray(JSONArray: innerJSONArray)\n\t\t\t\tobjectArray.append(array)\n\t\t\t}\n\t\t\t\n\t\t\tif objectArray.isEmpty == false {\n\t\t\t\treturn objectArray\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn nil\n\t}\n\n\t// MARK: Utility functions for converting strings to JSON objects\n\t\n\t/// Convert a JSON String into a Dictionary<String, Any> using NSJSONSerialization\n\tpublic static func parseJSONStringIntoDictionary(JSONString: String) -> [String: Any]? {\n\t\tlet parsedJSON: Any? = Mapper.parseJSONString(JSONString: JSONString)\n\t\treturn parsedJSON as? [String: Any]\n\t}\n\n\t/// Convert a JSON String into an Object using NSJSONSerialization\n\tpublic static func parseJSONString(JSONString: String) -> Any? {\n\t\tlet data = JSONString.data(using: String.Encoding.utf8, allowLossyConversion: true)\n\t\tif let data = data {\n\t\t\tlet parsedJSON: Any?\n\t\t\tdo {\n\t\t\t\tparsedJSON = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments)\n\t\t\t} catch let error {\n\t\t\t\tprint(error)\n\t\t\t\tparsedJSON = nil\n\t\t\t}\n\t\t\treturn parsedJSON\n\t\t}\n\n\t\treturn nil\n\t}\n}\n\nextension Mapper {\n\t// MARK: Functions that create model from JSON file\n\n\t/// JSON file to Mappable object\n\t/// - parameter JSONfile: Filename\n\t/// - Returns: Mappable object\n\tpublic func map(JSONfile: String) -> N? {\n\t\tif let path = Bundle.main.path(forResource: JSONfile, ofType: nil) {\n\t\t\tdo {\n\t\t\t\tlet JSONString = try String(contentsOfFile: path)\n\t\t\t\tdo {\n\t\t\t\t\treturn self.map(JSONString: JSONString)\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n\n\t/// JSON file to Mappable object array\n\t/// - parameter JSONfile: Filename\n\t/// - Returns: Mappable object array\n\tpublic func mapArray(JSONfile: String) -> [N]? {\n\t\tif let path = Bundle.main.path(forResource: JSONfile, ofType: nil) {\n\t\t\tdo {\n\t\t\t\tlet JSONString = try String(contentsOfFile: path)\n\t\t\t\tdo {\n\t\t\t\t\treturn self.mapArray(JSONString: JSONString)\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\treturn nil\n\t}\n}\n\nextension Mapper {\n    \n\t// MARK: Functions that create JSON from objects\t\n\t\n\t///Maps an object that conforms to Mappable to a JSON dictionary <String, Any>\n\tpublic func toJSON(_ object: N) -> [String: Any] {\n\t\tvar mutableObject = object\n\t\tlet map = Map(mappingType: .toJSON, JSON: [:], context: context, shouldIncludeNilValues: shouldIncludeNilValues)\n\t\tmutableObject.mapping(map: map)\n\t\treturn map.JSON\n\t}\n\t\n\t///Maps an array of Objects to an array of JSON dictionaries [[String: Any]]\n\tpublic func toJSONArray(_ array: [N]) -> [[String: Any]] {\n\t\treturn array.map {\n\t\t\t// convert every element in array to JSON dictionary equivalent\n\t\t\tself.toJSON($0)\n\t\t}\n\t}\n\t\n\t///Maps a dictionary of Objects that conform to Mappable to a JSON dictionary of dictionaries.\n\tpublic func toJSONDictionary(_ dictionary: [String: N]) -> [String: [String: Any]] {\n\t\treturn dictionary.map { (arg: (key: String, value: N)) in\n\t\t\t// convert every value in dictionary to its JSON dictionary equivalent\n\t\t\treturn (arg.key, self.toJSON(arg.value))\n\t\t}\n\t}\n\t\n\t///Maps a dictionary of Objects that conform to Mappable to a JSON dictionary of dictionaries.\n\tpublic func toJSONDictionaryOfArrays(_ dictionary: [String: [N]]) -> [String: [[String: Any]]] {\n\t\treturn dictionary.map { (arg: (key: String, value: [N])) in\n\t\t\t// convert every value (array) in dictionary to its JSON dictionary equivalent\n\t\t\treturn (arg.key, self.toJSONArray(arg.value))\n\t\t}\n\t}\n\t\n\t/// Maps an Object to a JSON string with option of pretty formatting\n\tpublic func toJSONString(_ object: N, prettyPrint: Bool = false) -> String? {\n\t\tlet JSONDict = toJSON(object)\n\t\t\n        return Mapper.toJSONString(JSONDict as Any, prettyPrint: prettyPrint)\n\t}\n\n    /// Maps an array of Objects to a JSON string with option of pretty formatting\t\n    public func toJSONString(_ array: [N], prettyPrint: Bool = false) -> String? {\n        let JSONDict = toJSONArray(array)\n        \n        return Mapper.toJSONString(JSONDict as Any, prettyPrint: prettyPrint)\n    }\n\t\n\t/// Converts an Object to a JSON string with option of pretty formatting\n\tpublic static func toJSONString(_ JSONObject: Any, prettyPrint: Bool) -> String? {\n\t\tlet options: JSONSerialization.WritingOptions = prettyPrint ? .prettyPrinted : []\n\t\tif let JSON = Mapper.toJSONData(JSONObject, options: options) {\n\t\t\treturn String(data: JSON, encoding: String.Encoding.utf8)\n\t\t}\n\t\t\n\t\treturn nil\n\t}\n\t\n\t/// Converts an Object to JSON data with options\n\tpublic static func toJSONData(_ JSONObject: Any, options: JSONSerialization.WritingOptions) -> Data? {\n\t\tif JSONSerialization.isValidJSONObject(JSONObject) {\n\t\t\tlet JSONData: Data?\n\t\t\tdo {\n\t\t\t\tJSONData = try JSONSerialization.data(withJSONObject: JSONObject, options: options)\n\t\t\t} catch let error {\n\t\t\t\tprint(error)\n\t\t\t\tJSONData = nil\n\t\t\t}\n\t\t\t\n\t\t\treturn JSONData\n\t\t}\n\t\t\n\t\treturn nil\n\t}\n}\n\nextension Mapper where N: Hashable {\n\t\n\t/// Maps a JSON array to an object that conforms to Mappable\n\tpublic func mapSet(JSONString: String) -> Set<N>? {\n\t\tlet parsedJSON: Any? = Mapper.parseJSONString(JSONString: JSONString)\n\t\t\n\t\tif let objectArray = mapArray(JSONObject: parsedJSON) {\n\t\t\treturn Set(objectArray)\n\t\t}\n\t\t\n\t\t// failed to parse JSON into array form\n\t\t// try to parse it into a dictionary and then wrap it in an array\n\t\tif let object = map(JSONObject: parsedJSON) {\n\t\t\treturn Set([object])\n\t\t}\n\t\t\n\t\treturn nil\n\t}\n\t\n\t/// Maps a JSON object to an Set of Mappable objects if it is an array of JSON dictionary, or returns nil.\n\tpublic func mapSet(JSONObject: Any?) -> Set<N>? {\n\t\tif let JSONArray = JSONObject as? [[String: Any]] {\n\t\t\treturn mapSet(JSONArray: JSONArray)\n\t\t}\n\t\t\n\t\treturn nil\n\t}\n\t\n\t/// Maps an Set of JSON dictionary to an array of Mappable objects\n\tpublic func mapSet(JSONArray: [[String: Any]]) -> Set<N> {\n\t\t// map every element in JSON array to type N\n\t\treturn Set(JSONArray.flatMap(map))\n\t}\n\n\t///Maps a Set of Objects to a Set of JSON dictionaries [[String : Any]]\n\tpublic func toJSONSet(_ set: Set<N>) -> [[String: Any]] {\n\t\treturn set.map {\n\t\t\t// convert every element in set to JSON dictionary equivalent\n\t\t\tself.toJSON($0)\n\t\t}\n\t}\n\t\n\t/// Maps a set of Objects to a JSON string with option of pretty formatting\n\tpublic func toJSONString(_ set: Set<N>, prettyPrint: Bool = false) -> String? {\n\t\tlet JSONDict = toJSONSet(set)\n\t\t\n\t\treturn Mapper.toJSONString(JSONDict as Any, prettyPrint: prettyPrint)\n\t}\n}\n\nextension Dictionary {\n\tinternal func map<K, V>(_ f: (Element) throws -> (K, V)) rethrows -> [K: V] {\n\t\tvar mapped = [K: V]()\n\n\t\tfor element in self {\n\t\t\tlet newElement = try f(element)\n\t\t\tmapped[newElement.0] = newElement.1\n\t\t}\n\n\t\treturn mapped\n\t}\n\n\tinternal func map<K, V>(_ f: (Element) throws -> (K, [V])) rethrows -> [K: [V]] {\n\t\tvar mapped = [K: [V]]()\n\t\t\n\t\tfor element in self {\n\t\t\tlet newElement = try f(element)\n\t\t\tmapped[newElement.0] = newElement.1\n\t\t}\n\t\t\n\t\treturn mapped\n\t}\n\n\t\n\tinternal func filterMap<U>(_ f: (Value) throws -> U?) rethrows -> [Key: U] {\n\t\tvar mapped = [Key: U]()\n\n\t\tfor (key, value) in self {\n\t\t\tif let newValue = try f(value) {\n\t\t\t\tmapped[key] = newValue\n\t\t\t}\n\t\t}\n\n\t\treturn mapped\n\t}\n}\n"
  },
  {
    "path": "Pods/ObjectMapper/Sources/NSDecimalNumberTransform.swift",
    "content": "//\n//  TransformOf.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 8/22/16.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2016 Hearst\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\nopen class NSDecimalNumberTransform: TransformType {\n    public typealias Object = NSDecimalNumber\n    public typealias JSON = String\n\n    public init() {}\n\n    open func transformFromJSON(_ value: Any?) -> NSDecimalNumber? {\n        if let string = value as? String {\n            return NSDecimalNumber(string: string)\n        } else if let number = value as? NSNumber {\n            return NSDecimalNumber(decimal: number.decimalValue)\n        } else if let double = value as? Double {\n            return NSDecimalNumber(floatLiteral: double)\n        }\n        return nil\n    }\n\n    open func transformToJSON(_ value: NSDecimalNumber?) -> String? {\n        guard let value = value else { return nil }\n        return value.description\n    }\n}\n"
  },
  {
    "path": "Pods/ObjectMapper/Sources/Operators.swift",
    "content": "//\n//  Operators.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2014-10-09.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2016 Hearst\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n/**\n* This file defines a new operator which is used to create a mapping between an object and a JSON key value.\n* There is an overloaded operator definition for each type of object that is supported in ObjectMapper.\n* This provides a way to add custom logic to handle specific types of objects\n*/\n\n/// Operator used for defining mappings to and from JSON\ninfix operator <-\n\n/// Operator used to define mappings to JSON\ninfix operator >>> \n\n// MARK:- Objects with Basic types\n\n/// Object of Basic type\npublic func <- <T>(left: inout T, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.basicType(&left, object: right.value())\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <T>(left: T, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.basicType(left, map: right)\n\t}\n}\n\n\n/// Optional object of basic type\npublic func <- <T>(left: inout T?, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalBasicType(&left, object: right.value())\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <T>(left: T?, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.optionalBasicType(left, map: right)\n\t}\n}\n\n\n/// Implicitly unwrapped optional object of basic type\npublic func <- <T>(left: inout T!, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalBasicType(&left, object: right.value())\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\n// MARK:- Mappable Objects - <T: BaseMappable>\n\n/// Object conforming to Mappable\npublic func <- <T: BaseMappable>(left: inout T, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON:\n\t\tFromJSON.object(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\t}\n}\n\npublic func >>> <T: BaseMappable>(left: T, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.object(left, map: right)\n\t}\n}\n\n\n/// Optional Mappable objects\npublic func <- <T: BaseMappable>(left: inout T?, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalObject(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <T: BaseMappable>(left: T?, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.optionalObject(left, map: right)\n\t}\n}\n\n\n/// Implicitly unwrapped optional Mappable objects\npublic func <- <T: BaseMappable>(left: inout T!, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalObject(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\n// MARK:- Dictionary of Mappable objects - Dictionary<String, T: BaseMappable>\n\n/// Dictionary of Mappable objects <String, T: Mappable>\npublic func <- <T: BaseMappable>(left: inout Dictionary<String, T>, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.objectDictionary(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <T: BaseMappable>(left: Dictionary<String, T>, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.objectDictionary(left, map: right)\n\t}\n}\n\n\n/// Optional Dictionary of Mappable object <String, T: Mappable>\npublic func <- <T: BaseMappable>(left: inout Dictionary<String, T>?, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalObjectDictionary(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <T: BaseMappable>(left: Dictionary<String, T>?, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.optionalObjectDictionary(left, map: right)\n\t}\n}\n\n\n/// Implicitly unwrapped Optional Dictionary of Mappable object <String, T: Mappable>\npublic func <- <T: BaseMappable>(left: inout Dictionary<String, T>!, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalObjectDictionary(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\n/// Dictionary of Mappable objects <String, T: Mappable>\npublic func <- <T: BaseMappable>(left: inout Dictionary<String, [T]>, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.objectDictionaryOfArrays(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <T: BaseMappable>(left: Dictionary<String, [T]>, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.objectDictionaryOfArrays(left, map: right)\n\t}\n}\n\n/// Optional Dictionary of Mappable object <String, T: Mappable>\npublic func <- <T: BaseMappable>(left: inout Dictionary<String, [T]>?, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalObjectDictionaryOfArrays(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <T: BaseMappable>(left: Dictionary<String, [T]>?, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.optionalObjectDictionaryOfArrays(left, map: right)\n\t}\n}\n\n\n/// Implicitly unwrapped Optional Dictionary of Mappable object <String, T: Mappable>\npublic func <- <T: BaseMappable>(left: inout Dictionary<String, [T]>!, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalObjectDictionaryOfArrays(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\n// MARK:- Array of Mappable objects - Array<T: BaseMappable>\n\n/// Array of Mappable objects\npublic func <- <T: BaseMappable>(left: inout Array<T>, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.objectArray(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <T: BaseMappable>(left: Array<T>, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.objectArray(left, map: right)\n\t}\n}\n\n/// Optional array of Mappable objects\npublic func <- <T: BaseMappable>(left: inout Array<T>?, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalObjectArray(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <T: BaseMappable>(left: Array<T>?, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.optionalObjectArray(left, map: right)\n\t}\n}\n\n\n/// Implicitly unwrapped Optional array of Mappable objects\npublic func <- <T: BaseMappable>(left: inout Array<T>!, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalObjectArray(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\n// MARK:- Array of Array of Mappable objects - Array<Array<T: BaseMappable>>\n\n/// Array of Array Mappable objects\npublic func <- <T: BaseMappable>(left: inout Array<Array<T>>, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.twoDimensionalObjectArray(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <T: BaseMappable>(left: Array<Array<T>>, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.twoDimensionalObjectArray(left, map: right)\n\t}\n}\n\n\n/// Optional array of Mappable objects\npublic func <- <T: BaseMappable>(left:inout Array<Array<T>>?, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalTwoDimensionalObjectArray(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <T: BaseMappable>(left: Array<Array<T>>?, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.optionalTwoDimensionalObjectArray(left, map: right)\n\t}\n}\n\n\n/// Implicitly unwrapped Optional array of Mappable objects\npublic func <- <T: BaseMappable>(left: inout Array<Array<T>>!, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalTwoDimensionalObjectArray(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\n// MARK:- Set of Mappable objects - Set<T: BaseMappable>\n\n/// Set of Mappable objects\npublic func <- <T: BaseMappable>(left: inout Set<T>, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.objectSet(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <T: BaseMappable>(left: Set<T>, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.objectSet(left, map: right)\n\t}\n}\n\n\n/// Optional Set of Mappable objects\npublic func <- <T: BaseMappable>(left: inout Set<T>?, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalObjectSet(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <T: BaseMappable>(left: Set<T>?, right: Map) {\n\tif right.mappingType == .toJSON {\n\t\tToJSON.optionalObjectSet(left, map: right)\n\t}\n}\n\n\n/// Implicitly unwrapped Optional Set of Mappable objects\npublic func <- <T: BaseMappable>(left: inout Set<T>!, right: Map) {\n\tswitch right.mappingType {\n\tcase .fromJSON where right.isKeyPresent:\n\t\tFromJSON.optionalObjectSet(&left, map: right)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n"
  },
  {
    "path": "Pods/ObjectMapper/Sources/ToJSON.swift",
    "content": "//\n//  ToJSON.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2014-10-13.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2016 Hearst\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\nprivate func setValue(_ value: Any, map: Map) {\n\tsetValue(value, key: map.currentKey!, checkForNestedKeys: map.keyIsNested, delimiter: map.nestedKeyDelimiter, dictionary: &map.JSON)\n}\n\nprivate func setValue(_ value: Any, key: String, checkForNestedKeys: Bool, delimiter: String, dictionary: inout [String : Any]) {\n\tif checkForNestedKeys {\n\t\tlet keyComponents = ArraySlice(key.components(separatedBy: delimiter).filter { !$0.isEmpty }.map { $0 })\n\t\tsetValue(value, forKeyPathComponents: keyComponents, dictionary: &dictionary)\n\t} else {\n\t\tdictionary[key] = value\n\t}\n}\n\nprivate func setValue(_ value: Any, forKeyPathComponents components: ArraySlice<String>, dictionary: inout [String : Any]) {\n\tif components.isEmpty {\n\t\treturn\n\t}\n\n\tlet head = components.first!\n\n\tif components.count == 1 {\n\t\tdictionary[String(head)] = value\n\t} else {\n\t\tvar child = dictionary[String(head)] as? [String : Any]\n\t\tif child == nil {\n\t\t\tchild = [:]\n\t\t}\n\n\t\tlet tail = components.dropFirst()\n\t\tsetValue(value, forKeyPathComponents: tail, dictionary: &child!)\n\n\t\tdictionary[String(head)] = child\n\t}\n}\n\ninternal final class ToJSON {\n\t\n\tclass func basicType<N>(_ field: N, map: Map) {\n\t\tif let x = field as Any? , false\n\t\t\t|| x is NSNumber // Basic types\n\t\t\t|| x is Bool\n\t\t\t|| x is Int\n\t\t\t|| x is Double\n\t\t\t|| x is Float\n\t\t\t|| x is String\n\t\t\t|| x is NSNull\n\t\t\t|| x is Array<NSNumber> // Arrays\n\t\t\t|| x is Array<Bool>\n\t\t\t|| x is Array<Int>\n\t\t\t|| x is Array<Double>\n\t\t\t|| x is Array<Float>\n\t\t\t|| x is Array<String>\n\t\t\t|| x is Array<Any>\n\t\t\t|| x is Array<Dictionary<String, Any>>\n\t\t\t|| x is Dictionary<String, NSNumber> // Dictionaries\n\t\t\t|| x is Dictionary<String, Bool>\n\t\t\t|| x is Dictionary<String, Int>\n\t\t\t|| x is Dictionary<String, Double>\n\t\t\t|| x is Dictionary<String, Float>\n\t\t\t|| x is Dictionary<String, String>\n\t\t\t|| x is Dictionary<String, Any>\n\t\t{\n\t\t\tsetValue(x, map: map)\n\t\t}\n\t}\n\t\n\tclass func optionalBasicType<N>(_ field: N?, map: Map) {\n\t\tif let field = field {\n\t\t\tbasicType(field, map: map)\n\t\t} else if map.shouldIncludeNilValues {\n\t\t\tbasicType(NSNull(), map: map)  //If BasicType is nil, emil NSNull into the JSON output\n\t\t}\n\t}\n\n\tclass func object<N: BaseMappable>(_ field: N, map: Map) {\n\t\tif let result = Mapper(context: map.context, shouldIncludeNilValues: map.shouldIncludeNilValues).toJSON(field) as Any? {\n\t\t\tsetValue(result, map: map)\n\t\t}\n\t}\n\t\n\tclass func optionalObject<N: BaseMappable>(_ field: N?, map: Map) {\n\t\tif let field = field {\n\t\t\tobject(field, map: map)\n\t\t}\n\t}\n\n\tclass func objectArray<N: BaseMappable>(_ field: Array<N>, map: Map) {\n\t\tlet JSONObjects = Mapper(context: map.context, shouldIncludeNilValues: map.shouldIncludeNilValues).toJSONArray(field)\n\t\t\n\t\tsetValue(JSONObjects, map: map)\n\t}\n\t\n\tclass func optionalObjectArray<N: BaseMappable>(_ field: Array<N>?, map: Map) {\n\t\tif let field = field {\n\t\t\tobjectArray(field, map: map)\n\t\t}\n\t}\n\t\n\tclass func twoDimensionalObjectArray<N: BaseMappable>(_ field: Array<Array<N>>, map: Map) {\n\t\tvar array = [[[String: Any]]]()\n\t\tfor innerArray in field {\n\t\t\tlet JSONObjects = Mapper(context: map.context, shouldIncludeNilValues: map.shouldIncludeNilValues).toJSONArray(innerArray)\n\t\t\tarray.append(JSONObjects)\n\t\t}\n\t\tsetValue(array, map: map)\n\t}\n\t\n\tclass func optionalTwoDimensionalObjectArray<N: BaseMappable>(_ field: Array<Array<N>>?, map: Map) {\n\t\tif let field = field {\n\t\t\ttwoDimensionalObjectArray(field, map: map)\n\t\t}\n\t}\n\t\n\tclass func objectSet<N: BaseMappable>(_ field: Set<N>, map: Map) {\n\t\tlet JSONObjects = Mapper(context: map.context, shouldIncludeNilValues: map.shouldIncludeNilValues).toJSONSet(field)\n\t\t\n\t\tsetValue(JSONObjects, map: map)\n\t}\n\t\n\tclass func optionalObjectSet<N: BaseMappable>(_ field: Set<N>?, map: Map) {\n\t\tif let field = field {\n\t\t\tobjectSet(field, map: map)\n\t\t}\n\t}\n\t\n\tclass func objectDictionary<N: BaseMappable>(_ field: Dictionary<String, N>, map: Map) {\n\t\tlet JSONObjects = Mapper(context: map.context, shouldIncludeNilValues: map.shouldIncludeNilValues).toJSONDictionary(field)\n\t\t\n\t\tsetValue(JSONObjects, map: map)\n\t}\n\n\tclass func optionalObjectDictionary<N: BaseMappable>(_ field: Dictionary<String, N>?, map: Map) {\n\t\tif let field = field {\n\t\t\tobjectDictionary(field, map: map)\n\t\t}\n\t}\n\n\tclass func objectDictionaryOfArrays<N: BaseMappable>(_ field: Dictionary<String, [N]>, map: Map) {\n\t\tlet JSONObjects = Mapper(context: map.context, shouldIncludeNilValues: map.shouldIncludeNilValues).toJSONDictionaryOfArrays(field)\n\n\t\tsetValue(JSONObjects, map: map)\n\t}\n\t\n\tclass func optionalObjectDictionaryOfArrays<N: BaseMappable>(_ field: Dictionary<String, [N]>?, map: Map) {\n\t\tif let field = field {\n\t\t\tobjectDictionaryOfArrays(field, map: map)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Pods/ObjectMapper/Sources/TransformOf.swift",
    "content": "//\n//  TransformOf.swift\n//  ObjectMapper\n//\n//  Created by Syo Ikeda on 1/23/15.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2016 Hearst\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nopen class TransformOf<ObjectType, JSONType>: TransformType {\n\tpublic typealias Object = ObjectType\n\tpublic typealias JSON = JSONType\n\n\tprivate let fromJSON: (JSONType?) -> ObjectType?\n\tprivate let toJSON: (ObjectType?) -> JSONType?\n\n\tpublic init(fromJSON: @escaping(JSONType?) -> ObjectType?, toJSON: @escaping(ObjectType?) -> JSONType?) {\n\t\tself.fromJSON = fromJSON\n\t\tself.toJSON = toJSON\n\t}\n\n\topen func transformFromJSON(_ value: Any?) -> ObjectType? {\n\t\treturn fromJSON(value as? JSONType)\n\t}\n\n\topen func transformToJSON(_ value: ObjectType?) -> JSONType? {\n\t\treturn toJSON(value)\n\t}\n}\n"
  },
  {
    "path": "Pods/ObjectMapper/Sources/TransformOperators.swift",
    "content": "//\n//  TransformOperators.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2016-09-26.\n//  Copyright © 2016 hearst. All rights reserved.\n//\n\nimport Foundation\n\n// MARK:- Transforms\n\n/// Object of Basic type with Transform\npublic func <- <Transform: TransformType>(left: inout Transform.Object, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet value = transform.transformFromJSON(map.currentValue)\n\t\tFromJSON.basicType(&left, object: value)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: Transform.Object, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON {\n\t\tlet value: Transform.JSON? = transform.transformToJSON(left)\n\t\tToJSON.optionalBasicType(value, map: map)\n\t}\n}\n\n\n/// Optional object of basic type with Transform\npublic func <- <Transform: TransformType>(left: inout Transform.Object?, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet value = transform.transformFromJSON(map.currentValue)\n\t\tFromJSON.optionalBasicType(&left, object: value)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: Transform.Object?, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON {\n\t\tlet value: Transform.JSON? = transform.transformToJSON(left)\n\t\tToJSON.optionalBasicType(value, map: map)\n\t}\n}\n\n\n/// Implicitly unwrapped optional object of basic type with Transform\npublic func <- <Transform: TransformType>(left: inout Transform.Object!, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet value = transform.transformFromJSON(map.currentValue)\n\t\tFromJSON.optionalBasicType(&left, object: value)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\n/// Array of Basic type with Transform\npublic func <- <Transform: TransformType>(left: inout [Transform.Object], right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet values = fromJSONArrayWithTransform(map.currentValue, transform: transform)\n\t\tFromJSON.basicType(&left, object: values)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: [Transform.Object], right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON{\n\t\tlet values = toJSONArrayWithTransform(left, transform: transform)\n\t\tToJSON.optionalBasicType(values, map: map)\n\t}\n}\n\n\n/// Optional array of Basic type with Transform\npublic func <- <Transform: TransformType>(left: inout [Transform.Object]?, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet values = fromJSONArrayWithTransform(map.currentValue, transform: transform)\n\t\tFromJSON.optionalBasicType(&left, object: values)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: [Transform.Object]?, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON {\n\t\tlet values = toJSONArrayWithTransform(left, transform: transform)\n\t\tToJSON.optionalBasicType(values, map: map)\n\t}\n}\n\n\n/// Implicitly unwrapped optional array of Basic type with Transform\npublic func <- <Transform: TransformType>(left: inout [Transform.Object]!, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet values = fromJSONArrayWithTransform(map.currentValue, transform: transform)\n\t\tFromJSON.optionalBasicType(&left, object: values)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\n/// Dictionary of Basic type with Transform\npublic func <- <Transform: TransformType>(left: inout [String: Transform.Object], right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet values = fromJSONDictionaryWithTransform(map.currentValue, transform: transform)\n\t\tFromJSON.basicType(&left, object: values)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: [String: Transform.Object], right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tif map.mappingType == . toJSON {\n\t\tlet values = toJSONDictionaryWithTransform(left, transform: transform)\n\t\tToJSON.optionalBasicType(values, map: map)\n\t}\n}\n\n\n/// Optional dictionary of Basic type with Transform\npublic func <- <Transform: TransformType>(left: inout [String: Transform.Object]?, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet values = fromJSONDictionaryWithTransform(map.currentValue, transform: transform)\n\t\tFromJSON.optionalBasicType(&left, object: values)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: [String: Transform.Object]?, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON {\n\t\tlet values = toJSONDictionaryWithTransform(left, transform: transform)\n\t\tToJSON.optionalBasicType(values, map: map)\n\t}\n}\n\n\n/// Implicitly unwrapped optional dictionary of Basic type with Transform\npublic func <- <Transform: TransformType>(left: inout [String: Transform.Object]!, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet values = fromJSONDictionaryWithTransform(map.currentValue, transform: transform)\n\t\tFromJSON.optionalBasicType(&left, object: values)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\n// MARK:- Transforms of Mappable Objects - <T: BaseMappable>\n\n/// Object conforming to Mappable that have transforms\npublic func <- <Transform: TransformType>(left: inout Transform.Object, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet value: Transform.Object? = transform.transformFromJSON(map.currentValue)\n\t\tFromJSON.basicType(&left, object: value)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: Transform.Object, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON {\n\t\tlet value: Transform.JSON? = transform.transformToJSON(left)\n\t\tToJSON.optionalBasicType(value, map: map)\n\t}\n}\n\n\n/// Optional Mappable objects that have transforms\npublic func <- <Transform: TransformType>(left: inout Transform.Object?, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet value: Transform.Object? = transform.transformFromJSON(map.currentValue)\n\t\tFromJSON.optionalBasicType(&left, object: value)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: Transform.Object?, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON{\n\t\tlet value: Transform.JSON? = transform.transformToJSON(left)\n\t\tToJSON.optionalBasicType(value, map: map)\n\t}\n}\n\n\n/// Implicitly unwrapped optional Mappable objects that have transforms\npublic func <- <Transform: TransformType>(left: inout Transform.Object!, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet value: Transform.Object? = transform.transformFromJSON(map.currentValue)\n\t\tFromJSON.optionalBasicType(&left, object: value)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\n\n// MARK:- Dictionary of Mappable objects with a transform - Dictionary<String, T: BaseMappable>\n\n/// Dictionary of Mappable objects <String, T: Mappable> with a transform\npublic func <- <Transform: TransformType>(left: inout Dictionary<String, Transform.Object>, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tif map.mappingType == .fromJSON && map.isKeyPresent,\n\t\tlet object = map.currentValue as? [String: Any] {\n\t\tlet value = fromJSONDictionaryWithTransform(object as Any?, transform: transform) ?? left\n\t\tFromJSON.basicType(&left, object: value)\n\t} else if map.mappingType == .toJSON {\n\t\tleft >>> right\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: Dictionary<String, Transform.Object>, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON {\n\t\tlet value = toJSONDictionaryWithTransform(left, transform: transform)\n\t\tToJSON.basicType(value, map: map)\n\t}\n}\n\n\n/// Optional Dictionary of Mappable object <String, T: Mappable> with a transform\npublic func <- <Transform: TransformType>(left: inout Dictionary<String, Transform.Object>?, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tif map.mappingType == .fromJSON && map.isKeyPresent, let object = map.currentValue as? [String : Any]{\n\t\tlet value = fromJSONDictionaryWithTransform(object as Any?, transform: transform) ?? left\n\t\tFromJSON.optionalBasicType(&left, object: value)\n\t} else if map.mappingType == .toJSON {\n\t\tleft >>> right\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: Dictionary<String, Transform.Object>?, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON {\n\t\tlet value = toJSONDictionaryWithTransform(left, transform: transform)\n\t\tToJSON.optionalBasicType(value, map: map)\n\t}\n}\n\n\n/// Implicitly unwrapped Optional Dictionary of Mappable object <String, T: Mappable> with a transform\npublic func <- <Transform: TransformType>(left: inout Dictionary<String, Transform.Object>!, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tif map.mappingType == .fromJSON && map.isKeyPresent, let dictionary = map.currentValue as? [String : Any]{\n\t\tlet transformedDictionary = fromJSONDictionaryWithTransform(dictionary as Any?, transform: transform) ?? left\n\t\tFromJSON.optionalBasicType(&left, object: transformedDictionary)\n\t} else if map.mappingType == .toJSON {\n\t\tleft >>> right\n\t}\n}\n\n/// Dictionary of Mappable objects <String, T: Mappable> with a transform\npublic func <- <Transform: TransformType>(left: inout Dictionary<String, [Transform.Object]>, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\t\n\tif let dictionary = map.currentValue as? [String : [Any]], map.mappingType == .fromJSON && map.isKeyPresent {\n\t\tlet transformedDictionary = dictionary.map { (arg: (key: String, values: [Any])) -> (String, [Transform.Object]) in\n\t\t\tlet (key, values) = arg\n\t\t\tif let jsonArray = fromJSONArrayWithTransform(values, transform: transform) {\n\t\t\t\treturn (key, jsonArray)\n\t\t\t}\n\t\t\tif let leftValue = left[key] {\n\t\t\t\treturn (key, leftValue)\n\t\t\t}\n\t\t\treturn (key, [])\n\t\t}\n\t\t\n\t\tFromJSON.basicType(&left, object: transformedDictionary)\n\t} else if map.mappingType == .toJSON {\n\t\tleft >>> right\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: Dictionary<String, [Transform.Object]>, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\t\n\tif map.mappingType == .toJSON {\n\t\t\n\t\tlet transformedDictionary = left.map { (arg: (key: String, value: [Transform.Object])) in\n\t\t\treturn (arg.key, toJSONArrayWithTransform(arg.value, transform: transform) ?? [])\n\t\t}\n\t\t\n\t\tToJSON.basicType(transformedDictionary, map: map)\n\t}\n}\n\n\n/// Optional Dictionary of Mappable object <String, T: Mappable> with a transform\npublic func <- <Transform: TransformType>(left: inout Dictionary<String, [Transform.Object]>?, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\t\n\tif let dictionary = map.currentValue as? [String : [Any]], map.mappingType == .fromJSON && map.isKeyPresent {\n\t\t\n\t\tlet transformedDictionary = dictionary.map { (arg: (key: String, values: [Any])) -> (String, [Transform.Object]) in\n\t\t\tlet (key, values) = arg\n\t\t\tif let jsonArray = fromJSONArrayWithTransform(values, transform: transform) {\n\t\t\t\treturn (key, jsonArray)\n\t\t\t}\n\t\t\tif let leftValue = left?[key] {\n\t\t\t\treturn (key, leftValue)\n\t\t\t}\n\t\t\treturn (key, [])\n\t\t}\n\t\t\n\t\tFromJSON.optionalBasicType(&left, object: transformedDictionary)\n\t} else if map.mappingType == .toJSON {\n\t\tleft >>> right\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: Dictionary<String, [Transform.Object]>?, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\t\n\tif map.mappingType == .toJSON {\n\t\tlet transformedDictionary = left?.map { (arg: (key: String, values: [Transform.Object])) in\n\t\t\treturn (arg.key, toJSONArrayWithTransform(arg.values, transform: transform) ?? [])\n\t\t}\n\t\t\n\t\tToJSON.optionalBasicType(transformedDictionary, map: map)\n\t}\n}\n\n\n/// Implicitly unwrapped Optional Dictionary of Mappable object <String, T: Mappable> with a transform\npublic func <- <Transform: TransformType>(left: inout Dictionary<String, [Transform.Object]>!, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\t\n\tif let dictionary = map.currentValue as? [String : [Any]], map.mappingType == .fromJSON && map.isKeyPresent {\n\t\tlet transformedDictionary = dictionary.map { (arg: (key: String, values: [Any])) -> (String, [Transform.Object]) in\n\t\t\tlet (key, values) = arg\n\t\t\tif let jsonArray = fromJSONArrayWithTransform(values, transform: transform) {\n\t\t\t\treturn (key, jsonArray)\n\t\t\t}\n\t\t\tif let leftValue = left?[key] {\n\t\t\t\treturn (key, leftValue)\n\t\t\t}\n\t\t\treturn (key, [])\n\t\t}\n\t\tFromJSON.optionalBasicType(&left, object: transformedDictionary)\n\t} else if map.mappingType == .toJSON {\n\t\tleft >>> right\n\t}\n}\n\n// MARK:- Array of Mappable objects with transforms - Array<T: BaseMappable>\n\n/// Array of Mappable objects\npublic func <- <Transform: TransformType>(left: inout Array<Transform.Object>, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tif let transformedValues = fromJSONArrayWithTransform(map.currentValue, transform: transform) {\n\t\t\tFromJSON.basicType(&left, object: transformedValues)\n\t\t}\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: Array<Transform.Object>, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON {\n\t\tlet transformedValues = toJSONArrayWithTransform(left, transform: transform)\n\t\tToJSON.optionalBasicType(transformedValues, map: map)\n\t}\n}\n\n\n/// Optional array of Mappable objects\npublic func <- <Transform: TransformType>(left: inout Array<Transform.Object>?, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet transformedValues = fromJSONArrayWithTransform(map.currentValue, transform: transform)\n\t\tFromJSON.optionalBasicType(&left, object: transformedValues)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: Array<Transform.Object>?, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON {\n\t\tlet transformedValues = toJSONArrayWithTransform(left, transform: transform)\n\t\tToJSON.optionalBasicType(transformedValues, map: map)\n\t}\n}\n\n\n/// Implicitly unwrapped Optional array of Mappable objects\npublic func <- <Transform: TransformType>(left: inout Array<Transform.Object>!, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tlet transformedValues = fromJSONArrayWithTransform(map.currentValue, transform: transform)\n\t\tFromJSON.optionalBasicType(&left, object: transformedValues)\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\n// MARK:- Array of Array of objects - Array<Array<T>>> with transforms\n\n/// Array of Array of objects with transform\npublic func <- <Transform: TransformType>(left: inout [[Transform.Object]], right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .toJSON:\n\t\tleft >>> right\n\tcase .fromJSON where map.isKeyPresent:\n\t\tguard let original2DArray = map.currentValue as? [[Any]] else { break }\n\t\tlet transformed2DArray = original2DArray.flatMap { values in\n\t\t\tfromJSONArrayWithTransform(values as Any?, transform: transform)\n\t\t}\n\t\tFromJSON.basicType(&left, object: transformed2DArray)\n\tdefault:\n\t\tbreak\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: [[Transform.Object]], right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON{\n\t\tlet transformed2DArray = left.flatMap { values in\n\t\t\ttoJSONArrayWithTransform(values, transform: transform)\n\t\t}\n\t\tToJSON.basicType(transformed2DArray, map: map)\n\t}\n}\n\n/// Optional array of array of objects with transform\npublic func <- <Transform: TransformType>(left: inout [[Transform.Object]]?, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .toJSON:\n\t\tleft >>> right\n\tcase .fromJSON where map.isKeyPresent:\n\t\tguard let original2DArray = map.currentValue as? [[Any]] else { break }\n\t\tlet transformed2DArray = original2DArray.flatMap { values in\n\t\t\tfromJSONArrayWithTransform(values as Any?, transform: transform)\n\t\t}\n\t\tFromJSON.optionalBasicType(&left, object: transformed2DArray)\n\tdefault:\n\t\tbreak\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: [[Transform.Object]]?, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON {\n\t\tlet transformed2DArray = left?.flatMap { values in\n\t\t\ttoJSONArrayWithTransform(values, transform: transform)\n\t\t}\n\t\tToJSON.optionalBasicType(transformed2DArray, map: map)\n\t}\n}\n\n\n/// Implicitly unwrapped Optional array of array of objects with transform\npublic func <- <Transform: TransformType>(left: inout [[Transform.Object]]!, right: (Map, Transform)) {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .toJSON:\n\t\tleft >>> right\n\tcase .fromJSON where map.isKeyPresent:\n\t\tguard let original2DArray = map.currentValue as? [[Any]] else { break }\n\t\tlet transformed2DArray = original2DArray.flatMap { values in\n\t\t\tfromJSONArrayWithTransform(values as Any?, transform: transform)\n\t\t}\n\t\tFromJSON.optionalBasicType(&left, object: transformed2DArray)\n\tdefault:\n\t\tbreak\n\t}\n}\n\n// MARK:- Set of Mappable objects with a transform - Set<T: BaseMappable>\n\n/// Set of Mappable objects with transform\npublic func <- <Transform: TransformType>(left: inout Set<Transform.Object>, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tif let transformedValues = fromJSONArrayWithTransform(map.currentValue, transform: transform) {\n\t\t\tFromJSON.basicType(&left, object: Set(transformedValues))\n\t\t}\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: Set<Transform.Object>, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON {\n\t\tlet transformedValues = toJSONArrayWithTransform(Array(left), transform: transform)\n\t\tToJSON.optionalBasicType(transformedValues, map: map)\n\t}\n}\n\n\n/// Optional Set of Mappable objects with transform\npublic func <- <Transform: TransformType>(left: inout Set<Transform.Object>?, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tif let transformedValues = fromJSONArrayWithTransform(map.currentValue, transform: transform) {\n\t\t\tFromJSON.basicType(&left, object: Set(transformedValues))\n\t\t}\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\npublic func >>> <Transform: TransformType>(left: Set<Transform.Object>?, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tif map.mappingType == .toJSON {\n\t\tif let values = left {\n\t\t\tlet transformedValues = toJSONArrayWithTransform(Array(values), transform: transform)\n\t\t\tToJSON.optionalBasicType(transformedValues, map: map)\n\t\t}\n\t}\n}\n\n\n/// Implicitly unwrapped Optional set of Mappable objects with transform\npublic func <- <Transform: TransformType>(left: inout Set<Transform.Object>!, right: (Map, Transform)) where Transform.Object: BaseMappable {\n\tlet (map, transform) = right\n\tswitch map.mappingType {\n\tcase .fromJSON where map.isKeyPresent:\n\t\tif let transformedValues = fromJSONArrayWithTransform(map.currentValue, transform: transform) {\n\t\t\tFromJSON.basicType(&left, object: Set(transformedValues))\n\t\t}\n\tcase .toJSON:\n\t\tleft >>> right\n\tdefault: ()\n\t}\n}\n\n\nprivate func fromJSONArrayWithTransform<Transform: TransformType>(_ input: Any?, transform: Transform) -> [Transform.Object]? {\n\tif let values = input as? [Any] {\n\t\treturn values.flatMap { value in\n\t\t\treturn transform.transformFromJSON(value)\n\t\t}\n\t} else {\n\t\treturn nil\n\t}\n}\n\nprivate func fromJSONDictionaryWithTransform<Transform: TransformType>(_ input: Any?, transform: Transform) -> [String: Transform.Object]? {\n\tif let values = input as? [String: Any] {\n\t\treturn values.filterMap { value in\n\t\t\treturn transform.transformFromJSON(value)\n\t\t}\n\t} else {\n\t\treturn nil\n\t}\n}\n\nprivate func toJSONArrayWithTransform<Transform: TransformType>(_ input: [Transform.Object]?, transform: Transform) -> [Transform.JSON]? {\n\treturn input?.flatMap { value in\n\t\treturn transform.transformToJSON(value)\n\t}\n}\n\nprivate func toJSONDictionaryWithTransform<Transform: TransformType>(_ input: [String: Transform.Object]?, transform: Transform) -> [String: Transform.JSON]? {\n\treturn input?.filterMap { value in\n\t\treturn transform.transformToJSON(value)\n\t}\n}\n"
  },
  {
    "path": "Pods/ObjectMapper/Sources/TransformType.swift",
    "content": "//\n//  TransformType.swift\n//  ObjectMapper\n//\n//  Created by Syo Ikeda on 2/4/15.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2016 Hearst\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\npublic protocol TransformType {\n\tassociatedtype Object\n\tassociatedtype JSON\n\n\tfunc transformFromJSON(_ value: Any?) -> Object?\n\tfunc transformToJSON(_ value: Object?) -> JSON?\n}\n"
  },
  {
    "path": "Pods/ObjectMapper/Sources/URLTransform.swift",
    "content": "//\n//  URLTransform.swift\n//  ObjectMapper\n//\n//  Created by Tristan Himmelman on 2014-10-27.\n//\n//  The MIT License (MIT)\n//\n//  Copyright (c) 2014-2016 Hearst\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\nopen class URLTransform: TransformType {\n\tpublic typealias Object = URL\n\tpublic typealias JSON = String\n\tprivate let shouldEncodeURLString: Bool\n\tprivate let allowedCharacterSet: CharacterSet\n\n\t/**\n\tInitializes the URLTransform with an option to encode URL strings before converting them to an NSURL\n\t- parameter shouldEncodeUrlString: when true (the default) the string is encoded before passing\n\tto `NSURL(string:)`\n\t- returns: an initialized transformer\n\t*/\n\tpublic init(shouldEncodeURLString: Bool = false, allowedCharacterSet: CharacterSet = .urlQueryAllowed) {\n\t\tself.shouldEncodeURLString = shouldEncodeURLString\n\t\tself.allowedCharacterSet = allowedCharacterSet\n\t}\n\n\topen func transformFromJSON(_ value: Any?) -> URL? {\n\t\tguard let URLString = value as? String else { return nil }\n\t\t\n\t\tif !shouldEncodeURLString {\n\t\t\treturn URL(string: URLString)\n\t\t}\n\n\t\tguard let escapedURLString = URLString.addingPercentEncoding(withAllowedCharacters: allowedCharacterSet) else {\n\t\t\treturn nil\n\t\t}\n\t\treturn URL(string: escapedURLString)\n\t}\n\n\topen func transformToJSON(_ value: URL?) -> String? {\n\t\tif let URL = value {\n\t\t\treturn URL.absoluteString\n\t\t}\n\t\treturn nil\n\t}\n}\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t017B5B39D7D0CCD88DEAB2F1F5D0D274 /* TYPageControl.h in Headers */ = {isa = PBXBuildFile; fileRef = A93A51F7564EC64C94864C9A11DF7A0D /* TYPageControl.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t019D5A551A09E129AE3D95BCB378028E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F10EACF1B2D7C5A4C670634756973B3 /* Foundation.framework */; };\n\t\t022580D7BA3860D083FC817324DDD52D /* AsMaybe.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDA69717822ACCAAF367E9F539039219 /* AsMaybe.swift */; };\n\t\t023B9DEF425CEF2B0993CC116B9D7748 /* Completable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52986B63E04FBCE90E31182FC836DF8C /* Completable.swift */; };\n\t\t02A8CD406255AE081E99A62241BAC587 /* IQToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 155A351F30BA1128E99E067F81CB72B2 /* IQToolbar.swift */; };\n\t\t03649B1E46C35FC5D9BC8CE4EFC3AF5D /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE28FDBE90B525AD5F5FF81C344D3D2A /* RxSwift.framework */; };\n\t\t03905D0FD58E772457B809C9443B9633 /* NetworkActivityPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C02566F282B7374FFE638BE27D65EBC /* NetworkActivityPlugin.swift */; };\n\t\t03CE3310204ECD17C80FA496A818DA47 /* SwiftyJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DBD4CA78A84FE60982AF0780EC62DD2 /* SwiftyJSON.swift */; };\n\t\t03E8239071E8786ED0AFD90253814966 /* Throttle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C099BC759B6B4145E48DE537580E13 /* Throttle.swift */; };\n\t\t051F11606D79C85C63FD6BDEE5C2A6E8 /* RefCountDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C5BD7D77FAF305B2C6E8F85C768FC42 /* RefCountDisposable.swift */; };\n\t\t05E3461942D63CA142876829DF2178B3 /* DispatchQueue+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5367CAC7283271F0E12047EE1E54190 /* DispatchQueue+Extensions.swift */; };\n\t\t0638F162B79029D25571C968F00A8721 /* InfiniteSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 404B3E0121644CBA834D592A1EB4E364 /* InfiniteSequence.swift */; };\n\t\t068C7761D808018F145A97CA20A231BC /* Just.swift in Sources */ = {isa = PBXBuildFile; fileRef = 096040CC61B2863666482591D451AA38 /* Just.swift */; };\n\t\t068EE77B364B309A5973AA63DCE763D0 /* Endpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74A0AC039E269E338928C0D25F4ABC01 /* Endpoint.swift */; };\n\t\t06CCF3314F269406C8705B30D86CFD7C /* TextInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE48FA13FBA4585E33723ED2572A6754 /* TextInput.swift */; };\n\t\t07159A933B3C47A02FE2B2744ABAAC89 /* MJRefreshStateHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 613B23B6CFFCB99006B5893BE2C653A5 /* MJRefreshStateHeader.m */; };\n\t\t07432E8DEA8B25795C7C545AA67A0187 /* ImageTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56FC32B26F57769DE2EFE454C78CC62C /* ImageTransition.swift */; };\n\t\t07786426A59FC42A5077B8B28EF25834 /* SkipWhile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CF8C44E75B472322D8DC2B86B893ED9 /* SkipWhile.swift */; };\n\t\t07CBA63D00073C1C74402986AE9277C3 /* Timer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 039485063DF511DC852BBCD65C474C9B /* Timer.swift */; };\n\t\t084482D74A1740BF8258EEF9FEC9C93A /* Maybe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C8ADE73FE10FA15ABAA1CB4FB6DAD62 /* Maybe.swift */; };\n\t\t089250578AFBD4AD861843847252D462 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F10EACF1B2D7C5A4C670634756973B3 /* Foundation.framework */; };\n\t\t09FA411E4CCB0B52628890F610065A66 /* DelaySubscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 770CC8138D39A339E5C8057EC2DD1F7D /* DelaySubscription.swift */; };\n\t\t0A10103215004C9822201FB9572B2C00 /* TYPagerController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F5B9A2F08507775E806FE12ED90BAF6 /* TYPagerController.m */; };\n\t\t0A1E34B4A27DCD62A914F3B028A07E6C /* UIView+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = ABF289602106E94D3F277B9C7F39FF7C /* UIView+MJExtension.m */; };\n\t\t0A936243CBB929114D3405F0AC7C234F /* UIRefreshControl+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7645EEB7C195C4CF487DFA28BA57D8E5 /* UIRefreshControl+Rx.swift */; };\n\t\t0A9C9898D2B1246BFC5F26FC2E44F312 /* URLConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28C85F1DBF1BC0BBAE450D1FBEA54A9F /* URLConvertible.swift */; };\n\t\t0C83C395557B207600B4BFEFB71F662D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F10EACF1B2D7C5A4C670634756973B3 /* Foundation.framework */; };\n\t\t0CA6357476373C221D44C498AA1D65FE /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F10EACF1B2D7C5A4C670634756973B3 /* Foundation.framework */; };\n\t\t0DC7585DE4582FFC698D5CA7F7987868 /* ConstraintMultiplierTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B6E2178443AA8FE2901D19303B3B8F9 /* ConstraintMultiplierTarget.swift */; };\n\t\t0DD634DCA2EE6C8DA4C13EEC73849EFD /* ConstraintAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5EB9FACBAF778C2D7E39429AAFFADE7 /* ConstraintAttributes.swift */; };\n\t\t0DF6F077A01F83D2296F474A6657D3DA /* UICollectionView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51BA22372DFDD297D4C486B391AE3C50 /* UICollectionView+Rx.swift */; };\n\t\t0EEB4473FC528447BEC20C32448BF58E /* InvocableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 593B68AD069BBE7957F7B4AE1E9F164A /* InvocableType.swift */; };\n\t\t0EEBFA3280A544CB4F48B94672825C03 /* Constraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52A0824858ABB06E40B1588D14FF9498 /* Constraint.swift */; };\n\t\t0EFB524EFDF2F8712A2F5067817A672E /* UIScrollView+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = F76E37DE05B72E5ACE3CC2FEA524DC00 /* UIScrollView+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t0F7E94DE4A01E0C2DE3D8FEF7A8DA76B /* NSTextStorage+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = F728D985BB2068A70834B0E454690223 /* NSTextStorage+Rx.swift */; };\n\t\t0F981C56836FE34E921BC7253826A170 /* CustomDateFormatTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D811B382CEAC4FADDA971AFE90AD50A /* CustomDateFormatTransform.swift */; };\n\t\t0FD6CD7FBCB5EB6CEC1CABC3CAE78B12 /* Merge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14223DB3BAAFC3650B856F3ED4CA3293 /* Merge.swift */; };\n\t\t101F0992A8ADA071018179C8A35A2DB6 /* Completable+AndThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF01C2ED8BF6578C8212FD3EAC90D3E2 /* Completable+AndThen.swift */; };\n\t\t101F836F887C01B45F4DCF351EBC28D1 /* MJRefreshBackNormalFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = DC01CD4F0AF25E87AE052DB77D446F12 /* MJRefreshBackNormalFooter.m */; };\n\t\t1091FE5A37CC5E22263AED304386D408 /* SwitchIfEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0E83A69D9C8F0B40317DD90BF832D26 /* SwitchIfEmpty.swift */; };\n\t\t10AD5E70FDD53228153032C58FBF4D52 /* String+MD5.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348D24C7C0138AD0B581B484EA58AD8B /* String+MD5.swift */; };\n\t\t10B28E1329EC509470D6073426296383 /* AnonymousDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0B487DA905C4F895E0D126C1A062261 /* AnonymousDisposable.swift */; };\n\t\t10EB23E9ECC4B33E16933BB1EA560B6A /* Timeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FF0A342E014C442F7C7474857AF5961 /* Timeline.swift */; };\n\t\t111388F3289E572B7FF90312D3C23DD1 /* RxTableViewDataSourceProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7553CCC7443EE20DAEB595357CD7198F /* RxTableViewDataSourceProxy.swift */; };\n\t\t11F2729CD19FF2CBFE91E3D4A5A3D088 /* String+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D3CBDD7BD1351D05617EDFD0171017D /* String+Rx.swift */; };\n\t\t1248CDC903C16DF981D48B43CC8CFDC5 /* UINavigationItem+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 610EF28DB806E2D0ECBF17409EB9EABE /* UINavigationItem+Rx.swift */; };\n\t\t1314F3F62B92768E16CBFF1490AF29DE /* TYTabPagerController.m in Sources */ = {isa = PBXBuildFile; fileRef = 24B87BC6C657291DEE2644EFCB9CA341 /* TYTabPagerController.m */; };\n\t\t134859C42E05396F62489E4329ECF6EA /* ToJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42A26062E1F6F9B2A5BC508EA3D00288 /* ToJSON.swift */; };\n\t\t13575C4CA4D1D8F0DBB6E2164CBFF620 /* SwiftSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DB825CD3DE4C8C88F1EB6E75E3046B2 /* SwiftSupport.swift */; };\n\t\t1500C42EA85F1F32A0DFA87FE8320E24 /* SnapKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E257A033C34CB083326378E455CBA7C /* SnapKit-dummy.m */; };\n\t\t15597F37A6D45F2D0F52932109960222 /* SwiftyJSON-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C8B8D267B8E5E2A789EBA75CCFF121F2 /* SwiftyJSON-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t157E33FBE3B7D1D7996ADD2848628BC2 /* ConstraintDescription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CB1A48DF38EB6B4A32ADD9DF79B73FF /* ConstraintDescription.swift */; };\n\t\t15A0DC01842AFC68403331D8324AC790 /* ConstraintRelation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C458E0D7CD6F0DD83AC852BC8419AD7 /* ConstraintRelation.swift */; };\n\t\t176FE089B6CA019DC6F5B0D2521FDFB7 /* TYTabPagerView.h in Headers */ = {isa = PBXBuildFile; fileRef = 22B5011A39DF5849503132CEE075CC1E /* TYTabPagerView.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t1784A1AE7CB88EA9BF1A9CF7377C8090 /* Producer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DC2D7127D27BDD70C5EC0A4FF96074D /* Producer.swift */; };\n\t\t17F033046E658F3BFD0011DCB768CF54 /* MJRefreshBackNormalFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = F1D0EF5DC8B377434B4B9FAA777B65E0 /* MJRefreshBackNormalFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t1827E7D94F3A12CA0C58EF33AE4B026D /* KingfisherOptionsInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = B28CBB9A2FC6BD76A7188D520046176D /* KingfisherOptionsInfo.swift */; };\n\t\t1843E6DF520A5EFE9C83C38E18578E42 /* MJRefreshAutoStateFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = E6F687744CD01C74158C6A8CA1C9B497 /* MJRefreshAutoStateFooter.m */; };\n\t\t186AC9E5D41A13F254AA6A111A659C86 /* DispatchQueue+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96BC1A1EF9084AA9223F0E5E094C6ABC /* DispatchQueue+Extensions.swift */; };\n\t\t1894026C296B8A77711607C98ED40C86 /* IntegerOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81B6FFA1A029CC85A9BD8A4847631CD7 /* IntegerOperators.swift */; };\n\t\t18C27FC3DA935FF02249B00D2410C6D3 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80A58779165736F60C355BBAAF75C027 /* Errors.swift */; };\n\t\t18E9B5E96557418567FCB7DCC559299F /* TransformOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = F03D2DC1D0CBA5B7FB557A21D0DA5771 /* TransformOperators.swift */; };\n\t\t194858D10B9B1DD9FFEFBE4EAA0700F3 /* TransformOf.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DED5486ED70B440763840FA459F4698 /* TransformOf.swift */; };\n\t\t1991BB121497AC9447A5DC6445464176 /* UITextField+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7088D6C1ADBF5BBD12CFF84A0E220FA2 /* UITextField+Rx.swift */; };\n\t\t1A84FB9D49D5E5E8EC11B4BFA93CD7FE /* Pods-RxXMLY-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 17CB2FA1178A4F2E225AE19BEFEB3B81 /* Pods-RxXMLY-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t1B9EDEDC964E6B08F78920B4F4B9DB84 /* Alamofire-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 21805A4E1E5079259A7A86A6D073E71B /* Alamofire-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t1C8AFF6985D76BB339539D41CCC403F6 /* Dematerialize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8ACB6BCA51D81D396B134C596B0FB8C1 /* Dematerialize.swift */; };\n\t\t1D16749675E7E62321F1D550ED6CE78F /* SubscribeOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 137E979916631AD9ACADADEEEBBBAE5B /* SubscribeOn.swift */; };\n\t\t1DAF3BB88351664576507F774FEB051C /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D3E83D571BF2E77162C09F72FD66D3C /* Filter.swift */; };\n\t\t1E340BDD912879B4160C43D9982104EC /* LockOwnerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5D6508C06EC007A57DBB3099AD5C617 /* LockOwnerType.swift */; };\n\t\t1ED1D03FFEB9595492A4F8783D35F81C /* UIView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8546B56E228E6A78E32833D60BB6D648 /* UIView+Rx.swift */; };\n\t\t1ED505CC385A149F4DF8F4B94BA4FC0B /* MJRefreshBackStateFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = F9218E907F18A770B1DFDE2EDEAA3480 /* MJRefreshBackStateFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t1F0F49D029C4471F2AE3712D1FCB1D8A /* IQTitleBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F99F2A0C1CCF46EC645BA9E65F78200 /* IQTitleBarButtonItem.swift */; };\n\t\t1F242D91138AD1C8F49DCDA41B71461F /* UISearchBar+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2316CDD5367CCF5307F4C680E70DBBA /* UISearchBar+Rx.swift */; };\n\t\t1F34D539C0D864807B558FC80839C15A /* ConstraintItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10DC35A2E29CA2B46E24A2F022E9163B /* ConstraintItem.swift */; };\n\t\t1FCC0970C8435F10768CA84C2025A177 /* Resource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B95FDEC37C94B6EBD089F1AD6038F94 /* Resource.swift */; };\n\t\t2082EB4AA16440FFD5479FAFC0181066 /* Indicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D450DFC0A437B3075E6E68C0FA1A2B3 /* Indicator.swift */; };\n\t\t208482EE9B0AF0B0557F8E32F1B7A290 /* DispatchQueueConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36DC95F95B0777638C99DDB71789CF16 /* DispatchQueueConfiguration.swift */; };\n\t\t216DC034D3FF185097D5C162323EA37C /* SchedulerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE49DD1F3CB80E0DCB3ED742E3DED62B /* SchedulerType.swift */; };\n\t\t22B40C80735B7CFAC7106C5FF6EA542F /* URLNavigator-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D783020743D1A18018EE614D78D965A2 /* URLNavigator-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t2305F81424A8EA4AC22ED71E2EE69AD1 /* PriorityQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEB35F8259524796939172BEB9769CB6 /* PriorityQueue.swift */; };\n\t\t2384AC373E752D55842F37DE4F2CE2A7 /* IQUIScrollView+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB352C9155E142C44FAE86885DBC3E62 /* IQUIScrollView+Additions.swift */; };\n\t\t2396E8B97AED713A2F93792BB324738B /* SkipUntil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30C22B352D9B240DC40532BF2241C498 /* SkipUntil.swift */; };\n\t\t23BE46034D9F742CFFED1D6B7A25A2E1 /* RxTextViewDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3771D2D60EF94F8BBA0E912C27A80D24 /* RxTextViewDelegateProxy.swift */; };\n\t\t2478D027E97BFE0F71CF21D8B9E8020F /* RxSwift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2D2C96C6D5355207398C46C9E66386BE /* RxSwift-dummy.m */; };\n\t\t2524EC4EF024A6C067A0FA082084CFB5 /* MJRefreshBackStateFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BF9B78A8693992A08F4F159CCDE50CA /* MJRefreshBackStateFooter.m */; };\n\t\t255C4ADB2BD82FEEF86A3D4D43F31C63 /* ISO8601DateTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4851621D756478D43208A461240D7CF /* ISO8601DateTransform.swift */; };\n\t\t25729D655583EBF1BDE99FF6BEAC272C /* RxSearchBarDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0197B6C172230E3E4655E94AFC0EFD32 /* RxSearchBarDelegateProxy.swift */; };\n\t\t25B9DC627989966BCF1DCECDABD78D23 /* RxGesture-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E010BA57C8A6D94C6A65D63FA871BFCB /* RxGesture-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t2615F7FE9AF4BF4955E9CB747E98FC21 /* AnimationConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E8E6375D3923532919D7663A2689D73 /* AnimationConfiguration.swift */; };\n\t\t2616DFB5A134CFB3D2F88848CA6730A6 /* Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC8A134B3C9407540FCDEC584183133D /* Rx.swift */; };\n\t\t2641C5F2AF734454E8A6DF94E606EE71 /* MoyaError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F9BB5EBA26D7BF9CA0C3B21B1AAD9EE /* MoyaError.swift */; };\n\t\t267F1D36C8E6ED6B5CBD0DACA0FB38C3 /* UIImageView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBF02AD8B77821AA7137D153FD7D26DC /* UIImageView+Rx.swift */; };\n\t\t27156C9092B7A82E24CF96312A941150 /* TransformType.swift in Sources */ = {isa = PBXBuildFile; fileRef = F73232742568F2DC4E279896B22BA8A3 /* TransformType.swift */; };\n\t\t2738EFBB546EAD1A60E9426A13D68CEB /* UIProgressView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C4B50F1957DB069477D1DF3B46EE040 /* UIProgressView+Rx.swift */; };\n\t\t273AF2009B201DC6C16AEF4030FFDFE6 /* ReactorKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 1BC61193B3F56535040C0A61FA71C455 /* ReactorKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t282E6F0E67F3799B0ABCB9ED96B666A9 /* RequestModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5BFA257EAD55FA150B56C6B292EAA44 /* RequestModifier.swift */; };\n\t\t283410C5EE7D346795416AC105C37733 /* RxCollectionViewSectionedReloadDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7897B0DA6B24D6557C87D44F527163A2 /* RxCollectionViewSectionedReloadDataSource.swift */; };\n\t\t28766FD0E20C59920C9235FF0BCB22A2 /* Then-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D6AD0538BC7F97DC3694296C53DBE9C8 /* Then-dummy.m */; };\n\t\t289F681251A15B7EF356F7198CB3A5CE /* Range.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEB5737B2DA2DF3423F29C0CBB7542DA /* Range.swift */; };\n\t\t29188F71B40A3F6A817C5369E3DBA7FF /* HasDisposeBag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4896403B4FA72B445E17270A138939D3 /* HasDisposeBag.swift */; };\n\t\t2950762546DE22AB539CDBD87B000951 /* UITapGestureRecognizer+RxGesture.swift in Sources */ = {isa = PBXBuildFile; fileRef = 589D959893A1EF698394AAC806F18758 /* UITapGestureRecognizer+RxGesture.swift */; };\n\t\t29560D9109C9140F67F3105A1DE0A5F8 /* TTRangeSliderDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = B86E459038ACF95C44868462505C56A6 /* TTRangeSliderDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t2968F27F99F394EABFF42645167C47A7 /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB7464D95C191D51D7944010316440FF /* Response.swift */; };\n\t\t29AEA44F673962935BCE359544C2EE0D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F10EACF1B2D7C5A4C670634756973B3 /* Foundation.framework */; };\n\t\t2A194A7EBF3AF8D602791B5686534941 /* UIStepper+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDB96EFEBACCC377C2C1852E1187BDE3 /* UIStepper+Rx.swift */; };\n\t\t2A1B0B5AAC6B121823473D167C5B372E /* CurrentThreadScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA47B9E0DFFD8D15F19F5033E63B9026 /* CurrentThreadScheduler.swift */; };\n\t\t2A2FE216328BFC23AF9D30EAEFAA2303 /* IQKeyboardManager.bundle in Resources */ = {isa = PBXBuildFile; fileRef = D58AEC2CC3F21D23D64B1106A4C82CA2 /* IQKeyboardManager.bundle */; };\n\t\t2A7AE49F85F20FEDA1833CAB32D7933D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F10EACF1B2D7C5A4C670634756973B3 /* Foundation.framework */; };\n\t\t2ACB302D10B4EBDD404FE7781B7EB24D /* ObservableConvertibleType+Signal.swift in Sources */ = {isa = PBXBuildFile; fileRef = E91D5BAB4A332A7524C3625B57B61925 /* ObservableConvertibleType+Signal.swift */; };\n\t\t2BF0E4469C13CAA14361A3D5B07E1706 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F10EACF1B2D7C5A4C670634756973B3 /* Foundation.framework */; };\n\t\t2C33DAACDC03995C3FEC4FA750B506CE /* SnapKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D2D55E77F429A861A4AEA5872801C81A /* SnapKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t2C5FA28BC6344178AFF753F9BEEC172F /* UIPageControl+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = B599D41042A76B9DF98EB3822B3056BA /* UIPageControl+Rx.swift */; };\n\t\t2CEA12D52F3F7AC0669C99A157E19F62 /* MJRefreshBackGifFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = B7AB99038CF5A8302F1BE2D35B09885A /* MJRefreshBackGifFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t2D628BD8A654993F779B1C05DC8A4F4C /* Debounce.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23E72118C85ED536830E63BFEF402950 /* Debounce.swift */; };\n\t\t2D89AB26203628C04B3E87D045525701 /* MapError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ADE1D2FF0526260DCE037584DAB5A0D /* MapError.swift */; };\n\t\t2E024197B07B741D9A5BFB4CC13872FC /* Platform.Linux.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A82E326004C5937DB3D98AD29CEDFBA /* Platform.Linux.swift */; };\n\t\t2E1C908C7B515E06E6ACE5D56B2D0037 /* MainScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = E420D6F4781A96E122D216CBDA976615 /* MainScheduler.swift */; };\n\t\t2F288ED3641B2B4775884C462AE377E6 /* Kingfisher-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 36B939D525A7B01D959ECFCBDE9C0550 /* Kingfisher-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t2F711ADC9F8930796D22855B9DD7AE42 /* RxPickerViewAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84378AB9BAB98B7273235CFA0707DE2D /* RxPickerViewAdapter.swift */; };\n\t\t306C95EBAA55143914CC0AAA88E769D1 /* GestureFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87C5FAB0B3B58A21449A74F3BE0722D4 /* GestureFactory.swift */; };\n\t\t3077B4186B916A8DB980BBB72DF7FFB9 /* IQUIView+Hierarchy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EF8AC35D0E53603F8A97DBBE9FA33E2 /* IQUIView+Hierarchy.swift */; };\n\t\t3185243C5F5AD72D5DF9D3D7CEAD5237 /* ConstraintView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02ACAB88021BEBB2FCA8B6883F2CE332 /* ConstraintView+Extensions.swift */; };\n\t\t3244910D451D0BBF516D27D067C9A5C4 /* ShareReplayScope.swift in Sources */ = {isa = PBXBuildFile; fileRef = E127D4A1CC515D5A1562D756ADE9089E /* ShareReplayScope.swift */; };\n\t\t32995C9F464270A5E2D36056E9B5190B /* LayoutConstraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 553E666C8126DEAEA023EE677226741F /* LayoutConstraint.swift */; };\n\t\t339CF382B95EBAEAC534A4DB86412D49 /* UIApplication+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58674873A60E033E010D6D00276BA742 /* UIApplication+Rx.swift */; };\n\t\t340B17F6811B1F4D98C92209B4A68C5A /* Buffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BB1570E1320634AB029069C7CA04D40 /* Buffer.swift */; };\n\t\t3433BF7613AB168C91A7310C0B5CE6A9 /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5D465BD6EB72259B11615DB9761D3DB /* MultipartFormData.swift */; };\n\t\t344DB99F8332029C0391F08B6D0E425C /* MJRefreshAutoNormalFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D076E9D89814329C802E72B0C0229A2 /* MJRefreshAutoNormalFooter.m */; };\n\t\t34E6139A80CA53099913276CC5157304 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F10EACF1B2D7C5A4C670634756973B3 /* Foundation.framework */; };\n\t\t356CB228C18677929A9A520E77620B13 /* RxCocoaObjCRuntimeError+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 809E8BEC46CF11685F9980428C93B446 /* RxCocoaObjCRuntimeError+Extensions.swift */; };\n\t\t35CE9431B032341D2B6C4FF4384C84AB /* RxTableViewReactiveArrayDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6BE51ED2DAF09F29A0DDADC0911D49B /* RxTableViewReactiveArrayDataSource.swift */; };\n\t\t35D685CF7C6F73A65AD3DD99674CA78F /* MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = FC57AF3FEB7D99891C6F7BD5610269D7 /* MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t3626B94094672CB1C9DEA32B9F9502E1 /* TaskDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CE37D8A7C1180573189B3F4D4D5D2A0 /* TaskDelegate.swift */; };\n\t\t3666B742397E794ED820CC7AF304560C /* URLNavigator-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 504FC395E9A355EFA723008D25BE2E85 /* URLNavigator-dummy.m */; };\n\t\t36C33EC0952D217038E06134251A4267 /* NetworkLoggerPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E3539D710126BA8CE5B7B6A9EBF994E /* NetworkLoggerPlugin.swift */; };\n\t\t377636521A7593EE0D162CA57DD21C2A /* RxTabBarControllerDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D01082F46B5E949B212F6A27CDEF6DF /* RxTabBarControllerDelegateProxy.swift */; };\n\t\t3829CBCC3598DB13C2AD3B7383D1F24A /* MJRefreshFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 0748670A15DF8EB5BA1C623F6B944876 /* MJRefreshFooter.m */; };\n\t\t383C9A8DB84B83233633C3A00A2C1608 /* KingfisherManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59830F33473DBCA365D965B7747764A8 /* KingfisherManager.swift */; };\n\t\t38F166338687E3EDD813EC86634B915F /* _RXObjCRuntime.h in Headers */ = {isa = PBXBuildFile; fileRef = B0D0CA0D4B6A0E2EB840F4E5D6C75340 /* _RXObjCRuntime.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t3AF4EE85A4140EBA123BA54FBFC1ADF9 /* Delay.swift in Sources */ = {isa = PBXBuildFile; fileRef = A25F9545112FB4EA2545D303AC81CFB1 /* Delay.swift */; };\n\t\t3AF8D0984A8BD088E7135F79FCA0AD78 /* AssociatedObjectStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83A11C513330652C7580864E6FF559BC /* AssociatedObjectStore.swift */; };\n\t\t3B1C65D9BB266645228E3FF013A67A62 /* RxGesture-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BE0C2F5C5C4F8CD822C21482EBE49DD8 /* RxGesture-dummy.m */; };\n\t\t3D68B2DD0D49F92CFE4D07447D4861FA /* Generate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E6B1DB2C5390EA79CEFCA5BAC709AFF /* Generate.swift */; };\n\t\t3DA75181D1B7D20F0CDE54EA97C3072C /* _RXDelegateProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2DEC3152A51E8F66A48451B7A4EC9704 /* _RXDelegateProxy.m */; };\n\t\t3F7E121270CEB5622C8E10DE12E11E40 /* Platform.Darwin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17F817A4133AB7260E9700802CE54631 /* Platform.Darwin.swift */; };\n\t\t3F911616F29C285D5A4D7F534F4412FC /* Then-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = F71B53FF12451C5503271983A3FE932B /* Then-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t3FF87BDA510674F117F6EA54871A33F5 /* _RXDelegateProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 2534A262C08145CCB9C56D17DB32573D /* _RXDelegateProxy.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t40092E84B6E1A2354BEDE901662715E1 /* TYCyclePagerView.h in Headers */ = {isa = PBXBuildFile; fileRef = 01974B7A9277DCB1555881FFD8B7A8E1 /* TYCyclePagerView.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t40765AAA791D6DFC0022639E348F0E6A /* FormatIndicatedCacheSerializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FDFBC7B8CD4E93779C4C76ACF38B06D /* FormatIndicatedCacheSerializer.swift */; };\n\t\t413C2A3759ABEC870AAE61F28C258C31 /* ImageDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB757B34331F94A8CE2ABFE0AC0050D4 /* ImageDownloader.swift */; };\n\t\t41F2693C7BDA9AA4141C2017F724EB92 /* GroupedObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE4600B7894931DEAFCABE02CD7AB268 /* GroupedObservable.swift */; };\n\t\t4215D7313CE6E738AAD80E9FEC6C60CC /* DateFormatterTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 655359FE97777A5E6376898C32918AD1 /* DateFormatterTransform.swift */; };\n\t\t4257A939388AC78D0B3466520A06879B /* Debugging.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D315F44377FFD3AEDE15898C2971BEC /* Debugging.swift */; };\n\t\t42C4C9573928B869632A7829D9A6BCBE /* Queue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 502F0D4E9FE8FBC064C04982F146FE43 /* Queue.swift */; };\n\t\t4303F3EF9822CB9AEB720051B0FD4F6B /* Sample.swift in Sources */ = {isa = PBXBuildFile; fileRef = 351865278BBE506A2B088B8755AD46BD /* Sample.swift */; };\n\t\t4323B40B40C5D9EF55A1E88569EE9C8E /* AsyncLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = A276DD5300A0CD1F004D67179921FE96 /* AsyncLock.swift */; };\n\t\t43B97E40D05359125AA9EB9A928D53C7 /* SharedSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF66AEF465B9C56A648DA16DBF3D2E4E /* SharedSequence.swift */; };\n\t\t43D9EDAE797E70640D7B55EB56DA871E /* SynchronizedOnType.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE4CFCC4E9A965F95EE17202FBB5F310 /* SynchronizedOnType.swift */; };\n\t\t442CB576089010AAA46D4D5977388D87 /* Platform.Linux.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C5AF229FF21FF8786BD3CDF9E0BD504 /* Platform.Linux.swift */; };\n\t\t4546CA3500EDD39DBE8AD016CD79BDFC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F10EACF1B2D7C5A4C670634756973B3 /* Foundation.framework */; };\n\t\t4639BFED317F19A1BA465B22250228A1 /* Materialize.swift in Sources */ = {isa = PBXBuildFile; fileRef = E417881CF3E530ABBE356AD806F81649 /* Materialize.swift */; };\n\t\t476CAF0EE5F9011302EF906E33A10687 /* RxTableViewSectionedReloadDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA64CC4D23BCB33D713381874C6A93C9 /* RxTableViewSectionedReloadDataSource.swift */; };\n\t\t47C3E46E339F974D2B413D2F96BD02B7 /* Differentiator.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A7F044D3460E87057EB82CCDD5C4D545 /* Differentiator.framework */; };\n\t\t47CA831BE2229583488AE4A12E320BCD /* PriorityQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30D68DEE1421B7ED892C4E0B33E9CC35 /* PriorityQueue.swift */; };\n\t\t481AB919527D0B7F4C6DBC8F84DBCDE0 /* TYPagerController-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0C35EACA9CABA73CF6D660DB55A64A /* TYPagerController-dummy.m */; };\n\t\t48700A675D816D1D4D07E26087D0A5C8 /* UITableView+RxReusableKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B3743F6F50232B4A27328B734F963F8 /* UITableView+RxReusableKit.swift */; };\n\t\t4882783C5576C5D43CE79C03DE33C3DD /* IQKeyboardManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 507ED73099FD654BE7A82BBDAADE2C57 /* IQKeyboardManager.swift */; };\n\t\t4891FF4C052E475B1712F1251F9E3D9D /* ScheduledDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF04BEEB09DE1352D9F767144EF0FD50 /* ScheduledDisposable.swift */; };\n\t\t48EC78A50C61424D4DFDC33A325CAA72 /* ThreadHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D8A0052E8AA49DDD883B85DEA3F90EF /* ThreadHelper.swift */; };\n\t\t49FC00F712C285D51C1C0708521BB01C /* Skip.swift in Sources */ = {isa = PBXBuildFile; fileRef = E018F18F377B9190734B1D9EB8160AD7 /* Skip.swift */; };\n\t\t4A54582B320910433D1A82740A41FAF1 /* MultiTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDA8654A5097FB77F91981EC742DE882 /* MultiTarget.swift */; };\n\t\t4A79D8BBA62B2581089376DCF16AFD95 /* Then.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97927D56FAC9E735B7340A75B06C0600 /* Then.swift */; };\n\t\t4AD94A043ECE1C2D0B98F467E75D40C2 /* RxTableViewSectionedAnimatedDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1599175E64562E7F65DC8ECDF4F4E69D /* RxTableViewSectionedAnimatedDataSource.swift */; };\n\t\t4AFA156443C8EF0EDABD03E6626DAB5F /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20D269397D68987A4E3F571B01394F0E /* Filter.swift */; };\n\t\t4CE7FCD6E10E191F7811CFB81CFDAF6C /* Repeat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D6D95EA842EF7D1BFA6D8191AAE620B /* Repeat.swift */; };\n\t\t4CECE91A2400A1389FB240DA09F92D44 /* First.swift in Sources */ = {isa = PBXBuildFile; fileRef = E415D1E19F77D7279C5F140411D69E67 /* First.swift */; };\n\t\t4CF6C6317C8C75CCE3E05761E0A923AC /* TransformGestureRecognizers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B157B779C8184526F0932ECBA9879A9 /* TransformGestureRecognizers.swift */; };\n\t\t4EA164050B9B1B1344A8984EC924D34E /* Disposables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49461972A7736ED5C10EA776E946211B /* Disposables.swift */; };\n\t\t4F03F93732A1DB9A6C1AD8ED0384DD90 /* _RXObjCRuntime.m in Sources */ = {isa = PBXBuildFile; fileRef = 96BF47DDEF17AC72F8EBF9CF0EA9DC04 /* _RXObjCRuntime.m */; };\n\t\t4F486A2A1239E02C62E27B6DB5EBF025 /* ConstraintMaker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 424B56D99302A846FFD60288ED3225A3 /* ConstraintMaker.swift */; };\n\t\t507559646F241781DF5F959957D54C98 /* ConstraintDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A6B64332C20EFFA0F9444871E3166E2 /* ConstraintDSL.swift */; };\n\t\t512C561051AAF62FEAF39708C9E8273C /* ObservableConvertibleType+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E365162D0EA4A1CE302074F5079D99D /* ObservableConvertibleType+Driver.swift */; };\n\t\t51390FB969CB66F4D75C47503E00A1D2 /* Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9CFFF8A56873944159E6B04DBAD45BD /* Deprecated.swift */; };\n\t\t5160BA1430D2179A43B3A0B558F23E1F /* Never.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F5E590482B741DD275B9A87B7EAF4DA /* Never.swift */; };\n\t\t51B625C8BDBF7B247899FF64794370B8 /* Changeset.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0764078D276516AEF879D67E95D225E /* Changeset.swift */; };\n\t\t51D96676F916DC1EB1EEA5F91481E01C /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E5F9481F27654B03C1A5A056D8909FB /* UIKit.framework */; };\n\t\t52416A6AC7387ECACCC45596498D96AD /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C719E3ABA8B6DE4B326AD2FF6313BA2 /* CFNetwork.framework */; };\n\t\t5288D9F32C3135D4FEF0A9601C153E7F /* PrimitiveSequence+Zip+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = B09E2CE4824B4A44FE923169E5B3934C /* PrimitiveSequence+Zip+arity.swift */; };\n\t\t52D0B3F0EA5BCADED39162E5560909F9 /* ConcurrentMainScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BCF16201BDE699E2122416B0D2FBD6E /* ConcurrentMainScheduler.swift */; };\n\t\t5373AA3C95048D89FB975795EA34E8C7 /* ControlProperty+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEC01AC2D958140E2A090D7B632F5567 /* ControlProperty+Driver.swift */; };\n\t\t538546EBA321B92342C272F36B39C23B /* UILayoutSupport+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01A8496A2160E940A6246AB063ADFA02 /* UILayoutSupport+Extensions.swift */; };\n\t\t5387216E723A3C68E851CA15573CDD71 /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8D62DD162002F9C56F1C29692DB9FB4 /* Request.swift */; };\n\t\t54B5B7D9E6EFC9C2C7B051BF214B9069 /* ConstraintPriority.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1CF8E77098D7789AB0555F960E5B430 /* ConstraintPriority.swift */; };\n\t\t551FB4DF0E5072BB849BB4FCE74F7361 /* HexColorTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 530479F817D071873ED5DC57B4372350 /* HexColorTransform.swift */; };\n\t\t5539A3CD2B653BA23D68AED9ADEA40C5 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1A112A635DA48EF8CB77AF4F3AE614D /* Alamofire.framework */; };\n\t\t555AABD226E4FCBD91442DE5AED8483A /* Moya-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 737DA5252745C9E3883929C8A145E22E /* Moya-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t55F024586B17FD47A9D6CACB88B6BED3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F10EACF1B2D7C5A4C670634756973B3 /* Foundation.framework */; };\n\t\t5759B5BC5FA1E2C7B5FF69B511DF68DA /* SharedSequence+Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20DFDFC714EBFF20FC56B6534173B322 /* SharedSequence+Operators.swift */; };\n\t\t579D9C74D7293D142E36B5DB1CF0E320 /* SubjectType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089E5120665D4B93D03D218D3D11C2F1 /* SubjectType.swift */; };\n\t\t58523F5544BDE0B82DC6E63014A5638F /* TYPagerController.h in Headers */ = {isa = PBXBuildFile; fileRef = C0155AA3020891E25233E5B541EF2063 /* TYPagerController.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t58E6E68D10EF3D64522BD267CC1761A6 /* NSBundle+MJRefresh.h in Headers */ = {isa = PBXBuildFile; fileRef = EA3EFB292391C42C14DBF00E49C533EC /* NSBundle+MJRefresh.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t59109302859941E04E87DC7044DFEE89 /* ObjectMapper-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BC52351249DB2B467541996968B175A0 /* ObjectMapper-dummy.m */; };\n\t\t59AA965004671689A9B41955CB6BA511 /* DefaultIfEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA67E4E3F08A96BF5B2596ED0FC34196 /* DefaultIfEmpty.swift */; };\n\t\t59B16488BD43F14B60CFEAA70A67150B /* Platform.Darwin.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBD70508C00E38F1FE63CED0383CAFE6 /* Platform.Darwin.swift */; };\n\t\t59BC49B15C7B4BD0AA38436D3567F9BD /* UITabBarItem+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE4D4A9C4DD3E20DEF7AD0D414C67442 /* UITabBarItem+Rx.swift */; };\n\t\t5AC44C9876A3D343C63CDE76A4139036 /* ObservableConvertibleType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63F72D0F593F82201EA482E15012B694 /* ObservableConvertibleType.swift */; };\n\t\t5AE90602C51230C8DA03B35061E42AA4 /* Enumerated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0785C89934FE4C79E378F80B3EAA947F /* Enumerated.swift */; };\n\t\t5B5D8AE167BD8E304CE474A9B8DBA2B4 /* Kingfisher.h in Headers */ = {isa = PBXBuildFile; fileRef = 6100112F9C1D863256E650CDE2B078D9 /* Kingfisher.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t5B72B69DD603A056FE26772F3CFD56E8 /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 266FFDCA364C275317DA17C75FA9B1B3 /* Result.framework */; };\n\t\t5BAEAF4DF2226C38891357D17E315D91 /* NSObject+Rx-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B8020BB1D97D4EA3246C9476D7044FE7 /* NSObject+Rx-dummy.m */; };\n\t\t5BB8EA4A2E5BEAB53FD3C34496F3CEDB /* AnyEncodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66B23F5CD12DC047D454DFB36DAF64B7 /* AnyEncodable.swift */; };\n\t\t5C11C8A05966C040DCDE2E2B1B0C8D7A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F10EACF1B2D7C5A4C670634756973B3 /* Foundation.framework */; };\n\t\t5C5A43AECB27D48D5C446D3DD12DC1AD /* BehaviorRelay+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86FCD05DCA4B5988057772E478AA3B7C /* BehaviorRelay+Driver.swift */; };\n\t\t5C6EBB68141BE6FE8A58CDAA7456BB67 /* UITextView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6367B989A05CB68EFF4B1822D8DB33E /* UITextView+Rx.swift */; };\n\t\t5D035B296631F978D172D0AE1EDF319D /* TakeLast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 553ED5CCD42E1F512E1D9E9466E47D44 /* TakeLast.swift */; };\n\t\t5D448725D385F6D5B24C43CC9448F8E5 /* TYPagerViewLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = C5B39EAE40FAC88E85E0EDD5108794F0 /* TYPagerViewLayout.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t5D83206A9A4656F11D511158EC8E0784 /* CacheSerializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76C763EC2CA9D13E7E93A029686393D1 /* CacheSerializer.swift */; };\n\t\t5D97452371AFE3FBC01EF1B84633C34B /* OperationQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70876246376D5A1D2C4ADF75F307186A /* OperationQueueScheduler.swift */; };\n\t\t5E30EEC06CCBCF67205D284B1FC7496F /* SchedulerServices+Emulation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A098FD7778F9B758BBC03971A34449C /* SchedulerServices+Emulation.swift */; };\n\t\t5F59C423FBE9B7D79A9CDB48BCE24B3E /* ObservableType+PrimitiveSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C40C05B2CC135DAAF345CD1E46FE065 /* ObservableType+PrimitiveSequence.swift */; };\n\t\t608A03F75F4AC580AF9EBFD756AB8DC5 /* Window.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A9BB47909385E153DEAF4820584660C /* Window.swift */; };\n\t\t608E9ABBC7B02657C21A181EC25DED65 /* SharedSequence+Operators+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = B840B6E9063F05A5F844D55042BC104D /* SharedSequence+Operators+arity.swift */; };\n\t\t609E700D79249C49A9EF7D6F72440F34 /* Diff.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47C651CFF068171CF1C1237A69E7D99A /* Diff.swift */; };\n\t\t60F43A8950189140E8E60155EA3F403F /* ScheduledItemType.swift in Sources */ = {isa = PBXBuildFile; fileRef = B32CA5B611266CA013631C5E362ACECE /* ScheduledItemType.swift */; };\n\t\t61200D01A1855D7920CEF835C8BE00B0 /* DispatchQueue+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74515FDED92421AF135AF3C0B8B08A1B /* DispatchQueue+Alamofire.swift */; };\n\t\t6129D5C1F81A4991CEFA556838395C58 /* Reactive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DF0A09A6DD2C0453F866A408223B631 /* Reactive.swift */; };\n\t\t621B413DAEFE75991251ED378822527C /* MJRefresh-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D52211FFC97D4BB7CF97DA504F823D77 /* MJRefresh-dummy.m */; };\n\t\t6298B1C2234864DA5ED3B5E6398B95AC /* MJRefresh.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 0A7149E89BECF86F1AE3C3567AB16589 /* MJRefresh.bundle */; };\n\t\t62F65AD8DC4F0F9610F4B8B4738EC094 /* ServerTrustPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83B89463432FAA55975050E17F0E6B42 /* ServerTrustPolicy.swift */; };\n\t\t6303CB98027B59C02EA4EFB216E7069B /* PublishSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1DC026D0D8F36437F6F9662A1805D0E /* PublishSubject.swift */; };\n\t\t63C400B1C64EC85BCE1ADB5C1C869B95 /* Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C1A7F6D1EC5B670FE3CF2E00D21C2D6 /* Driver.swift */; };\n\t\t641E1DF7AF5B9C72AAE1242C38A3F684 /* Logging.swift in Sources */ = {isa = PBXBuildFile; fileRef = E03BFCA5D027189D74E5502CC0D58735 /* Logging.swift */; };\n\t\t643F0A0AEF6B1040E1243E8F065F0268 /* Driver+Subscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC294161F7CCD1280208FEC5EE254218 /* Driver+Subscription.swift */; };\n\t\t647C9A69799E80C9EFB477D0ED6D2406 /* FloatingPointType+IdentifiableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FF3BD6C6FED1A57B6B88C3F0EFEB6A3 /* FloatingPointType+IdentifiableType.swift */; };\n\t\t64FFC1F647245F61C405AE7AC1DA9D31 /* IQUIWindow+Hierarchy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D94ED6DD481751BB6F57C5B6C60049A /* IQUIWindow+Hierarchy.swift */; };\n\t\t6508C244210F686EA369416EA9FA88E9 /* CompositeDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C10FF295CB8B9A0152FA38DF372846A4 /* CompositeDisposable.swift */; };\n\t\t65CDABE73636295123CD8259D16ACFC1 /* ConstraintInsetTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 610AEB49CFD63698A27742F484C3B01B /* ConstraintInsetTarget.swift */; };\n\t\t66407236B5F3BF75ECBAE79FB585EC78 /* ConstraintLayoutSupportDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 705EED60B52573B696D1FD8B6CB52FC2 /* ConstraintLayoutSupportDSL.swift */; };\n\t\t671B54E4AAC34ADFF8D1C372330E98FB /* ConstraintPriorityTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B37D88DF834AFA3231D9F6EF76598D8 /* ConstraintPriorityTarget.swift */; };\n\t\t674EB63D9FF75C7AB07BA9DA46D8AE09 /* RxDataSources-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E031F5913ADD2E4B2FE376BDDB99068C /* RxDataSources-dummy.m */; };\n\t\t677CCFAA3FB253A30288AF00D9C792AF /* UINavigationController+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = D94169655CF6B1F44A9F5A11128DFBB5 /* UINavigationController+Rx.swift */; };\n\t\t67A4D8A24085ADC44A65404E73461B43 /* Mappable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C08FCDD6B32CEDDEA0C67B874CFF29A /* Mappable.swift */; };\n\t\t67C42ADBD42CE7F614E2893EDA641519 /* DelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = BACE4EA986227C4D5F468E9FC4DB57BC /* DelegateProxy.swift */; };\n\t\t69D61F970DB381B6094C0E8085CB1E00 /* TYPageControl.m in Sources */ = {isa = PBXBuildFile; fileRef = E99B4913C9AF498445CF9BB785FFBFFF /* TYPageControl.m */; };\n\t\t6A0B1A0FA7A75C861B9D401D0E8CC95E /* MJRefreshGifHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D8CA91B2544EA3008663944FBDDBB5F /* MJRefreshGifHeader.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t6AE889190D5DE14192E8E0D26E0EA3B9 /* RxTableViewDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 013A0244BEC843116DF0F443778476C9 /* RxTableViewDelegateProxy.swift */; };\n\t\t6B1D5FA190C5943AC83CBDA241C07E27 /* Zip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F954956863F74706AA3A395F8401F14 /* Zip.swift */; };\n\t\t6BAE5A1DC9D8A6DED87FF11DEA68C04D /* Cancellable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70459A28397D1E419B4B3394FA8435F3 /* Cancellable.swift */; };\n\t\t6C2FE27FDBD6621AAB57E4082419C347 /* NSDecimalNumberTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3AFC24D86F7304F0B4AF511C9B9970A /* NSDecimalNumberTransform.swift */; };\n\t\t6C37C3E9F334B181ADEA8BDBF35751B5 /* ControlProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 889059818A6183D31A0BDC7C6B981849 /* ControlProperty.swift */; };\n\t\t6CC98E6987E27D6CCDDFAE2F012A013C /* UICollectionView+ReusableKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC1DC57990281D4F45BE128AADCE4143 /* UICollectionView+ReusableKit.swift */; };\n\t\t6D5E66010A47E24AC918B48051FA9B3B /* Lock.swift in Sources */ = {isa = PBXBuildFile; fileRef = F364B3A757735A453DB16E22F1A2D52A /* Lock.swift */; };\n\t\t6DB8DA4031D9691E8E809A385F4A5846 /* ReactorKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6EADA7DDE939B839BF4574A8A38504C9 /* ReactorKit-dummy.m */; };\n\t\t6E116732E3E785C9F5D69045E6371E71 /* RecursiveLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAAE74B8E84AC1A31796559B46480858 /* RecursiveLock.swift */; };\n\t\t6E67DFDCD807369FC97F5F093ADCEB94 /* Differentiator-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E7C918776C8129D7372B1095C6E2BBD /* Differentiator-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t6E953E2A94F99E02F79C4B98004E5396 /* Bag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0580BE8F6F974685A933A89D8A972BDA /* Bag.swift */; };\n\t\t6F5E2DD4FF386EBB8EB55967964C5BE3 /* NSObject+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A8F833CA4526A1FF65CC394962AD92E /* NSObject+Rx.swift */; };\n\t\t6FA0019746BB30AF58E427FD0CBCEE3C /* SectionModelType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2056BF365D2D7CC0FD46ED19EDBEE823 /* SectionModelType.swift */; };\n\t\t706840688BA7E9BDE5F4DD2C0E558835 /* EnumOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = E441DE19DC813E660F49CCA5AF0FA3F5 /* EnumOperators.swift */; };\n\t\t70F84C166016A96F0493CAE9BAA238F2 /* BinaryDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B10806D65630D3922CC4632E4B961170 /* BinaryDisposable.swift */; };\n\t\t71BA33FC95D59E6C0FA6DEEF747351B7 /* CollectionViewSectionedDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85B5D2C3BA32F9BC3AA7C975B97F6A50 /* CollectionViewSectionedDataSource.swift */; };\n\t\t71DD71770F915F1621F0155CFD6CCEDD /* ResultProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A8E64555EB2FE7D579467AABA52EB26 /* ResultProtocol.swift */; };\n\t\t71F6D96E3AEAA07389F37E2C4B63C4F6 /* MJRefreshHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 91BE41B89A55956B97FA90BA78DA1A4C /* MJRefreshHeader.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t72AFC537FCBE9326BB279F237C9043F6 /* TailRecursiveSink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 701196C1B8D5354D685D7DD627877FEA /* TailRecursiveSink.swift */; };\n\t\t72F8287CD5471AE0376C28EC9AD903CA /* ObserveOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F34BA700CC37058B6A053DD142E65DB /* ObserveOn.swift */; };\n\t\t7335E13169D3E91E60ABF132EE768E99 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE28FDBE90B525AD5F5FF81C344D3D2A /* RxSwift.framework */; };\n\t\t73B9C996AED49ED7CF8EC2A6F1738059 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F10EACF1B2D7C5A4C670634756973B3 /* Foundation.framework */; };\n\t\t74EBBCE7876A5AE3C73D7386EB85D4A4 /* Single.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63C44514B1EC24A99AC7728B3503A038 /* Single.swift */; };\n\t\t75BD25BF1A16B849D520933C732BEE8D /* NSLayoutConstraint+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2B78D4FFAD19F5D58FA9B42B6E4F2FE /* NSLayoutConstraint+Rx.swift */; };\n\t\t75D28DC57BA76546CEDC5EFA5453E974 /* StartWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 861BD4AC5D5011049786E6352C62DC93 /* StartWith.swift */; };\n\t\t76407DBA37432054658558614EF3C6D5 /* InfiniteSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1530F4900EF841B8D75AB4AFA41076FB /* InfiniteSequence.swift */; };\n\t\t770E2F9E0A86F1290A34AD9C5FBA2128 /* SerialDispatchQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A81EC5AF3F05041AE6EB4193B2BFEE3 /* SerialDispatchQueueScheduler.swift */; };\n\t\t7718718BA955BC1ADF13A14CF2FAEC0D /* AnimatableSectionModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7F1EA6B598A844B871DB54C2C1C197D /* AnimatableSectionModel.swift */; };\n\t\t77CA4CD47748C0B69982A6D82C2799D5 /* Mapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 541CB7596A9F5575EA8684328858A044 /* Mapper.swift */; };\n\t\t78393A7387E5886A01E30F08172D3963 /* ReusableKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 188117C123963623C4A723C6D908FDF6 /* ReusableKit.swift */; };\n\t\t788910D5C544192C236243BF21CD1E78 /* RxPickerViewAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FE766E158FAC90198034E79F61FB2CE /* RxPickerViewAdapter.swift */; };\n\t\t78C198E9BB56FB59BD494C8FA759645B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F10EACF1B2D7C5A4C670634756973B3 /* Foundation.framework */; };\n\t\t7942D242D079A5710A72B659A54D7E26 /* MJRefreshNormalHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 55C6E2980720E2A6CC91BB366BC6C7B2 /* MJRefreshNormalHeader.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t795ED1A351690C7143540C8CB7AA6CD0 /* Result-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D4A33E97EE17B95FCE36DEBE7ACE03F3 /* Result-dummy.m */; };\n\t\t79B3581182D487C5DBEF24D7E8B263BE /* URLRequest+Encoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = D85A799653D3BC7BA7BDB6BD691336F8 /* URLRequest+Encoding.swift */; };\n\t\t79F5CE53E58BED49036519F4E1197395 /* ConstraintLayoutSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20C215CD03F9EC325B96AD2A4621096 /* ConstraintLayoutSupport.swift */; };\n\t\t7A82F7317FDDA0BD35C5E1BD4BE42249 /* Binder.swift in Sources */ = {isa = PBXBuildFile; fileRef = C84F456A91C16DC64488D342C8BC5929 /* Binder.swift */; };\n\t\t7B0FACE97300F45175045FD090F70CE2 /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = 298536EB0ACF540DC4DC34F019837D74 /* Image.swift */; };\n\t\t7B50A3CE4086B03F60DCAFD8090DF164 /* SchedulerType+SharedSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DCA82E849FDD3356D44EC7B8EE2BA84 /* SchedulerType+SharedSequence.swift */; };\n\t\t7B5FE28C7EA4122B0598738E54DBEBD8 /* SessionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80DD88365EFE5E0A8E363300ADCE2DCC /* SessionDelegate.swift */; };\n\t\t7C1AFD71632F9548563C3B224B6BFAF1 /* UITabBar+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9707233113E3D0E414A32F652E88D1D8 /* UITabBar+Rx.swift */; };\n\t\t7C8AABC35DC356D57A0766A331DAC4DF /* RxSwift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 387296DC1983BFD653D558D678637B29 /* RxSwift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7C98D625AAB36D8F2A92D5FAF28FCCF1 /* RxWebViewDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90D0F930F0AE0A2471269302003B8A5F /* RxWebViewDelegateProxy.swift */; };\n\t\t7CD0D1E5ED33F75E019C7D85E040FED2 /* ControlEvent+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAA5BE3862DD3A00CBB848A024A5E863 /* ControlEvent+Driver.swift */; };\n\t\t7D8CC01E8C9EFFF9F4D65406CDE0AB66 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 812C7F916BBBCD2970C245989B39CD1B /* Result.swift */; };\n\t\t7DF2FFD108A489BAE76957B27C0815F2 /* SectionedViewDataSourceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41DF1FD6C9D2BDC29A48989F838D1ECD /* SectionedViewDataSourceType.swift */; };\n\t\t7EFDAA1642FA83DE777CFD086182D5A4 /* MJRefreshAutoGifFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = EC5873F3553D2C072C19D661AA844D1C /* MJRefreshAutoGifFooter.m */; };\n\t\t7F47526A3CC008FF7F1D3232D3435559 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE28FDBE90B525AD5F5FF81C344D3D2A /* RxSwift.framework */; };\n\t\t7F61C5C04977D2A2FF71DF6FEC861A94 /* RxCollectionViewDataSourceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9C2D5FD4A6E72AF207648A0646DCCF /* RxCollectionViewDataSourceType.swift */; };\n\t\t7FEE8F5AEE7AF4879B8911612CF82CCC /* ObserverType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 834769F9B06E2DF4306C35CB6F967BAE /* ObserverType.swift */; };\n\t\t8014530DA6E561B4CA4905F2F68FF87C /* RxTableViewDataSourceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 081D3C3389E6943F023464C1787FDC23 /* RxTableViewDataSourceType.swift */; };\n\t\t8069223DDD6D0F2E1A87D8E66966709B /* MJRefreshConst.m in Sources */ = {isa = PBXBuildFile; fileRef = 75AD8F0F482E2F585B2664D1635B4706 /* MJRefreshConst.m */; };\n\t\t80B0A06B1530CD62C0E818A58D30BCF8 /* UILabel+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE31A7BD0FFA90C66DA1DEBAD573E053 /* UILabel+Rx.swift */; };\n\t\t8151252BABBE1D0CF4828711B003BCE6 /* UIWebView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE7697FE2AC8BF4148D6676FBC1B5A23 /* UIWebView+Rx.swift */; };\n\t\t81A2F975614A9B94F265CD3BA816B0A4 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7481193578343285EC8F430B736D1314 /* QuartzCore.framework */; };\n\t\t82443926248B0468C2318B68ABB2FE14 /* TYCyclePagerTransformLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = C47049CF48166B10EF910F23995AEC84 /* TYCyclePagerTransformLayout.m */; };\n\t\t8253C04716B2C6BE88755512C4BB2D27 /* Differentiator-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C0DB238A8FB8D79A81E67CBB38ECF524 /* Differentiator-dummy.m */; };\n\t\t839A55AD3279D154DC55C93BE714B93E /* AccessTokenPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEA052CCABE96871EBBAFD7D6C959A06 /* AccessTokenPlugin.swift */; };\n\t\t84F11AFCD46554A1844889EBF7B915A5 /* Observable+Bind.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA67591D1C61133E2F626EA1C2E097FE /* Observable+Bind.swift */; };\n\t\t866952184CCB9236E8D567A97A7C3224 /* IQUIViewController+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88CB6A2CAB2E3799803CD1C118F1F107 /* IQUIViewController+Additions.swift */; };\n\t\t866B48826FBBC43E96593CF27485FFC1 /* ConstraintLayoutGuide+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46E1355C3CBDC013D697081398F8B462 /* ConstraintLayoutGuide+Extensions.swift */; };\n\t\t86C74540C24DEB52302C80CA759169C8 /* Using.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BCDD91A5C3CBCA65A1E0746F0ABC174 /* Using.swift */; };\n\t\t873BA68C2E24D634D38E4A8BCB74B08D /* Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC6B9B2770629FBEE8FF3829E91ACE5A /* Kingfisher.swift */; };\n\t\t8757DAF954F1D3C28C865BCFE62341D1 /* AnyObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06DCA6A0B6616240EC75F089FCB605D /* AnyObserver.swift */; };\n\t\t87AD9D97F0F94C85720FC018235CD8A9 /* IQKeyboardManagerSwift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 973B74E176AD01454BE984AC4A7136A0 /* IQKeyboardManagerSwift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t87B96B16646AD96D837414B29D2E20C7 /* TYTabPagerBarCell.h in Headers */ = {isa = PBXBuildFile; fileRef = D609A4B215C782073049E462F652D85D /* TYTabPagerBarCell.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t88A25F661A4435D57041D21700515CC6 /* IQTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87874701D9E81D433E42E8AAABDFFD7A /* IQTextView.swift */; };\n\t\t891A61A41441BA89E0055C960A4664ED /* UI+SectionedViewType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53647AFE918247CC408B6EF13349D614 /* UI+SectionedViewType.swift */; };\n\t\t89DB813358F7013E9E1AAA822417FE86 /* RxCocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 77AB7A6BBF44C678FD2D852835009017 /* RxCocoa.framework */; };\n\t\t8A1AF61FB826C9D132ABFC0195471179 /* RecursiveScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 383DA86E343CBA75A7B8574AB75E1A1B /* RecursiveScheduler.swift */; };\n\t\t8A25F0A06E679359184DD5C9BE408190 /* VirtualTimeScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99692BFA25CF2437019950A2EFAE0291 /* VirtualTimeScheduler.swift */; };\n\t\t8B5BA7E0D60BA533FA43EF493F4D5D83 /* NavigatorDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A4923E32C7795B1406F85C0D769B8F1 /* NavigatorDelegate.swift */; };\n\t\t8B6ADD6C31B20E3FC60C00F494B59112 /* ReplaySubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9B85640D4BCBBFE6662A71B6EE98AE9 /* ReplaySubject.swift */; };\n\t\t8B855A73B75155FB2C0CB05B54FDDE0D /* UIScrollView+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BF627D8C19D8504043EEDE55963F4BA /* UIScrollView+MJRefresh.m */; };\n\t\t8BB9815D2C57EA5200DCE170988860DB /* ObservableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EEF0C4EECF8525D00D4B8CF83ED7D3E /* ObservableType.swift */; };\n\t\t8BF6B3A9B39B75AA591626B7B26175DE /* ConstraintLayoutGuide.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4086B02C434EDF398B3DEAC9194E36E9 /* ConstraintLayoutGuide.swift */; };\n\t\t8C8833BAF8EEDBF0491FC6CFEAF001E0 /* Typealiases.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EE2A49804E43DA5A796136D1D79109F /* Typealiases.swift */; };\n\t\t8CD28DDD291AB1B9D0F6DE817CE995FE /* UIGestureRecognizer+RxGesture.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5C87EF44982A4D3803D88EB9983E52D /* UIGestureRecognizer+RxGesture.swift */; };\n\t\t8D0EC20E5A152C52E877A0FD42A1D612 /* RxSearchControllerDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABBD78A9569D4426E15EAE838A7F4562 /* RxSearchControllerDelegateProxy.swift */; };\n\t\t8D5D644E475E21E418B2FBCC9423A471 /* RxDataSources-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B9B6B63EED3B0A8A6802499D6992A2CE /* RxDataSources-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t8D6FC3FD5C6F9AB903E885369D8C437F /* ConstraintConstantTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D28FC1E29A3FEC5D1CF82FC68A09E26 /* ConstraintConstantTarget.swift */; };\n\t\t8D70BCBAC4C9EBC91472AB223B7485AE /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE28FDBE90B525AD5F5FF81C344D3D2A /* RxSwift.framework */; };\n\t\t8D7D42C25F9430F572E14200C399D57B /* ImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC6A0E89EEA59CA5659D2EED0C773FD1 /* ImageCache.swift */; };\n\t\t8DC3FC2342EC2E944B3A3E83E2683130 /* MJRefreshHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 203840BDEB077FAE0820685734949691 /* MJRefreshHeader.m */; };\n\t\t8DE01434EBF2D9040CF7BA7CBE33DD6C /* UIViewController+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 536B3E455CFA43C1E70A9AD9ACF3CD69 /* UIViewController+Rx.swift */; };\n\t\t8E3D1F07AFD7234A412DAAD8E22A9A09 /* VirtualTimeConverterType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66AD8E23D6C4A5FFCFE4C066E700B676 /* VirtualTimeConverterType.swift */; };\n\t\t8E6BFD0EC4206F98140D4CA51D60D517 /* RxNavigationControllerDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4602CBFEB0FDD72D7A2FF806152CFC81 /* RxNavigationControllerDelegateProxy.swift */; };\n\t\t8EA1993902CC8DE0A3E5F00E00976C4D /* UIDatePicker+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = F28EC587F2484F4548370BCE6AA22C0C /* UIDatePicker+Rx.swift */; };\n\t\t8EAB5DCA47437AE6A858FC683FBA23C6 /* Concat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26530B988040DFAD1200285B6F15D492 /* Concat.swift */; };\n\t\t8EC3A1FE52FACEFF6171B96607440D7C /* UISwipeGestureRecognizer+RxGesture.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59330F519A185D61B0CDC18A2BC8BEF7 /* UISwipeGestureRecognizer+RxGesture.swift */; };\n\t\t8F3F3F3792930B9DEDA544AAEA07A60A /* WithLatestFrom.swift in Sources */ = {isa = PBXBuildFile; fileRef = B00B2D1E5594681E1384A988B35D66F6 /* WithLatestFrom.swift */; };\n\t\t8FB1637E28C8213F6A57DFBFC5390CAC /* URLSession+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8FDDBEBD3900E6B6B3DE7D9D96C0CFA /* URLSession+Rx.swift */; };\n\t\t8FBA14759D5686E201066D8DD81D2794 /* RxAlamofire-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 34903204D85860DD93734C3981A9900D /* RxAlamofire-dummy.m */; };\n\t\t902C28D80B247A6737276BF247BE1D1A /* UITabBarController+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25A0BA6CC0B9439AAC6261DC60D7AE1C /* UITabBarController+Rx.swift */; };\n\t\t91C5F7C7350D7C7BAF11F0FFB2152C0C /* _RXKVOObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = E800F1732A0D7B4A6640BE266F14DDC8 /* _RXKVOObserver.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t93A094FED3649B43022FAD6174FBF11F /* RxTextStorageDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE2E4D442D52B0894ED51620B7A11E8B /* RxTextStorageDelegateProxy.swift */; };\n\t\t93D444FC9D79520E14FB8EF178F0B76E /* ImageProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB17D569CE831A4F4E00E2FC816EBBC9 /* ImageProcessor.swift */; };\n\t\t948045455233BAFB85BDF5F033DA8686 /* Take.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F80E196EA77F97C6AA8A3D2410BFE76 /* Take.swift */; };\n\t\t94E7616A9A6BBA3C0C59BE9F694AD549 /* UIControl+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E01EF7A9628B4C49AC12163B4FE6A91 /* UIControl+Rx.swift */; };\n\t\t9505BB9F7E1749994974BBD6D0A17CC8 /* NSObject+Rx+RawRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3F7DB8C08BAE7F26A0EE85DA33C3905 /* NSObject+Rx+RawRepresentable.swift */; };\n\t\t950D8E334E011B13CC5786595E6AE615 /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52D36179922B35EB5035CA039865F6B7 /* Image.swift */; };\n\t\t955203B31E419BFF9E9DC5EC02787D6B /* URLMatchResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49DA791DE895721812C9EB83583324F0 /* URLMatchResult.swift */; };\n\t\t95C52B5A296DEDDA23804E0EB3441E98 /* CombineLatest+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 280D08DD70717640589F62EB1F6FD19B /* CombineLatest+arity.swift */; };\n\t\t95DC0825394C10B2BCA74208761E16E6 /* ConstraintInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCA359E28EBA408A36C0296FA25A6731 /* ConstraintInsets.swift */; };\n\t\t96599CA3482E11E508F3607F678A4075 /* BehaviorSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B6B580BF9608405256B589F993BA72 /* BehaviorSubject.swift */; };\n\t\t96E58EA8ACCB671460FB4D4A98113D92 /* ObserverBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1003DE1B3A476A1579EADFC5DEE4DC09 /* ObserverBase.swift */; };\n\t\t96EED7813D6F11E4A799B9B76F391500 /* RxCollectionViewSectionedAnimatedDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F86ADA13F9525995BA4102D3E1950B2 /* RxCollectionViewSectionedAnimatedDataSource.swift */; };\n\t\t9732F130B48FC5DDA707612D58A7BEC9 /* NopDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20CECB0BD149F46C10733B4F2D2D92DC /* NopDisposable.swift */; };\n\t\t97D88C924A7F6C1481FAECCC3E5E56E0 /* UITableView+ReusableKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EAD58DE19CDA807C841C29CE9804B80 /* UITableView+ReusableKit.swift */; };\n\t\t988CE455361E53CE47125E2E64F7279C /* HistoricalScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47F3ADD7515A562BFBBBB8888ADA3090 /* HistoricalScheduler.swift */; };\n\t\t98F5BB1FF23CDD9DDAE74AE7DF766672 /* UIViewControllerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2988A2FCCBF291E4BEAC7F8D9AD45A9F /* UIViewControllerType.swift */; };\n\t\t9980108FD8F8C2F7FF71BD9DCAEAD6DF /* ConstraintMakerRelatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FA2A35E8B50492B40B48AC0A94A8904 /* ConstraintMakerRelatable.swift */; };\n\t\t9983C08AB4621CB25D31ED64E3005A86 /* Signal.swift in Sources */ = {isa = PBXBuildFile; fileRef = F570C010C51F2EDFA2B29E61A28988D2 /* Signal.swift */; };\n\t\t99B8666F8DEEAA2D94AF8F74CE63387B /* RxCocoa-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 58D1D78FFF97A04C18826C9383B3DFBD /* RxCocoa-dummy.m */; };\n\t\t99EE517D408612C2DD0FF21866BEAA63 /* NSObject+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BEAA51E3D065BAC60F1B85CBB1F26D5 /* NSObject+Rx.swift */; };\n\t\t9A726AE6822AF4B3AE67808BFB9845F9 /* DisposeBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0758B65380EFC2497BC08F9A7E4F402 /* DisposeBase.swift */; };\n\t\t9A8BECF84F3F50D260FB7132B311E932 /* ConstraintMakerFinalizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83F0BF62BA5033111F22B49D2DA78D30 /* ConstraintMakerFinalizable.swift */; };\n\t\t9ACC05833323E3CB2FD5DEE095CFBD71 /* AsyncSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 272D79A04BED524CBED07D2B4EC99B49 /* AsyncSubject.swift */; };\n\t\t9ACE31FCFAD5425ADF5B207722E20E8A /* Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B88F0CF34C9C21FA5FACA8A0692AA4A /* Deprecated.swift */; };\n\t\t9B9C1A095D68E3B91BD38F910C6F2E7F /* IQKeyboardManagerConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12F89941B737495BB6B9D65D0A940759 /* IQKeyboardManagerConstants.swift */; };\n\t\t9C178A996A6A0F14CF4B1F1D1BA4B2EB /* IQUIView+IQKeyboardToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E667F49AB3F41A361BA1B406783ABF /* IQUIView+IQKeyboardToolbar.swift */; };\n\t\t9D12124A0A7424D36B46A29F495E4394 /* RxCocoaRuntime.h in Headers */ = {isa = PBXBuildFile; fileRef = 64E69BA43FC5913EAFEEADEA145AFF1F /* RxCocoaRuntime.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t9DE7A712CF1B72EBDF688D729F09EB2E /* RxCocoa-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = AF9EE6B5C17353C6D306E650D41F6A57 /* RxCocoa-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t9E04C84E074D52269B2611658420FD41 /* RxCollectionViewDataSourceProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C13EACC6D3C59A28B692EFB2DB14F6E /* RxCollectionViewDataSourceProxy.swift */; };\n\t\t9ED2BB2981896E0A39EFA365503F58CE /* AFError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7253973D128A903FF19D65F0A9DB9316 /* AFError.swift */; };\n\t\t9EE9EF9B3B2B22A38445D287017EFC0B /* Sink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D305720CFFC3323166DEE86CAF9341B /* Sink.swift */; };\n\t\t9F189CCBEDAF20A2F80F80B6F37CD18C /* TYTabPagerController.h in Headers */ = {isa = PBXBuildFile; fileRef = 88860B4DEDC2F32A5AC3E06DD5F534B0 /* TYTabPagerController.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t9F75265E3A28C06EA75E5FEF00087551 /* TYTabPagerBar.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E49B1A15261BE86B3137451B245C6BE /* TYTabPagerBar.m */; };\n\t\t9FEDD419BBF24CFC1354161636496389 /* ReusableKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = DD7CFB953733E5734A907460B2C40BCE /* ReusableKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tA006A7EEF7652FE9322878C39A36CED3 /* LayoutConstraintItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = B00A5B87228E30280657500960598B59 /* LayoutConstraintItem.swift */; };\n\t\tA03ADFA996990D2DA836E6FFCEE37F36 /* MoyaProvider+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB53371318D8626F8F670FACB15EC0F0 /* MoyaProvider+Internal.swift */; };\n\t\tA128DBCF691E0F4D2AC3EEA36F7BD562 /* ObjectMapper-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0A332DD66083AD9F2BEB500FC7F9B60E /* ObjectMapper-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tA25F717B5E0C4E6A6DE933B0BF0F6417 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F10EACF1B2D7C5A4C670634756973B3 /* Foundation.framework */; };\n\t\tA28F98C3C629B57C326A9FE9A51CE133 /* UILongPressGestureRecognizer+RxGesture.swift in Sources */ = {isa = PBXBuildFile; fileRef = 500A7C34BE698156B2539B1AFD8A1AF3 /* UILongPressGestureRecognizer+RxGesture.swift */; };\n\t\tA2A6F71B727312BD45CC7A4AAD7B0AB7 /* NetworkReachabilityManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC3268ED5E6ABB0ABCDEEE48CE0CD78F /* NetworkReachabilityManager.swift */; };\n\t\tA2D9F9EFFDFE9C19DA842E826B06BCEB /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F10EACF1B2D7C5A4C670634756973B3 /* Foundation.framework */; };\n\t\tA2E8853B9D79DAA9B2512F7AF251C587 /* Amb.swift in Sources */ = {isa = PBXBuildFile; fileRef = 332E6B6D83344EA6F35D0681ADEAD1A7 /* Amb.swift */; };\n\t\tA325A1B4D4D686789B291144FB283D47 /* TYCyclePagerTransformLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 4FC00E6B5EA00A0D7CA1DC61742ABA25 /* TYCyclePagerTransformLayout.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tA32920098427AC9AA08B59797AAB0AA0 /* UIPickerView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = D819115F4043DA9F9126B97A2AAD84BD /* UIPickerView+Rx.swift */; };\n\t\tA345A8C3AD50AA10257D9C7F63F7D5EA /* UICollectionView+RxReusableKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1D09ED075CFA4F5069E951F7B848972 /* UICollectionView+RxReusableKit.swift */; };\n\t\tA36633C20A13B727FE2F135FB3261A24 /* Result-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 57EDA4292816BC724EE611C648E430DA /* Result-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tA46ECAD1FE903ECD9E035F9DB92CCEFE /* URL+Moya.swift in Sources */ = {isa = PBXBuildFile; fileRef = 088517E9B0F7ED44CFEB3E14F7379BF5 /* URL+Moya.swift */; };\n\t\tA4A7E0E7713372CEF2409C4B6E564837 /* MoyaProvider+Defaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1555063617BFE21D0E44B5255EA230FE /* MoyaProvider+Defaults.swift */; };\n\t\tA5382D3EA98D2EB1AD9EDA5F2138F00D /* MJRefreshAutoNormalFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 40B36A7D5D671C2D2DCB124A4EE87A87 /* MJRefreshAutoNormalFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tA580F7392F3E5BD4B04688E9FE75B88F /* Disposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8DAA4F672011BE9BD20D53B1B64E479 /* Disposable.swift */; };\n\t\tA5BFC49ED41BC416BEBF4772517AB741 /* Map.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E49107D99771943128C7B1A58B2781A /* Map.swift */; };\n\t\tA5FF3C7A501FACB556E67C86C1990F7D /* DataSources.swift in Sources */ = {isa = PBXBuildFile; fileRef = 591CADBCCC57E88AE178D78B8606C938 /* DataSources.swift */; };\n\t\tA6883C52C0D62642960508D2E64CB789 /* Bag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59356F06A577C220AEBEDC900F94102A /* Bag.swift */; };\n\t\tA6FD129851497CE8AB256289C1BD6463 /* TTRangeSlider-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A27C7B9B2AA2EBC3F3078495A3B4B248 /* TTRangeSlider-dummy.m */; };\n\t\tA72D242BEF61E27D6C29092DF4666A4A /* MJRefreshComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 91EFB17C939EB1CE9FDE66074D20AA83 /* MJRefreshComponent.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tA788C5E58CFBB81C97345BAA4C6A292B /* Deferred.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D4430407B638D271F51E5D3E920BB51 /* Deferred.swift */; };\n\t\tA7EC09EC6EFAB3778E0A0341E7DC9CE3 /* AnimatedImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20735E206ED10BEE6B25EC79F4DB6BFA /* AnimatedImageView.swift */; };\n\t\tA8FC34B8104C504687DF452D1469CEC5 /* KVORepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5A668A610822A5EACD5784C5EEE3E17 /* KVORepresentable.swift */; };\n\t\tA9CA258A1B6D95AA156B0601E9473EF5 /* TargetType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08D8E58342C1CDB4D227FD9491D0E369 /* TargetType.swift */; };\n\t\tA9DCAB1B8D538519A3E04A656155C163 /* TTRangeSlider.h in Headers */ = {isa = PBXBuildFile; fileRef = C0B85CEF090EDD7737A7E0F1D0F0F169 /* TTRangeSlider.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tA9EEEA7477981DEEBC72432DE9990A4B /* Alamofire-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A82133367E269E7AA71B9DB6052EFEEB /* Alamofire-dummy.m */; };\n\t\tAA4959949A290D4B8BE1E31A890D0C80 /* MJRefreshFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FF93E1E76B5ED1DA01941D734DB3531 /* MJRefreshFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tAA52CCA36AE2BBAA57E7DB6D3B437F6F /* NavigatorType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A310736267696B70A17786FD9CE22A3 /* NavigatorType.swift */; };\n\t\tAA5D493C14AE53D874A31A847787D800 /* Scan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C5ABD7D168407FE39CC76E2B5D13784 /* Scan.swift */; };\n\t\tAACE8D1BD32A4820B7BEB0EE91FB0795 /* TYPagerViewLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BFCDA5713A7916617594A7D5B7BB187 /* TYPagerViewLayout.m */; };\n\t\tAB9F26D130FF443CBE0DA2ADE2E27479 /* RxCocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 77AB7A6BBF44C678FD2D852835009017 /* RxCocoa.framework */; };\n\t\tABB86D5B62EC96B6997FBE8361498297 /* ConstraintMakerPriortizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F92102426225DFFC6D512690BD4167B /* ConstraintMakerPriortizable.swift */; };\n\t\tAC09A4779981FD4CD0F95DC2054E4C99 /* Reactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C74C02A940DA7E7A70BFF3EDB096E49 /* Reactor.swift */; };\n\t\tAC1E75DFB1009851DBAA58FF21A18D95 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F10EACF1B2D7C5A4C670634756973B3 /* Foundation.framework */; };\n\t\tAC8523DFDA128333C4B596BEE5DDD3BD /* ScheduledItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDC3EE36C7DE6D97F96B2B36B0E557C9 /* ScheduledItem.swift */; };\n\t\tACCE7F2F7E9C3F68256E49D4654E6076 /* TYTabPagerBarCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 07A6E49BDE2308DCA0050930CA050850 /* TYTabPagerBarCell.m */; };\n\t\tADE879A06835C91322843C21A58C5C40 /* SingleAssignmentDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70EBA339974E545CDC23F472B6A4BD3E /* SingleAssignmentDisposable.swift */; };\n\t\tAE1EF48399533730D0066E04B22CA2D6 /* SessionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95F766DA63DDEB880E468218435A871E /* SessionManager.swift */; };\n\t\tAEF1257C803A37C026D774C6EB1F5A8B /* Bag+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = F384E81160731D07A8472A16F0EF1EFD /* Bag+Rx.swift */; };\n\t\tAF0CD2BD2A2074BF1A98000D204275A5 /* SwiftyColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01D96AEEF8ACF586BFC5351394E36F02 /* SwiftyColor.swift */; };\n\t\tAF2C3FA58842BEF584ABF0D15CD53311 /* TYPagerView.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E5085F3C34DD0D51CCDC43343115505 /* TYPagerView.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tAF5D443F3631C6B95B4E8F831DCFDA79 /* RxTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CF3671CDFCBADF26426E2EC9ED34424 /* RxTarget.swift */; };\n\t\tAF5F7A48DB63AB10243894FA9BA673A0 /* AnimatableSectionModelType+ItemPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = A32996D04BF42DF4610DB92306B85695 /* AnimatableSectionModelType+ItemPath.swift */; };\n\t\tB0033530A0EAABBB31CD46CA2899F3BD /* Box.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74AE307751AFEBCC18F1E034FE08A05F /* Box.swift */; };\n\t\tB02D91E02099D3C6A2F988C766032176 /* MJRefreshBackFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = E4373BBA3EC79125E217AF8056418360 /* MJRefreshBackFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tB0B357445D024E50F897E2DE8F2D58AF /* TYTabPagerView.m in Sources */ = {isa = PBXBuildFile; fileRef = BE113770F3941380D55A0F946E7431DE /* TYTabPagerView.m */; };\n\t\tB0EF72D8E2CB6594FEE4DB2600B32650 /* IQKeyboardManagerSwift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 51312E298DD4FE8C24D45F0F9149E1EB /* IQKeyboardManagerSwift-dummy.m */; };\n\t\tB14375A0B7445CA462819C7468B3EF21 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E5F9481F27654B03C1A5A056D8909FB /* UIKit.framework */; };\n\t\tB1A7ADAE2CAEDA5D703CE5C6A6DA405B /* IQUITextFieldView+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80810E76C51AA5F19CE1D4B0D55E060C /* IQUITextFieldView+Additions.swift */; };\n\t\tB1C6D346149535E8CA5CD2443BBFCCC3 /* RxCollectionViewDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3508AF1777C25C4BC5CE6002832B9BF /* RxCollectionViewDelegateProxy.swift */; };\n\t\tB2B98FD2647A3FA41300E78136335B3B /* Optional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CCA6ED6120DA770AB86F564EEAC46DB /* Optional.swift */; };\n\t\tB2CFCC48BC62FB4C35F6096233613F7A /* KVORepresentable+CoreGraphics.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC0E5E64017E2B544B9C4365BF0DBBF5 /* KVORepresentable+CoreGraphics.swift */; };\n\t\tB2EFEFFB34D517F8E9A203B674AEBD13 /* DictionaryTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78C07D23AF9D0ED48A9FEB791BA9FE25 /* DictionaryTransform.swift */; };\n\t\tB33491A4893CF9905D4A8DF6A8BB52A1 /* RxMutableBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44D999B360E6504760FF4A8DD2CB17A1 /* RxMutableBox.swift */; };\n\t\tB3643AFA39209852E984CD30BB18413A /* Queue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1778148BC4EB285B75595B087B8FC931 /* Queue.swift */; };\n\t\tB3BC5178332C6FA8017CB00559E2AD92 /* UISearchController+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53D0CE43D178809120E722B457D98361 /* UISearchController+Rx.swift */; };\n\t\tB3D2B497C3F6721D93B9D8C6E459B763 /* Moya+Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD71B5E50804962A47932EB53600027A /* Moya+Alamofire.swift */; };\n\t\tB467718840D63E04D0D3AD556E11E665 /* CombineLatest+Collection.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4051F928839DBFCB64F5087D54C40E3 /* CombineLatest+Collection.swift */; };\n\t\tB46EEAED7469BDA363E075F37016248A /* ConstraintViewDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = A468830C4A1700A0C17545C662543173 /* ConstraintViewDSL.swift */; };\n\t\tB5A770DCA3CD54A8B48F6166F9D440E2 /* TYPagerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6C82E28899508F47FDD43F9C7D4722F0 /* TYPagerView.m */; };\n\t\tB65FCF589DA398C3EFE0128064E510EC /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC30C48A2548E77051CB43345238F5E4 /* MultipartFormData.swift */; };\n\t\tB6E2FEDDD91D886E3BA3F1F9D338E672 /* Reduce.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4914A9BB07C4CB2A6DDD5D0096A0BE87 /* Reduce.swift */; };\n\t\tB74C2929B76A5841DBF3C73BA3C09FB8 /* SynchronizedDisposeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54D4C9E3C57DE8A35333AAD4C4E744A0 /* SynchronizedDisposeType.swift */; };\n\t\tB81E85BB5B30F34AAED56494D329A74D /* URLPathComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 306015976D0F37EFAC711062A258D8E9 /* URLPathComponent.swift */; };\n\t\tB83AC06EC6750F396E898A09BE4BC42B /* ConstraintConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2A7C9B0E3259DE8E0442244250D596F /* ConstraintConfig.swift */; };\n\t\tB8567C825865356AF4137382CE6C007F /* Pods-RxXMLY-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 85302FAB5FE773C188E3758D45ABFF83 /* Pods-RxXMLY-dummy.m */; };\n\t\tB8756B693A52F59BA955595B93A8AFE4 /* RxCocoa.h in Headers */ = {isa = PBXBuildFile; fileRef = 339F05AA6561AB55D443E3626724120A /* RxCocoa.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tB948B6BD2A647A1DCC1401170B5D09FA /* View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3795E84704A9198DC6E04FB5A7227CCA /* View.swift */; };\n\t\tB9AB0B01A8F7F6D3C83AEE614C9304C2 /* Moya-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C6994BF34E50D97EB111CDFB02DA22A /* Moya-dummy.m */; };\n\t\tB9C39C539A810D1958AEEF1AEC0FD75C /* ImmutableMappable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88CD1219127C85AAD3C013FB79D9BA84 /* ImmutableMappable.swift */; };\n\t\tBA0711638621C2A47AABFF9E03546893 /* MJRefreshAutoStateFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 44409A050584D330FC1B6F6D3CD9B53E /* MJRefreshAutoStateFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tBABE350B5A22F812D599C5C016EAA1C4 /* Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = C481BF3DA3A78A8E7F5176B802625CC6 /* Deprecated.swift */; };\n\t\tBADF32BF243CAB2D89D072A0C2A9D791 /* RxCocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 77AB7A6BBF44C678FD2D852835009017 /* RxCocoa.framework */; };\n\t\tBAFB96EEF09DA050757292A2F5EA6404 /* ConstraintRelatableTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 328686532CB38406B7BB3A32945B6474 /* ConstraintRelatableTarget.swift */; };\n\t\tBB04209DDB72CD325AE09D2EC3EBC380 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 313319FF55255C3736F46998BCDF7F8A /* CoreGraphics.framework */; };\n\t\tBBEFE2F9CEB73DC7BD97FFA66A0D9D4F /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7023AE71AB1962FA73C0D900E6564BE /* Validation.swift */; };\n\t\tBC3A96095032E81BC2F8E5A479CE906E /* SynchronizedUnsubscribeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9946E97DCFB4572476564D33A05975E4 /* SynchronizedUnsubscribeType.swift */; };\n\t\tBCEF70E63A638C19CEE89A53D7FFE523 /* ConstraintLayoutGuideDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 434BF576D15902B83DA5D893260FA1D6 /* ConstraintLayoutGuideDSL.swift */; };\n\t\tBCF96CF7173DBD9B80B2DA5EDB3A9119 /* URLPatchComponentMatchResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E647F479FFCF502B2E7DF9A363BE038 /* URLPatchComponentMatchResult.swift */; };\n\t\tBD2B90D397024A00B586B7A58994F534 /* ControlTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05D420155A7835B81FCFE92D3FC75464 /* ControlTarget.swift */; };\n\t\tBD443E89A222B5234FE7167CC470030A /* Cancelable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 495C0C539FEC03003AFB93904736DE91 /* Cancelable.swift */; };\n\t\tBDB33C3708110C6D755175D1F0A2A70B /* MJRefreshStateHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 09B0C33CD96D9A514D7DB3610C6D2F6E /* MJRefreshStateHeader.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tBDB43EE666BB8F17F18E4DDBBE6C2B43 /* Timeout.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE9BA3DB7A5A422C613CFBFB2811FEA5 /* Timeout.swift */; };\n\t\tBE13FF6639C26FFBFE305F57336AB8E4 /* RxCocoa.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98BFA9BCF11C38855F14FC8D710D4E95 /* RxCocoa.swift */; };\n\t\tBE5C67A07E289FE1F9BE27335B159997 /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EEFED166A077BBCCE208D34F71B616C /* ParameterEncoding.swift */; };\n\t\tBE7C78E3DD8046E3CB4BC5A28C057853 /* RxScrollViewDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEF74C2451A7C311E3C89E75D4746DD4 /* RxScrollViewDelegateProxy.swift */; };\n\t\tBEE391D17D1ADB32DA7C8825FE827519 /* _RX.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FADD7C8C693834E93343EFB77D33AAD /* _RX.m */; };\n\t\tC059355C2838DB2D4A2796B41543511A /* SingleAsync.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D231836443906AF664DE2289F32D387 /* SingleAsync.swift */; };\n\t\tC084E86C68138F0227379212201B1D11 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE28FDBE90B525AD5F5FF81C344D3D2A /* RxSwift.framework */; };\n\t\tC100B07C3830CD742E8C9D9E427B1E3B /* ViewTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42F0AF2A7F102777266AB6FFCA689615 /* ViewTransition.swift */; };\n\t\tC12639433CE2E21DEF3AA6DED99748FF /* RecursiveLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66C7719FC6A1EB8A6E7F08B0215685B3 /* RecursiveLock.swift */; };\n\t\tC1446EC49AB387AF0EDF8DD292AB22F3 /* TakeWhile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BED0C58934B33DC41A1432BABD2EFA8 /* TakeWhile.swift */; };\n\t\tC1A095D5DB6C70109EE936A914E53709 /* SwiftyColor-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DA9FEB5DF32D81B067986FD382163B1 /* SwiftyColor-dummy.m */; };\n\t\tC1CF0A6316B4563F05B117FDABF76AD8 /* CombineLatest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18A31C1EE5C5A400DA67610DDECCBD49 /* CombineLatest.swift */; };\n\t\tC1E5669E219DF70E0E763DD0468795BF /* KVORepresentable+Swift.swift in Sources */ = {isa = PBXBuildFile; fileRef = F79A80A6FF76E139A757BFA4110503E7 /* KVORepresentable+Swift.swift */; };\n\t\tC1E82097CF7DF3CB4B4063ED08D334D8 /* _RXKVOObserver.m in Sources */ = {isa = PBXBuildFile; fileRef = 957D3B23678E4698CC79A2DE9EA9F96A /* _RXKVOObserver.m */; };\n\t\tC1F06F8B94A566ABE591F84CEAC03C14 /* UISlider+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B3623F446EB11D7EE2B1A505A7B1E5F /* UISlider+Rx.swift */; };\n\t\tC2210016F369741901DB640E70B60688 /* UIViewController+TopMostViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F8F22838BEB780C855A8033AE7ED2A4 /* UIViewController+TopMostViewController.swift */; };\n\t\tC26CD78814782F6C4BF7C3B02CA06642 /* ToArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC7B9021F90F58D6E367BA8B4C9C2B14 /* ToArray.swift */; };\n\t\tC273C74217117E95DFB32C153F6DAA84 /* DisposeBag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23FEC5DC4D59BF5FF4FE6E5DE5CF64BC /* DisposeBag.swift */; };\n\t\tC2F4A31052D8F8C636829A7109A45DB2 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE28FDBE90B525AD5F5FF81C344D3D2A /* RxSwift.framework */; };\n\t\tC3A7EF039070A3D3EE385B130DB94EEB /* Stub.swift in Sources */ = {isa = PBXBuildFile; fileRef = D71887F7534D1360E1CF05E79FDAC471 /* Stub.swift */; };\n\t\tC3CFEB87CAB11F928DAD084B87C7F26C /* ConstraintView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81B1BE2330946471DDB4A3A11D43E0B8 /* ConstraintView.swift */; };\n\t\tC40F6D2FE20755C045864C23F73260C8 /* IQKeyboardReturnKeyHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6EC870FE5CE9FD966D23435C1DB6E0C /* IQKeyboardReturnKeyHandler.swift */; };\n\t\tC446D343DA5F7767B64807C921A7BA4A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F10EACF1B2D7C5A4C670634756973B3 /* Foundation.framework */; };\n\t\tC543308E999E593FE565FCE053658718 /* TYPagerController-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = F4E3F42EFB30F56006250129E4BF5ABF /* TYPagerController-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tC5C6E5A84362150667FF88B6C18C0DAB /* SerialDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F08868A7AD5BECFD90CC22A62671DC82 /* SerialDisposable.swift */; };\n\t\tC7298FEC2DD0BCFDF12F89121CA036A7 /* UISwitch+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4773B687AFC9012C6545F9C30E80356F /* UISwitch+Rx.swift */; };\n\t\tC878E06DF50107B7362F7A9FD824E0A9 /* TYTabPagerBarLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = CD67BEEE3096E3E2BD09DF6158788A6E /* TYTabPagerBarLayout.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tC9C7FF8901714AEEF66A96DEC28B4C51 /* Multicast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D21901F32D924DB95300B2C650103E1 /* Multicast.swift */; };\n\t\tCA8174FE073791F18FB8C74BB2C4FF57 /* TYCyclePagerView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A5E925D1347A4A7AE44D07D3342D1BCB /* TYCyclePagerView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tCB29E86F679E9DDC5C5A1C89482701CA /* IQPreviousNextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C114C6520E1FE3996B0B360BF559199 /* IQPreviousNextView.swift */; };\n\t\tCB3BEC3D885EFDE2FE24B5A4F6FC16E7 /* PrimitiveSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7AF230FEF4F9203FE69CA75CAC56E33 /* PrimitiveSequence.swift */; };\n\t\tCB4222BC34D92C2E06A5BCF730FEFE71 /* Kingfisher-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 347D8CF191232FE2DBCADBECC8AB9A5F /* Kingfisher-dummy.m */; };\n\t\tCB6D60925223897FFA2662667DF83E8A /* Response.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2E6EA6ADCEAC27A4822132EBAC46122 /* Response.swift */; };\n\t\tCB8DF027448816C623E9B02A3685A59F /* ImageView+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE96693365ED0583573F43D8F5B57187 /* ImageView+Kingfisher.swift */; };\n\t\tCC3F2D5828482FEE2984ACA3FDF23349 /* ConcurrentDispatchQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7A200DBF260A1DD96FA33642A921C9F /* ConcurrentDispatchQueueScheduler.swift */; };\n\t\tCC93854C66A808596F5A3B58FDB49BF8 /* IQNSArray+Sort.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76B7D152E72F3D0808E4186445E4FC9B /* IQNSArray+Sort.swift */; };\n\t\tCCBED63F97ED12D1D9F2A35E42056C7E /* PublishRelay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 346F9291AC0BA83FB7B3962FC7F73267 /* PublishRelay.swift */; };\n\t\tCD8C4C4267E198C30ED82159B3FB2A45 /* TakeUntil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5900BA1E16E8EB96D52F16B3133DD305 /* TakeUntil.swift */; };\n\t\tCDAD14D7F2DC3BF192411C56B374C172 /* RxAlamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14F1C5DE23CD40C00D675D81FDE24A5E /* RxAlamofire.swift */; };\n\t\tCDB48F0785D88989F4C7EB6C419AB6B0 /* String+IdentifiableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E6586D8B7FB36BDE9E96FE450F51E98 /* String+IdentifiableType.swift */; };\n\t\tCDFA17536632AE886DF2DD7FCBFF8F68 /* RxCollectionViewReactiveArrayDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B2C9F6C4EE9F9989261CF1F3418FC9E /* RxCollectionViewReactiveArrayDataSource.swift */; };\n\t\tCE57D6E0880DE871AB922E0017E1472B /* NotificationCenter+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7B06E614268F88A37528BE5B8A08933 /* NotificationCenter+Rx.swift */; };\n\t\tCE7953BA2996D7B543684441E7BF2579 /* UIButton+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BBEE2DB22AD2B01DE2D742F08B660DE /* UIButton+Rx.swift */; };\n\t\tCEA192A80E93599EFC5BEC6EE1F97BB5 /* Task.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4F172EFA622B78B8E948E1F153B1BDD /* Task.swift */; };\n\t\tCED1FC24A094EABAF628E86E2BCBB656 /* TYCyclePagerView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E4CFC30F3E8C50C2772DDC74F2AC0626 /* TYCyclePagerView-dummy.m */; };\n\t\tCEDBD76A18EEEDCA4EBAC563A97D2C51 /* ConstraintOffsetTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E2E1626B3D838551A7744F976FEB850 /* ConstraintOffsetTarget.swift */; };\n\t\tCF3B98E3589779E82B30019BF13739D4 /* BooleanDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE22F0C823232387AAE225F52265246 /* BooleanDisposable.swift */; };\n\t\tCFB93AB1B5504D35D1E6664972D62F19 /* Sequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99F328B2BEE043C872339B6E419D2095 /* Sequence.swift */; };\n\t\tD0121BBC81F4FA5DEF3D0A4F405BC605 /* ReusableKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B4592368CE0F4DED0B9CAF915FC9215 /* ReusableKit-dummy.m */; };\n\t\tD02DEBC241C24DEEFDA13C355197A2FB /* UIScrollView+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = FB8C71D5C39C423BB61425ABDC60B40B /* UIScrollView+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tD044C46E53776D7072DB89497EC1AC73 /* RxPickerViewDataSourceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = B97FA317AEF5791CA7299591278DDD85 /* RxPickerViewDataSourceType.swift */; };\n\t\tD0E7D5B865722A25EC7D91B0FAD8A6CD /* MJRefreshAutoGifFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A0EE75F34E2C1B1E6254873E3066CEA /* MJRefreshAutoGifFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tD20061C845E39003EB86AB1292B4577D /* TTRangeSlider-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 18601CAC220AFC4C4A67E4C19A37FA0C /* TTRangeSlider-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tD371307D7540D73B2DC187E81186B097 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D11C85C7F13C6D98A3A465BC90BAD5C /* Utilities.swift */; };\n\t\tD3BECB43898F07D286FCEB33DC197331 /* NSObject+Rx+KVORepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08A296320835E99AA5A0CED018A67A58 /* NSObject+Rx+KVORepresentable.swift */; };\n\t\tD46545D206874E3A223372C84F1EA73E /* MJRefreshAutoFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 23859CF12D4131E1E0B8B0209A00B878 /* MJRefreshAutoFooter.m */; };\n\t\tD500BAC2F56A14AA3226D7087700D426 /* ReactorKitRuntime.h in Headers */ = {isa = PBXBuildFile; fileRef = 385C967E6D18858D5311CA87A4205434 /* ReactorKitRuntime.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tD5CAE5F9ED6C5FFE2911D544A442B8DF /* UIScreenEdgePanGestureRecognizer+RxGesture.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD5F22C193A3AD6545BDE4B91729668D /* UIScreenEdgePanGestureRecognizer+RxGesture.swift */; };\n\t\tD6139FB200F1DB52CB02F86050D2C555 /* SharedTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6D2C080BD70A34F38B01F04F8C066D6 /* SharedTypes.swift */; };\n\t\tD66E78D63935A98894E702D922AA8B91 /* MJRefreshBackGifFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 43F0F183E8964F9C8D16E30F45CF6844 /* MJRefreshBackGifFooter.m */; };\n\t\tD7B62E5B90F5CC105525D4E4A710A1F3 /* UIBarButtonItem+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98B0262ADD4A92D4CCFE4F51BE3FD5D5 /* UIBarButtonItem+Rx.swift */; };\n\t\tD7F05F607F7BEE704777650F1F56A17D /* PublishRelay+Signal.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB9B39409869FB19DBBE9E21A282D0E1 /* PublishRelay+Signal.swift */; };\n\t\tD820DE54D6E9E5C85E0F9BF8A399E5EF /* MJRefresh-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 78266012E1D0050485CA537DD6F66FF5 /* MJRefresh-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tD947452217EE9CF7F39D5F25C226DACC /* CredentialsPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB47246A17CA14228A79384E13C42EC /* CredentialsPlugin.swift */; };\n\t\tD989E0CB9CB56EBC807116DB668019AE /* Catch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BCCB28DE00E01DFCDBAFD966F967237 /* Catch.swift */; };\n\t\tD9AAAFC710311CB167E506163E994A4D /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B34630D7EB0A587B97952108987DB65 /* Observable.swift */; };\n\t\tD9EAAE4A13D0E04E0557CA100CE0A2BF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F10EACF1B2D7C5A4C670634756973B3 /* Foundation.framework */; };\n\t\tD9F2BA4D713DAC2A85CB4A453240EA3E /* MJRefreshAutoFooter.h in Headers */ = {isa = PBXBuildFile; fileRef = 38B56F8F2AC8700738ABD303DD4F3606 /* MJRefreshAutoFooter.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tDA7EB935B3E95B385300ECE8D38F71B6 /* Create.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E1B85E14851EF923C2BD626BE22587 /* Create.swift */; };\n\t\tDB2D2DBE410D12B4A8EC0DEFACF3DF32 /* Signal+Subscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 622801585769EF5EF95DF31C3FC639A9 /* Signal+Subscription.swift */; };\n\t\tDB87FF0D3B17ABB5452FDD4D70C9A84D /* FromJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 236D0EC42AF18C98E4FFEB08963E7C51 /* FromJSON.swift */; };\n\t\tDB912D996DC177901DACA697F2EF96F9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F10EACF1B2D7C5A4C670634756973B3 /* Foundation.framework */; };\n\t\tDBCCE10306122D22ABD5132028DEC06B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F10EACF1B2D7C5A4C670634756973B3 /* Foundation.framework */; };\n\t\tDBF869BBD4D1B55C2D5CFE5EAE756F9F /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95CF89A127DC79551BAA8988F82BD1E2 /* Event.swift */; };\n\t\tDD2D9461BFEB9EE414A6D61E3A8CD7A6 /* Zip+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = A678D15F6F0F97A723B186CEA25EE5A4 /* Zip+arity.swift */; };\n\t\tDD311E4BCAE7DD4AA5C938968D72AAAF /* UIPinchGestureRecognizer+RxGesture.swift in Sources */ = {isa = PBXBuildFile; fileRef = 569E77B7F0029A0A2087DE259C07DB22 /* UIPinchGestureRecognizer+RxGesture.swift */; };\n\t\tDDAD3A47F10FBBB697E079CAB38EC31C /* Empty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4497D98DB94E983018E6F6C2A4DBAF68 /* Empty.swift */; };\n\t\tDDDB37E35D9BC501950FB4909B609F2E /* ReactorKitRuntime.m in Sources */ = {isa = PBXBuildFile; fileRef = 5F70D589B9E780A60A3716F46A4ECF0D /* ReactorKitRuntime.m */; };\n\t\tDDDF354A21835294F7CFB5ACFA5EA968 /* NSObject+Rx-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8533AEEE8CD59BA624CA9267423D28E5 /* NSObject+Rx-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tDE17E4C2C6EADE5D2D531268B1695405 /* UIView+MJExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 02FA95A68EC5AC5D4C787DD8DAA5C118 /* UIView+MJExtension.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tDE8B3FC90EA6A88A4B44039572481C86 /* IdentifiableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3869DF0902D254BD40D6B02E11A8B52 /* IdentifiableType.swift */; };\n\t\tDF1BF64A08EBF0DE6CD67ED0D49CB07B /* Navigator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 084AF2E51A268DBF8C3B947B137318FC /* Navigator.swift */; };\n\t\tE027FBCDAF65778317E634F4A92512B9 /* TableViewSectionedDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F1C6F4433BDCCAB44D788A1B10A5011 /* TableViewSectionedDataSource.swift */; };\n\t\tE0C9EB4ED4DC98789196DD61345ED42A /* TYTabPagerBar.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F27A8AA53C280B6DF033E2515D7A2E9 /* TYTabPagerBar.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tE1ED57DFDC84B588DCFF41921D9BED15 /* TYTabPagerBarLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = FA64F8A7EA7F1D019BA4637FA772850D /* TYTabPagerBarLayout.m */; };\n\t\tE272024F3BB38967141313D5CB8E4120 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F10EACF1B2D7C5A4C670634756973B3 /* Foundation.framework */; };\n\t\tE2F35C82BD4AB36C18F735165A7683EE /* AnonymousObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DB87787AD0F7333249395D1378FED63 /* AnonymousObserver.swift */; };\n\t\tE36C37C4AC1FFD475C4490193C66FF22 /* IntegerType+IdentifiableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63CA5A419783AFF7463EA6144B0C1E36 /* IntegerType+IdentifiableType.swift */; };\n\t\tE37B94CD6DB302F6D233BD878772B868 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE28FDBE90B525AD5F5FF81C344D3D2A /* RxSwift.framework */; };\n\t\tE3EF505A67060CFB3E503F5B79D6E909 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F10EACF1B2D7C5A4C670634756973B3 /* Foundation.framework */; };\n\t\tE402F8791AB3E6BE18F05C1265668896 /* ObservableType+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90107D958C65D510896483F2CB8060BA /* ObservableType+Extensions.swift */; };\n\t\tE454C46205FD054E2133897B1CF339D8 /* RxPickerViewDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9096DCC6CC66370C372F38BF8C1E435A /* RxPickerViewDelegateProxy.swift */; };\n\t\tE47F2B7C9621969D29330632BF46DFE3 /* UISegmentedControl+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 645CC45F2863AE7D2A6FB2A8C23E620F /* UISegmentedControl+Rx.swift */; };\n\t\tE4C77EA0646C587F18D7AEC063AA13AA /* InvocableScheduledItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87CE09E0A8341C183F59A37440D5153A /* InvocableScheduledItem.swift */; };\n\t\tE560CBBCB2A8426232A0C237818CB350 /* ImmediateSchedulerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95A5AC992E4B703AA08D0A815AAED779 /* ImmediateSchedulerType.swift */; };\n\t\tE57312010AFB591EE37870F65E651EA6 /* MJRefreshNormalHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 77D21DAC0D06E0D6BBF5A78CB767E815 /* MJRefreshNormalHeader.m */; };\n\t\tE678304A73835950C93570CD42BF160F /* UIGestureRecognizer+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64ED938103FC90F798F7A60F04981575 /* UIGestureRecognizer+Rx.swift */; };\n\t\tE710FF1F4EB4B125F9C5DBDFE3B9320F /* Placeholder.swift in Sources */ = {isa = PBXBuildFile; fileRef = F68D0C4E903F4B9E77676032554A5278 /* Placeholder.swift */; };\n\t\tE77D52EE7D897833F4A8441A8F2477B5 /* Alamofire.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A1A112A635DA48EF8CB77AF4F3AE614D /* Alamofire.framework */; };\n\t\tE80DB5D9B2D35085282DF057BB540AFE /* MJRefreshBackFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D4BA91A34AD8C308124A2BAC574B3B9 /* MJRefreshBackFooter.m */; };\n\t\tE898E416B77BB93F9D6E37227C723D81 /* URLMatcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB98DBDF6250E6EDD9D4711CCA72CDE3 /* URLMatcher.swift */; };\n\t\tE90FA56D8781CEEECA7E5AD108103434 /* ElementAt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 397F2D1B6C0CB8DEFA63186BB12618B2 /* ElementAt.swift */; };\n\t\tE92322FB9B976A926D52D12C5ECC5816 /* Switch.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC94DB3E4DBB1ECF4FA33EBC9EAACFDF /* Switch.swift */; };\n\t\tE97BD9D3A62BD8225C79AB2D4C4F16B3 /* RxAlamofire-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A93AB57B4326570AC0951E305DD04B1F /* RxAlamofire-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tE9E28E9BEA02135CFBF9E598CC1885D2 /* ConstraintMakerExtendable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0768925949DA79DC0DB78B89D10ECB45 /* ConstraintMakerExtendable.swift */; };\n\t\tEA326BB6A8ACA0EE3C0B44849198ADE6 /* Array+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BF26D84DAD5A55C5E5BE6A0660FAEEF /* Array+Extensions.swift */; };\n\t\tEA4F7446E804B5FD266D16B9E9AE5374 /* SectionModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 923B40C1B730134DE3FB93D56434F359 /* SectionModel.swift */; };\n\t\tEA67527CAF7ED571C8A84B66DDD70FBE /* Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 115F5111E88B41835988258D0B9D90F2 /* Operators.swift */; };\n\t\tEA811EC31868E728B8BE88F94CA53B19 /* AddRef.swift in Sources */ = {isa = PBXBuildFile; fileRef = 542762FC821F584B23860CBBBAF13564 /* AddRef.swift */; };\n\t\tEAB9A201A0338EEBD326E78E366EEC20 /* ItemEvents.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE8FF0C7C94471EB15B40751856B8D53 /* ItemEvents.swift */; };\n\t\tEADFC7E11D0CCEE93B2F2B90B02C8CF7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F10EACF1B2D7C5A4C670634756973B3 /* Foundation.framework */; };\n\t\tEB2866D890A7B0D65C8AB7F37614C15F /* SubscriptionDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0112A7EDEEB67FF3C434A3F925DEA88 /* SubscriptionDisposable.swift */; };\n\t\tEBEB72F80DCD10DEB82BF5F856D467FD /* MJRefreshConst.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C7E38D158EEE0908532959AA8DCB439 /* MJRefreshConst.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tEC0418D76D4ADA0C663EE5E8D2D9B57C /* Plugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 125CF19DCF28A39EC761EA281EBBC44B /* Plugin.swift */; };\n\t\tEC1A896625476730D64BF9645624BBAD /* DataTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC29C744A1F98EEA2D40646969A57510 /* DataTransform.swift */; };\n\t\tEC2CCB07B8CCEF669FAF345D29691030 /* IQKeyboardManagerConstantsInternal.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAB7E27C2C9842A03F3BD947DD8493A2 /* IQKeyboardManagerConstantsInternal.swift */; };\n\t\tED4CDFA145F591A93A57DC1B7CE1C12E /* MoyaProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0049E24D8DFDDC0E246DC35576E7DCFB /* MoyaProvider.swift */; };\n\t\tEDA4B2824B12E7A3579F99909744E23C /* RxTabBarDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = C755463902805FE86A327D9AD0B26200 /* RxTabBarDelegateProxy.swift */; };\n\t\tEE20C85515D53DE61D8435080677F58E /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0E5F9481F27654B03C1A5A056D8909FB /* UIKit.framework */; };\n\t\tEE7B1C447D0CF446C179EA74E5646A94 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F10EACF1B2D7C5A4C670634756973B3 /* Foundation.framework */; };\n\t\tEE855D5B4F46A1DB974602210A435D93 /* ConnectableObservableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06147002706BB75CECECA91480E5C0E6 /* ConnectableObservableType.swift */; };\n\t\tEF12BF89DE7448AEE5CE6F0F8DCA3F9A /* UIPanGestureRecognizer+RxGesture.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3F4C6BA01C9A3737D53D5029569BD25 /* UIPanGestureRecognizer+RxGesture.swift */; };\n\t\tEF298B1BEAB1956FCF7E1E8EA3911780 /* UIScrollView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE68236572EEA4E94A38244743901FE9 /* UIScrollView+Rx.swift */; };\n\t\tEF3D53302381F94241804E5CD95AA64F /* SwiftyJSON-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4DD33D08EA36F2C8861A36D8E15B3610 /* SwiftyJSON-dummy.m */; };\n\t\tEF412419B6C1CD59B3BBC3836BD43767 /* View+RxGesture.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F46744125C99B20BDE8928C9D91767D /* View+RxGesture.swift */; };\n\t\tEFCDB86F2D87E50B9B3EAA6827FF4012 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36C41A4EDAFACF2FCF4214E703CD5C47 /* Result.swift */; };\n\t\tEFD264FC408EBF3BA2528E70B08DDD94 /* Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 187ACC537834C3D22473C47D21364850 /* Notifications.swift */; };\n\t\tF07FA872B5DE108E5F0B486E7F183E77 /* Do.swift in Sources */ = {isa = PBXBuildFile; fileRef = E74A11FE1DBDB7EA6BDB703F6B58F460 /* Do.swift */; };\n\t\tF1733F37EB2E6EF05781BB4DA571B204 /* Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F2CEBF6D286D3D808C8AB81A58AFF59 /* Debug.swift */; };\n\t\tF34B7F0D30A6D72E9FBF2242712BDF9D /* HistoricalSchedulerTimeConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D76F782371F7D6EF97DE209867481EA5 /* HistoricalSchedulerTimeConverter.swift */; };\n\t\tF363D1083A5EFBE7CE56067520330A9D /* ItemPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 459BCD44D36BC348042325F44BD78250 /* ItemPath.swift */; };\n\t\tF39A3624015D4234E6FE35761F53BC93 /* ActionSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9647D7ACC10E74465531ADEEFD4D2E0B /* ActionSubject.swift */; };\n\t\tF3E97A8E1D1ED2B3D24961995923B99A /* SwiftyColor-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 52A5AC3A3FC014CA05565755B1794774 /* SwiftyColor-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tF43A145ECD909D880FDC70E638AB8C13 /* UIRotationGestureRecognizer+RxGesture.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F707D328F3FE6B0BA81F88374DC441C /* UIRotationGestureRecognizer+RxGesture.swift */; };\n\t\tF48DD4AF7C254B7A2F67A690AF8EF143 /* IQBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E6990B20E9EA105BBB88B21C57593B5 /* IQBarButtonItem.swift */; };\n\t\tF4988BB5862C381854506C82E43136A3 /* ConstraintMakerEditable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 222AACF264926205DACCB10D9C8464D7 /* ConstraintMakerEditable.swift */; };\n\t\tF4A57F7C1F8184A6DDEABB07FA6D7083 /* NSBundle+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = 09517CD921BEB56F91C5FA7988170302 /* NSBundle+MJRefresh.m */; };\n\t\tF4ECE99FE56932FCA2EB2B238C8EA43E /* Optional+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C60A46D85400354A02A72584F53237D8 /* Optional+Extensions.swift */; };\n\t\tF527B0A072DFD754B471E4C1F6B16C48 /* URLTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9979EBBDCDD9A7DDDB0725FEC97660E7 /* URLTransform.swift */; };\n\t\tF64167E53EFA6CC3537752E4C2442990 /* IdentifiableValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA8C0C17C65F493BBDD9F7C413C2C378 /* IdentifiableValue.swift */; };\n\t\tF66F21FCAD37F04AF3CE0B9ADDFACCC3 /* UITableView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFBBB6581E245F03FD7746F2B3F6838A /* UITableView+Rx.swift */; };\n\t\tF68EA720B0ED1BF96CEBF07977A1C0A2 /* MJRefreshComponent.m in Sources */ = {isa = PBXBuildFile; fileRef = 118F0C07C32E76EF6489509A4F07F50B /* MJRefreshComponent.m */; };\n\t\tF6BECD98B97CBFEBE2C96F0E9E72A6C0 /* ResponseSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 720B12F497653C86DA2AF27BCCDEFC2D /* ResponseSerialization.swift */; };\n\t\tF71155830BCEEE6D69E12F14089ED538 /* UIActivityIndicatorView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C3B1C0259FBCD7A10525F73D370CF5 /* UIActivityIndicatorView+Rx.swift */; };\n\t\tF71C6DC478982AEAFDE2B7040BC82D67 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04FE7430ECAF1467968440D35165D54B /* Error.swift */; };\n\t\tF740D92AE1DF1156C9BE899D7A4FE12A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F10EACF1B2D7C5A4C670634756973B3 /* Foundation.framework */; };\n\t\tF793B5FB9A2D4726AF9CB4E564BFE650 /* RetryWhen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9A3DB0E144693D175CBA841C8B10601 /* RetryWhen.swift */; };\n\t\tF809B2628CA2797393525F37F639FB7C /* ControlEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A962B38EA206CD0B32DEC9E6DC414479 /* ControlEvent.swift */; };\n\t\tF8B3D3092ED0417E8CDF32033F6122F5 /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CD95565DA23CF770293505264420AE0 /* Alamofire.swift */; };\n\t\tF8DB73FCAA437CAC5D12AFBA1DD3D205 /* TYCyclePagerView.m in Sources */ = {isa = PBXBuildFile; fileRef = E1D44E21411F23F3505F31B444A1A104 /* TYCyclePagerView.m */; };\n\t\tF91B75BFF4738F36668933C397A9FCA8 /* _RX.h in Headers */ = {isa = PBXBuildFile; fileRef = B717B3469C2896926EF05EAF11498DA0 /* _RX.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tF931EEDE05DA8151D729C5C39F5CBE83 /* AsSingle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FA6CC0C558EDC9E6881C22246E9E059 /* AsSingle.swift */; };\n\t\tF95FC708ACF2B7648DFBCD974ACD9B89 /* DistinctUntilChanged.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD1C4965E4534F094C7E5D0417A804AC /* DistinctUntilChanged.swift */; };\n\t\tF98CB7FADDB6FDFD66E71D447444F5C5 /* RxPickerViewDataSourceProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4284532690122048902F462ECE7D36F5 /* RxPickerViewDataSourceProxy.swift */; };\n\t\tF99792883819ADBD16123F91F6A9F3F8 /* ImagePrefetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = B48B219E8CC99707DBEA39F8FF5389AA /* ImagePrefetcher.swift */; };\n\t\tF9B63BDA169DB048D41DA8395261AEBA /* DateTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B86B4FEA51A1E51158BB9084C301356 /* DateTransform.swift */; };\n\t\tF9B8AF86D7F4375E5CDE51D06BE78501 /* Zip+Collection.swift in Sources */ = {isa = PBXBuildFile; fileRef = A088E5F2C74178B8F5D416C973214422 /* Zip+Collection.swift */; };\n\t\tFA632862F1071D6B51FC158FA50367D8 /* RxGestureRecognizerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CD9A0FE14A09A30BF80B2ABA5E19488 /* RxGestureRecognizerDelegate.swift */; };\n\t\tFAC3C67720C7E6EF51CCAE58F62645BC /* UIButton+Kingfisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF47A0081987D5825B05757F83159AE9 /* UIButton+Kingfisher.swift */; };\n\t\tFB27B9C1DE7B9384AB45D8BBDECD8034 /* UIAlertAction+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = D69D61C111C8F4287DFE589110A04EA4 /* UIAlertAction+Rx.swift */; };\n\t\tFB640D6E1FCD811D905A620B508C33CE /* BehaviorRelay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A42C76F3823E2EFA148B18E55C8D6B2 /* BehaviorRelay.swift */; };\n\t\tFB9C6242B11049E2F1062D04565E568D /* UIScrollView+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = 5B8B57244416BAE5506E83DFBCCE1F45 /* UIScrollView+MJExtension.m */; };\n\t\tFC66B4AE1897AF442BDFF005497ECF87 /* DelegateProxyType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DA4D4657D80847325EA00819DC11ACD /* DelegateProxyType.swift */; };\n\t\tFCE734BD83FB03D3DC9F8AA843ECD73B /* EnumTransform.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49F4BBE33D9DA445DD902A8A15991A56 /* EnumTransform.swift */; };\n\t\tFD11E5E7BE23D70131359C06A7C63B94 /* Map.swift in Sources */ = {isa = PBXBuildFile; fileRef = 954CE4894A117D9DA14AE5D47A6BAE88 /* Map.swift */; };\n\t\tFD1D0607A2C283A73BF4568A7076EA30 /* TTRangeSlider.m in Sources */ = {isa = PBXBuildFile; fileRef = A46A36F4BF38056EAA48578282F54B60 /* TTRangeSlider.m */; };\n\t\tFD31283E2A43955C5BA6FA9008EE8D7C /* MJRefreshGifHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = C68244972029A1CB9C966D064AB6967F /* MJRefreshGifHeader.m */; };\n\t\tFD99B1C2C751D10EFC95B148A9028316 /* AnimatableSectionModelType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83BF88F0362AAB340061528783A19B27 /* AnimatableSectionModelType.swift */; };\n\t\tFE782FADB39D1A5F08B981F6F7D27726 /* StoryboardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A0CBF488AAC85E03EDD426C11452A46 /* StoryboardView.swift */; };\n\t\tFFE963243CB86C7F5CC3F386683393FA /* GroupBy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A0ECA86834476786492EC1E52EB3E13 /* GroupBy.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t15F1D0A9F74EAF7D407DC563D31027A7 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 844C9B244CEFA2F26288789C423101B4;\n\t\t\tremoteInfo = Differentiator;\n\t\t};\n\t\t1A8E520D805AA6588B14DC77528D8B0F /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 64CC9E274EBD6C16C53FC82EAA6FE9E7;\n\t\t\tremoteInfo = \"NSObject+Rx\";\n\t\t};\n\t\t1B9585FC3126D0BD21B2221D625803E7 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 371551DFD98A9103D43168E4BD0479F0;\n\t\t\tremoteInfo = RxSwift;\n\t\t};\n\t\t23784648AAF575118683F20D78A60594 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 371551DFD98A9103D43168E4BD0479F0;\n\t\t\tremoteInfo = RxSwift;\n\t\t};\n\t\t2ACD2B5E0B881C8AE65F933BD84DB2BB /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 8E38AFA40EB24AAD3998F3F9CFB12CA3;\n\t\t\tremoteInfo = SnapKit;\n\t\t};\n\t\t2BA940D9885781F490DE5D7E8AF779C7 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = E14A62900910444707A5504D25EC98DC;\n\t\t\tremoteInfo = MJRefresh;\n\t\t};\n\t\t338578A6E2DF40FE81DEC3B1372FB4AC /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 0F6A8E28D6C2CC2BCA0477C6AF7137F2;\n\t\t\tremoteInfo = ReactorKit;\n\t\t};\n\t\t3AEB60BF032C5F152E4CCAEF2273CF19 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 371551DFD98A9103D43168E4BD0479F0;\n\t\t\tremoteInfo = RxSwift;\n\t\t};\n\t\t51642FCC15CB2105630B74B65E122C2C /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 371551DFD98A9103D43168E4BD0479F0;\n\t\t\tremoteInfo = RxSwift;\n\t\t};\n\t\t5421BFF2151DBD1E4557434A332B44FF /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 1F5BFD2D8E3672CE19EA16B5208A4066;\n\t\t\tremoteInfo = RxCocoa;\n\t\t};\n\t\t6261BDDB54F9C51D2C747DE59337227D /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 844C9B244CEFA2F26288789C423101B4;\n\t\t\tremoteInfo = Differentiator;\n\t\t};\n\t\t6BF334AD50FD77D652D687BCC4AEE011 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 6F712943B3C5592E82604940D11CE08A;\n\t\t\tremoteInfo = Kingfisher;\n\t\t};\n\t\t6CEBF919355CD7B687C5D986511A3630 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 93FD28A3DC61A9094248D0D96CAD9FD4;\n\t\t\tremoteInfo = SwiftyColor;\n\t\t};\n\t\t80D52ABA9C03D8C4E466A3C2ECC923CF /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 88E9EC28B8B46C3631E6B242B50F4442;\n\t\t\tremoteInfo = Alamofire;\n\t\t};\n\t\t8DE395CD515C5D9F68A4FBEC6D9E49FB /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 1F5BFD2D8E3672CE19EA16B5208A4066;\n\t\t\tremoteInfo = RxCocoa;\n\t\t};\n\t\t9264E39D9FF475826031CA00737738D8 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 88E9EC28B8B46C3631E6B242B50F4442;\n\t\t\tremoteInfo = Alamofire;\n\t\t};\n\t\t9A4961597B182A9A8365503B12A4CC49 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 1C61647CEE01897368F5D0D2CC181DB4;\n\t\t\tremoteInfo = Result;\n\t\t};\n\t\t9B2B284C2F27B08C57FFC9EE798CE2AB /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = E86A9F4C831EEE122A82C7CE19D4011B;\n\t\t\tremoteInfo = TTRangeSlider;\n\t\t};\n\t\t9FCB8BF28633D811B92390B57E58E0F8 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = C76585AF9502709B32A11133189DDA23;\n\t\t\tremoteInfo = URLNavigator;\n\t\t};\n\t\tA2D41E2E3A703CF7EC447F13B1D2D28D /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = C235F77E101E742652CCF98FFDFA5182;\n\t\t\tremoteInfo = IQKeyboardManagerSwift;\n\t\t};\n\t\tA344436CFCCEA3FD967A5C394C074F4A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 1F5BFD2D8E3672CE19EA16B5208A4066;\n\t\t\tremoteInfo = RxCocoa;\n\t\t};\n\t\tA7230AE231CD9B06EE4CDAE3A1068E9D /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 524DC20BC58D4BDA1F0C77763DFA70BE;\n\t\t\tremoteInfo = ReusableKit;\n\t\t};\n\t\tA7D03FCA25AACE15F81E2A98FE9DC3D8 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 371551DFD98A9103D43168E4BD0479F0;\n\t\t\tremoteInfo = RxSwift;\n\t\t};\n\t\tAEB2857C08385E6AA8DBB9F8736DAF9F /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = CD6C9FB6B052E1CF663F8A56041EA163;\n\t\t\tremoteInfo = ObjectMapper;\n\t\t};\n\t\tB40C0E974B9564F38F538252683B1ABC /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 1F5BFD2D8E3672CE19EA16B5208A4066;\n\t\t\tremoteInfo = RxCocoa;\n\t\t};\n\t\tB5DD30A0B9289F764F95945D2D1F8C8B /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = CCEEA2E517C9CB166C75BAF4A263A7CF;\n\t\t\tremoteInfo = TYPagerController;\n\t\t};\n\t\tB6AEA89E672C6C293F8A451E760DC0B9 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = F05F33A12963EC1A726FEE15D9000AE2;\n\t\t\tremoteInfo = RxDataSources;\n\t\t};\n\t\tC1809C26AE9AE581B69F3EBF3020386B /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 371551DFD98A9103D43168E4BD0479F0;\n\t\t\tremoteInfo = RxSwift;\n\t\t};\n\t\tC291EBE2993E897C362199B1BAEEC035 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 88E9EC28B8B46C3631E6B242B50F4442;\n\t\t\tremoteInfo = Alamofire;\n\t\t};\n\t\tC8D1C0BFABDA878088C177C8EE78FF8A /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = D382A7B90B59D72908CC21054785B020;\n\t\t\tremoteInfo = Moya;\n\t\t};\n\t\tD7D399EDABE3916260C38946E0F4CCDD /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = B496A58A7B812A10E0039E15EDF0E8EE;\n\t\t\tremoteInfo = RxGesture;\n\t\t};\n\t\tDCDD2C4EA666E90B5DDFEEBBA1DC5C8F /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 2D5C20681FC0A1E18576D4673D0EFE65;\n\t\t\tremoteInfo = Then;\n\t\t};\n\t\tE09A273BEF2F739232571736BCC24375 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 2166B105EDC9D2499513E6D6BCD586C2;\n\t\t\tremoteInfo = RxAlamofire;\n\t\t};\n\t\tE6C01306761AF7F0DB6473C9C03ECFBD /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = DE874A99677D06A11E5FCC43C238A7D5;\n\t\t\tremoteInfo = SwiftyJSON;\n\t\t};\n\t\tF78D05F575692EA731781B820137FCAC /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 1C61647CEE01897368F5D0D2CC181DB4;\n\t\t\tremoteInfo = Result;\n\t\t};\n\t\tFC9E7142C6CF7EE64F13E5BEE4B234E1 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 0B620384669DABB34C3C5B96EA60F12A;\n\t\t\tremoteInfo = TYCyclePagerView;\n\t\t};\n\t\tFEA62B82099C97A42F3968BAAD232850 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 371551DFD98A9103D43168E4BD0479F0;\n\t\t\tremoteInfo = RxSwift;\n\t\t};\n\t\tFF663F02F48AB40164A87D8914B81DF4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 371551DFD98A9103D43168E4BD0479F0;\n\t\t\tremoteInfo = RxSwift;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t0049E24D8DFDDC0E246DC35576E7DCFB /* MoyaProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MoyaProvider.swift; path = Sources/Moya/MoyaProvider.swift; sourceTree = \"<group>\"; };\n\t\t013A0244BEC843116DF0F443778476C9 /* RxTableViewDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTableViewDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxTableViewDelegateProxy.swift; sourceTree = \"<group>\"; };\n\t\t01974B7A9277DCB1555881FFD8B7A8E1 /* TYCyclePagerView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = TYCyclePagerView.h; path = TYCyclePagerViewDemo/TYCyclePagerView/TYCyclePagerView.h; sourceTree = \"<group>\"; };\n\t\t0197B6C172230E3E4655E94AFC0EFD32 /* RxSearchBarDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxSearchBarDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxSearchBarDelegateProxy.swift; sourceTree = \"<group>\"; };\n\t\t01A8496A2160E940A6246AB063ADFA02 /* UILayoutSupport+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UILayoutSupport+Extensions.swift\"; path = \"Source/UILayoutSupport+Extensions.swift\"; sourceTree = \"<group>\"; };\n\t\t01D96AEEF8ACF586BFC5351394E36F02 /* SwiftyColor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwiftyColor.swift; path = Sources/SwiftyColor.swift; sourceTree = \"<group>\"; };\n\t\t02242206E1BBE2B18A7CA031B7102D98 /* Differentiator.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Differentiator.xcconfig; sourceTree = \"<group>\"; };\n\t\t02ACAB88021BEBB2FCA8B6883F2CE332 /* ConstraintView+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"ConstraintView+Extensions.swift\"; path = \"Source/ConstraintView+Extensions.swift\"; sourceTree = \"<group>\"; };\n\t\t02FA95A68EC5AC5D4C787DD8DAA5C118 /* UIView+MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = \"UIView+MJExtension.h\"; path = \"MJRefresh/UIView+MJExtension.h\"; sourceTree = \"<group>\"; };\n\t\t039485063DF511DC852BBCD65C474C9B /* Timer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timer.swift; path = RxSwift/Observables/Timer.swift; sourceTree = \"<group>\"; };\n\t\t04FE7430ECAF1467968440D35165D54B /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Error.swift; path = RxSwift/Observables/Error.swift; sourceTree = \"<group>\"; };\n\t\t0545D09F28CBBEE994F089B68636507A /* Pods-RxXMLY-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = \"Pods-RxXMLY-acknowledgements.plist\"; sourceTree = \"<group>\"; };\n\t\t0580BE8F6F974685A933A89D8A972BDA /* Bag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Bag.swift; path = Platform/DataStructures/Bag.swift; sourceTree = \"<group>\"; };\n\t\t05D420155A7835B81FCFE92D3FC75464 /* ControlTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ControlTarget.swift; path = RxCocoa/Common/ControlTarget.swift; sourceTree = \"<group>\"; };\n\t\t06147002706BB75CECECA91480E5C0E6 /* ConnectableObservableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConnectableObservableType.swift; path = RxSwift/ConnectableObservableType.swift; sourceTree = \"<group>\"; };\n\t\t0748670A15DF8EB5BA1C623F6B944876 /* MJRefreshFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshFooter.m; path = MJRefresh/Base/MJRefreshFooter.m; sourceTree = \"<group>\"; };\n\t\t0768925949DA79DC0DB78B89D10ECB45 /* ConstraintMakerExtendable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerExtendable.swift; path = Source/ConstraintMakerExtendable.swift; sourceTree = \"<group>\"; };\n\t\t0785C89934FE4C79E378F80B3EAA947F /* Enumerated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Enumerated.swift; path = RxSwift/Observables/Enumerated.swift; sourceTree = \"<group>\"; };\n\t\t07A6E49BDE2308DCA0050930CA050850 /* TYTabPagerBarCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = TYTabPagerBarCell.m; path = TYPagerControllerDemo/TYPagerController/TabPager/TYTabPagerBarCell.m; sourceTree = \"<group>\"; };\n\t\t081D3C3389E6943F023464C1787FDC23 /* RxTableViewDataSourceType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTableViewDataSourceType.swift; path = RxCocoa/iOS/Protocols/RxTableViewDataSourceType.swift; sourceTree = \"<group>\"; };\n\t\t084AF2E51A268DBF8C3B947B137318FC /* Navigator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Navigator.swift; path = Sources/URLNavigator/Navigator.swift; sourceTree = \"<group>\"; };\n\t\t088517E9B0F7ED44CFEB3E14F7379BF5 /* URL+Moya.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"URL+Moya.swift\"; path = \"Sources/Moya/URL+Moya.swift\"; sourceTree = \"<group>\"; };\n\t\t089E5120665D4B93D03D218D3D11C2F1 /* SubjectType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubjectType.swift; path = RxSwift/Subjects/SubjectType.swift; sourceTree = \"<group>\"; };\n\t\t08A296320835E99AA5A0CED018A67A58 /* NSObject+Rx+KVORepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"NSObject+Rx+KVORepresentable.swift\"; path = \"RxCocoa/Foundation/NSObject+Rx+KVORepresentable.swift\"; sourceTree = \"<group>\"; };\n\t\t08D8E58342C1CDB4D227FD9491D0E369 /* TargetType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TargetType.swift; path = Sources/Moya/TargetType.swift; sourceTree = \"<group>\"; };\n\t\t08EF34F0793697F59142C4D8F3A0D159 /* Alamofire-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Alamofire-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t09517CD921BEB56F91C5FA7988170302 /* NSBundle+MJRefresh.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = \"NSBundle+MJRefresh.m\"; path = \"MJRefresh/NSBundle+MJRefresh.m\"; sourceTree = \"<group>\"; };\n\t\t096040CC61B2863666482591D451AA38 /* Just.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Just.swift; path = RxSwift/Observables/Just.swift; sourceTree = \"<group>\"; };\n\t\t0971AB82F462A7C2F67101AD9407905F /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t09B0C33CD96D9A514D7DB3610C6D2F6E /* MJRefreshStateHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshStateHeader.h; path = MJRefresh/Custom/Header/MJRefreshStateHeader.h; sourceTree = \"<group>\"; };\n\t\t0A332DD66083AD9F2BEB500FC7F9B60E /* ObjectMapper-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"ObjectMapper-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\t0A7149E89BECF86F1AE3C3567AB16589 /* MJRefresh.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"wrapper.plug-in\"; name = MJRefresh.bundle; path = MJRefresh/MJRefresh.bundle; sourceTree = \"<group>\"; };\n\t\t0A81EC5AF3F05041AE6EB4193B2BFEE3 /* SerialDispatchQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SerialDispatchQueueScheduler.swift; path = RxSwift/Schedulers/SerialDispatchQueueScheduler.swift; sourceTree = \"<group>\"; };\n\t\t0A8EF0EB23267E967663F5FA5A8E7686 /* RxSwift.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RxSwift.xcconfig; sourceTree = \"<group>\"; };\n\t\t0B86B4FEA51A1E51158BB9084C301356 /* DateTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateTransform.swift; path = Sources/DateTransform.swift; sourceTree = \"<group>\"; };\n\t\t0BF26D84DAD5A55C5E5BE6A0660FAEEF /* Array+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"Array+Extensions.swift\"; path = \"Sources/RxDataSources/Array+Extensions.swift\"; sourceTree = \"<group>\"; };\n\t\t0BF9B78A8693992A08F4F159CCDE50CA /* MJRefreshBackStateFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackStateFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m; sourceTree = \"<group>\"; };\n\t\t0C40C05B2CC135DAAF345CD1E46FE065 /* ObservableType+PrimitiveSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"ObservableType+PrimitiveSequence.swift\"; path = \"RxSwift/Traits/ObservableType+PrimitiveSequence.swift\"; sourceTree = \"<group>\"; };\n\t\t0D076E9D89814329C802E72B0C0229A2 /* MJRefreshAutoNormalFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoNormalFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.m; sourceTree = \"<group>\"; };\n\t\t0D21901F32D924DB95300B2C650103E1 /* Multicast.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Multicast.swift; path = RxSwift/Observables/Multicast.swift; sourceTree = \"<group>\"; };\n\t\t0D231836443906AF664DE2289F32D387 /* SingleAsync.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SingleAsync.swift; path = RxSwift/Observables/SingleAsync.swift; sourceTree = \"<group>\"; };\n\t\t0D305720CFFC3323166DEE86CAF9341B /* Sink.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sink.swift; path = RxSwift/Observables/Sink.swift; sourceTree = \"<group>\"; };\n\t\t0D8A0052E8AA49DDD883B85DEA3F90EF /* ThreadHelper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ThreadHelper.swift; path = Sources/ThreadHelper.swift; sourceTree = \"<group>\"; };\n\t\t0E5085F3C34DD0D51CCDC43343115505 /* TYPagerView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = TYPagerView.h; path = TYPagerControllerDemo/TYPagerController/TYPagerView.h; sourceTree = \"<group>\"; };\n\t\t0E5F9481F27654B03C1A5A056D8909FB /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };\n\t\t0E79B5AC02467F0FC951B7F0808BE955 /* RxCocoa-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"RxCocoa-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t0F27A8AA53C280B6DF033E2515D7A2E9 /* TYTabPagerBar.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = TYTabPagerBar.h; path = TYPagerControllerDemo/TYPagerController/TabPager/TYTabPagerBar.h; sourceTree = \"<group>\"; };\n\t\t0F46744125C99B20BDE8928C9D91767D /* View+RxGesture.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"View+RxGesture.swift\"; path = \"Pod/Classes/View+RxGesture.swift\"; sourceTree = \"<group>\"; };\n\t\t1003DE1B3A476A1579EADFC5DEE4DC09 /* ObserverBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserverBase.swift; path = RxSwift/Observers/ObserverBase.swift; sourceTree = \"<group>\"; };\n\t\t1039A64D7973971C931057162135E4B5 /* ObjectMapper-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"ObjectMapper-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t10DC35A2E29CA2B46E24A2F022E9163B /* ConstraintItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintItem.swift; path = Source/ConstraintItem.swift; sourceTree = \"<group>\"; };\n\t\t115F5111E88B41835988258D0B9D90F2 /* Operators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Operators.swift; path = Sources/Operators.swift; sourceTree = \"<group>\"; };\n\t\t118F0C07C32E76EF6489509A4F07F50B /* MJRefreshComponent.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshComponent.m; path = MJRefresh/Base/MJRefreshComponent.m; sourceTree = \"<group>\"; };\n\t\t125CF19DCF28A39EC761EA281EBBC44B /* Plugin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Plugin.swift; path = Sources/Moya/Plugin.swift; sourceTree = \"<group>\"; };\n\t\t12F89941B737495BB6B9D65D0A940759 /* IQKeyboardManagerConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardManagerConstants.swift; path = IQKeyboardManagerSwift/Constants/IQKeyboardManagerConstants.swift; sourceTree = \"<group>\"; };\n\t\t137E979916631AD9ACADADEEEBBBAE5B /* SubscribeOn.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscribeOn.swift; path = RxSwift/Observables/SubscribeOn.swift; sourceTree = \"<group>\"; };\n\t\t14223DB3BAAFC3650B856F3ED4CA3293 /* Merge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Merge.swift; path = RxSwift/Observables/Merge.swift; sourceTree = \"<group>\"; };\n\t\t14D38200F2B2C8E328B6E393A63B99D2 /* Pods-RxXMLY-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = \"Pods-RxXMLY-frameworks.sh\"; sourceTree = \"<group>\"; };\n\t\t14F1C5DE23CD40C00D675D81FDE24A5E /* RxAlamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxAlamofire.swift; path = Sources/RxAlamofire.swift; sourceTree = \"<group>\"; };\n\t\t1530F4900EF841B8D75AB4AFA41076FB /* InfiniteSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InfiniteSequence.swift; path = Platform/DataStructures/InfiniteSequence.swift; sourceTree = \"<group>\"; };\n\t\t1555063617BFE21D0E44B5255EA230FE /* MoyaProvider+Defaults.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"MoyaProvider+Defaults.swift\"; path = \"Sources/Moya/MoyaProvider+Defaults.swift\"; sourceTree = \"<group>\"; };\n\t\t155A351F30BA1128E99E067F81CB72B2 /* IQToolbar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQToolbar.swift; path = IQKeyboardManagerSwift/IQToolbar/IQToolbar.swift; sourceTree = \"<group>\"; };\n\t\t1599175E64562E7F65DC8ECDF4F4E69D /* RxTableViewSectionedAnimatedDataSource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTableViewSectionedAnimatedDataSource.swift; path = Sources/RxDataSources/RxTableViewSectionedAnimatedDataSource.swift; sourceTree = \"<group>\"; };\n\t\t16A6BD5743A5A18E98F1E4D0B05E9282 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t1778148BC4EB285B75595B087B8FC931 /* Queue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Queue.swift; path = Platform/DataStructures/Queue.swift; sourceTree = \"<group>\"; };\n\t\t17CB2FA1178A4F2E225AE19BEFEB3B81 /* Pods-RxXMLY-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Pods-RxXMLY-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\t17F817A4133AB7260E9700802CE54631 /* Platform.Darwin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Darwin.swift; path = Platform/Platform.Darwin.swift; sourceTree = \"<group>\"; };\n\t\t18601CAC220AFC4C4A67E4C19A37FA0C /* TTRangeSlider-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"TTRangeSlider-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\t187ACC537834C3D22473C47D21364850 /* Notifications.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Notifications.swift; path = Source/Notifications.swift; sourceTree = \"<group>\"; };\n\t\t188117C123963623C4A723C6D908FDF6 /* ReusableKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReusableKit.swift; path = Sources/ReusableKit/ReusableKit.swift; sourceTree = \"<group>\"; };\n\t\t18A31C1EE5C5A400DA67610DDECCBD49 /* CombineLatest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CombineLatest.swift; path = RxSwift/Observables/CombineLatest.swift; sourceTree = \"<group>\"; };\n\t\t195D6043A1C7C9E2F93F03BF5A6C765E /* ReactorKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ReactorKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t1A0CBF488AAC85E03EDD426C11452A46 /* StoryboardView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StoryboardView.swift; path = Sources/ReactorKit/StoryboardView.swift; sourceTree = \"<group>\"; };\n\t\t1A0EE75F34E2C1B1E6254873E3066CEA /* MJRefreshAutoGifFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoGifFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.h; sourceTree = \"<group>\"; };\n\t\t1B3623F446EB11D7EE2B1A505A7B1E5F /* UISlider+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UISlider+Rx.swift\"; path = \"RxCocoa/iOS/UISlider+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t1B6E2178443AA8FE2901D19303B3B8F9 /* ConstraintMultiplierTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMultiplierTarget.swift; path = Source/ConstraintMultiplierTarget.swift; sourceTree = \"<group>\"; };\n\t\t1BC61193B3F56535040C0A61FA71C455 /* ReactorKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"ReactorKit-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\t1BCF16201BDE699E2122416B0D2FBD6E /* ConcurrentMainScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConcurrentMainScheduler.swift; path = RxSwift/Schedulers/ConcurrentMainScheduler.swift; sourceTree = \"<group>\"; };\n\t\t1BFCDA5713A7916617594A7D5B7BB187 /* TYPagerViewLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = TYPagerViewLayout.m; path = TYPagerControllerDemo/TYPagerController/TYPagerViewLayout.m; sourceTree = \"<group>\"; };\n\t\t1C02566F282B7374FFE638BE27D65EBC /* NetworkActivityPlugin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkActivityPlugin.swift; path = Sources/Moya/Plugins/NetworkActivityPlugin.swift; sourceTree = \"<group>\"; };\n\t\t1C458E0D7CD6F0DD83AC852BC8419AD7 /* ConstraintRelation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintRelation.swift; path = Source/ConstraintRelation.swift; sourceTree = \"<group>\"; };\n\t\t1C719E3ABA8B6DE4B326AD2FF6313BA2 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; };\n\t\t1C74C02A940DA7E7A70BFF3EDB096E49 /* Reactor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Reactor.swift; path = Sources/ReactorKit/Reactor.swift; sourceTree = \"<group>\"; };\n\t\t1C7E38D158EEE0908532959AA8DCB439 /* MJRefreshConst.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshConst.h; path = MJRefresh/MJRefreshConst.h; sourceTree = \"<group>\"; };\n\t\t1CB7A49991CF5D7E632585BCFD130C56 /* RxDataSources.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"sourcecode.module-map\"; path = RxDataSources.modulemap; sourceTree = \"<group>\"; };\n\t\t1CD95565DA23CF770293505264420AE0 /* Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Alamofire.swift; path = Source/Alamofire.swift; sourceTree = \"<group>\"; };\n\t\t1D315F44377FFD3AEDE15898C2971BEC /* Debugging.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debugging.swift; path = Source/Debugging.swift; sourceTree = \"<group>\"; };\n\t\t1D3CBDD7BD1351D05617EDFD0171017D /* String+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"String+Rx.swift\"; path = \"RxSwift/Extensions/String+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t1DB825CD3DE4C8C88F1EB6E75E3046B2 /* SwiftSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwiftSupport.swift; path = RxSwift/SwiftSupport/SwiftSupport.swift; sourceTree = \"<group>\"; };\n\t\t1E1DF457C00960360E254419271FA76F /* Kingfisher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Kingfisher.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t1E49107D99771943128C7B1A58B2781A /* Map.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Map.swift; path = Sources/Map.swift; sourceTree = \"<group>\"; };\n\t\t1EE2A49804E43DA5A796136D1D79109F /* Typealiases.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Typealiases.swift; path = Source/Typealiases.swift; sourceTree = \"<group>\"; };\n\t\t1EF8AC35D0E53603F8A97DBBE9FA33E2 /* IQUIView+Hierarchy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"IQUIView+Hierarchy.swift\"; path = \"IQKeyboardManagerSwift/Categories/IQUIView+Hierarchy.swift\"; sourceTree = \"<group>\"; };\n\t\t1F5B9A2F08507775E806FE12ED90BAF6 /* TYPagerController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = TYPagerController.m; path = TYPagerControllerDemo/TYPagerController/TYPagerController.m; sourceTree = \"<group>\"; };\n\t\t1F80E196EA77F97C6AA8A3D2410BFE76 /* Take.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Take.swift; path = RxSwift/Observables/Take.swift; sourceTree = \"<group>\"; };\n\t\t1FA2A35E8B50492B40B48AC0A94A8904 /* ConstraintMakerRelatable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerRelatable.swift; path = Source/ConstraintMakerRelatable.swift; sourceTree = \"<group>\"; };\n\t\t203840BDEB077FAE0820685734949691 /* MJRefreshHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshHeader.m; path = MJRefresh/Base/MJRefreshHeader.m; sourceTree = \"<group>\"; };\n\t\t2056BF365D2D7CC0FD46ED19EDBEE823 /* SectionModelType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SectionModelType.swift; path = Sources/Differentiator/SectionModelType.swift; sourceTree = \"<group>\"; };\n\t\t20735E206ED10BEE6B25EC79F4DB6BFA /* AnimatedImageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnimatedImageView.swift; path = Sources/AnimatedImageView.swift; sourceTree = \"<group>\"; };\n\t\t20CECB0BD149F46C10733B4F2D2D92DC /* NopDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NopDisposable.swift; path = RxSwift/Disposables/NopDisposable.swift; sourceTree = \"<group>\"; };\n\t\t20D269397D68987A4E3F571B01394F0E /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = RxSwift/Observables/Filter.swift; sourceTree = \"<group>\"; };\n\t\t20DFDFC714EBFF20FC56B6534173B322 /* SharedSequence+Operators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"SharedSequence+Operators.swift\"; path = \"RxCocoa/Traits/SharedSequence/SharedSequence+Operators.swift\"; sourceTree = \"<group>\"; };\n\t\t2135AEA738411503ADADD4D2497AA4E6 /* TTRangeSlider.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TTRangeSlider.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t21805A4E1E5079259A7A86A6D073E71B /* Alamofire-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Alamofire-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\t222AACF264926205DACCB10D9C8464D7 /* ConstraintMakerEditable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerEditable.swift; path = Source/ConstraintMakerEditable.swift; sourceTree = \"<group>\"; };\n\t\t223F91E90B67ADF004A7E4543864C0E4 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t22B5011A39DF5849503132CEE075CC1E /* TYTabPagerView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = TYTabPagerView.h; path = TYPagerControllerDemo/TYPagerController/TabPager/TYTabPagerView.h; sourceTree = \"<group>\"; };\n\t\t236D0EC42AF18C98E4FFEB08963E7C51 /* FromJSON.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FromJSON.swift; path = Sources/FromJSON.swift; sourceTree = \"<group>\"; };\n\t\t2382EF1B0260B04756F14D3A5B99D192 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t23859CF12D4131E1E0B8B0209A00B878 /* MJRefreshAutoFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoFooter.m; path = MJRefresh/Base/MJRefreshAutoFooter.m; sourceTree = \"<group>\"; };\n\t\t23E72118C85ED536830E63BFEF402950 /* Debounce.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debounce.swift; path = RxSwift/Observables/Debounce.swift; sourceTree = \"<group>\"; };\n\t\t23FEC5DC4D59BF5FF4FE6E5DE5CF64BC /* DisposeBag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DisposeBag.swift; path = RxSwift/Disposables/DisposeBag.swift; sourceTree = \"<group>\"; };\n\t\t24B87BC6C657291DEE2644EFCB9CA341 /* TYTabPagerController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = TYTabPagerController.m; path = TYPagerControllerDemo/TYPagerController/TabPager/TYTabPagerController.m; sourceTree = \"<group>\"; };\n\t\t2534A262C08145CCB9C56D17DB32573D /* _RXDelegateProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RXDelegateProxy.h; path = RxCocoa/Runtime/include/_RXDelegateProxy.h; sourceTree = \"<group>\"; };\n\t\t25A0BA6CC0B9439AAC6261DC60D7AE1C /* UITabBarController+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UITabBarController+Rx.swift\"; path = \"RxCocoa/iOS/UITabBarController+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t26530B988040DFAD1200285B6F15D492 /* Concat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Concat.swift; path = RxSwift/Observables/Concat.swift; sourceTree = \"<group>\"; };\n\t\t266FFDCA364C275317DA17C75FA9B1B3 /* Result.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Result.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t268594CEB578B4D18F4F1B30652F617B /* URLNavigator.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = URLNavigator.xcconfig; sourceTree = \"<group>\"; };\n\t\t272D79A04BED524CBED07D2B4EC99B49 /* AsyncSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsyncSubject.swift; path = RxSwift/Subjects/AsyncSubject.swift; sourceTree = \"<group>\"; };\n\t\t280D08DD70717640589F62EB1F6FD19B /* CombineLatest+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"CombineLatest+arity.swift\"; path = \"RxSwift/Observables/CombineLatest+arity.swift\"; sourceTree = \"<group>\"; };\n\t\t28C85F1DBF1BC0BBAE450D1FBEA54A9F /* URLConvertible.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLConvertible.swift; path = Sources/URLMatcher/URLConvertible.swift; sourceTree = \"<group>\"; };\n\t\t28FD4835CF32D5E0B1A2A3753A09DBB0 /* Moya.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Moya.xcconfig; sourceTree = \"<group>\"; };\n\t\t298536EB0ACF540DC4DC34F019837D74 /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Image.swift; path = Sources/Moya/Image.swift; sourceTree = \"<group>\"; };\n\t\t2988A2FCCBF291E4BEAC7F8D9AD45A9F /* UIViewControllerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIViewControllerType.swift; path = Sources/URLNavigator/UIViewControllerType.swift; sourceTree = \"<group>\"; };\n\t\t29C099BC759B6B4145E48DE537580E13 /* Throttle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Throttle.swift; path = RxSwift/Observables/Throttle.swift; sourceTree = \"<group>\"; };\n\t\t2A9BB47909385E153DEAF4820584660C /* Window.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Window.swift; path = RxSwift/Observables/Window.swift; sourceTree = \"<group>\"; };\n\t\t2B34630D7EB0A587B97952108987DB65 /* Observable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Observable.swift; path = RxSwift/Observable.swift; sourceTree = \"<group>\"; };\n\t\t2B88F0CF34C9C21FA5FACA8A0692AA4A /* Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deprecated.swift; path = RxCocoa/Deprecated.swift; sourceTree = \"<group>\"; };\n\t\t2C114C6520E1FE3996B0B360BF559199 /* IQPreviousNextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQPreviousNextView.swift; path = IQKeyboardManagerSwift/IQToolbar/IQPreviousNextView.swift; sourceTree = \"<group>\"; };\n\t\t2CE37D8A7C1180573189B3F4D4D5D2A0 /* TaskDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TaskDelegate.swift; path = Source/TaskDelegate.swift; sourceTree = \"<group>\"; };\n\t\t2D2C96C6D5355207398C46C9E66386BE /* RxSwift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"RxSwift-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t2D6D95EA842EF7D1BFA6D8191AAE620B /* Repeat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Repeat.swift; path = RxSwift/Observables/Repeat.swift; sourceTree = \"<group>\"; };\n\t\t2D9BD6B28993FCB68120C1EE96813B72 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t2DEC3152A51E8F66A48451B7A4EC9704 /* _RXDelegateProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RXDelegateProxy.m; path = RxCocoa/Runtime/_RXDelegateProxy.m; sourceTree = \"<group>\"; };\n\t\t2E647F479FFCF502B2E7DF9A363BE038 /* URLPatchComponentMatchResult.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLPatchComponentMatchResult.swift; path = Sources/URLMatcher/URLPatchComponentMatchResult.swift; sourceTree = \"<group>\"; };\n\t\t2F1C6F4433BDCCAB44D788A1B10A5011 /* TableViewSectionedDataSource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TableViewSectionedDataSource.swift; path = Sources/RxDataSources/TableViewSectionedDataSource.swift; sourceTree = \"<group>\"; };\n\t\t2F8F22838BEB780C855A8033AE7ED2A4 /* UIViewController+TopMostViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIViewController+TopMostViewController.swift\"; path = \"Sources/URLNavigator/UIViewController+TopMostViewController.swift\"; sourceTree = \"<group>\"; };\n\t\t2F954956863F74706AA3A395F8401F14 /* Zip.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Zip.swift; path = RxSwift/Observables/Zip.swift; sourceTree = \"<group>\"; };\n\t\t2F9BB5EBA26D7BF9CA0C3B21B1AAD9EE /* MoyaError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MoyaError.swift; path = Sources/Moya/MoyaError.swift; sourceTree = \"<group>\"; };\n\t\t2FA6CC0C558EDC9E6881C22246E9E059 /* AsSingle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsSingle.swift; path = RxSwift/Observables/AsSingle.swift; sourceTree = \"<group>\"; };\n\t\t2FD006214C2E7016C83E906BBB4CD624 /* Then.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"sourcecode.module-map\"; path = Then.modulemap; sourceTree = \"<group>\"; };\n\t\t2FF3BD6C6FED1A57B6B88C3F0EFEB6A3 /* FloatingPointType+IdentifiableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"FloatingPointType+IdentifiableType.swift\"; path = \"Sources/RxDataSources/FloatingPointType+IdentifiableType.swift\"; sourceTree = \"<group>\"; };\n\t\t306015976D0F37EFAC711062A258D8E9 /* URLPathComponent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLPathComponent.swift; path = Sources/URLMatcher/URLPathComponent.swift; sourceTree = \"<group>\"; };\n\t\t30C22B352D9B240DC40532BF2241C498 /* SkipUntil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SkipUntil.swift; path = RxSwift/Observables/SkipUntil.swift; sourceTree = \"<group>\"; };\n\t\t30D68DEE1421B7ED892C4E0B33E9CC35 /* PriorityQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PriorityQueue.swift; path = Platform/DataStructures/PriorityQueue.swift; sourceTree = \"<group>\"; };\n\t\t313319FF55255C3736F46998BCDF7F8A /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; };\n\t\t319F0938C83A11D7010E8A6B1A8BC27E /* ReactorKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ReactorKit.xcconfig; sourceTree = \"<group>\"; };\n\t\t328686532CB38406B7BB3A32945B6474 /* ConstraintRelatableTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintRelatableTarget.swift; path = Source/ConstraintRelatableTarget.swift; sourceTree = \"<group>\"; };\n\t\t32D7A430AD912A7D4AEE013B35DE2741 /* NSObject+Rx.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"sourcecode.module-map\"; path = \"NSObject+Rx.modulemap\"; sourceTree = \"<group>\"; };\n\t\t332E6B6D83344EA6F35D0681ADEAD1A7 /* Amb.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Amb.swift; path = RxSwift/Observables/Amb.swift; sourceTree = \"<group>\"; };\n\t\t339F05AA6561AB55D443E3626724120A /* RxCocoa.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RxCocoa.h; path = RxCocoa/RxCocoa.h; sourceTree = \"<group>\"; };\n\t\t346F9291AC0BA83FB7B3962FC7F73267 /* PublishRelay.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PublishRelay.swift; path = RxCocoa/Traits/PublishRelay.swift; sourceTree = \"<group>\"; };\n\t\t347D8CF191232FE2DBCADBECC8AB9A5F /* Kingfisher-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"Kingfisher-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t348D24C7C0138AD0B581B484EA58AD8B /* String+MD5.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"String+MD5.swift\"; path = \"Sources/String+MD5.swift\"; sourceTree = \"<group>\"; };\n\t\t34903204D85860DD93734C3981A9900D /* RxAlamofire-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"RxAlamofire-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t351865278BBE506A2B088B8755AD46BD /* Sample.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sample.swift; path = RxSwift/Observables/Sample.swift; sourceTree = \"<group>\"; };\n\t\t351B9B4056B3818966E04C76590FC3B7 /* RxCocoa.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RxCocoa.xcconfig; sourceTree = \"<group>\"; };\n\t\t3565F6A3B549B0D54D7B9937CBDF22F5 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t36B939D525A7B01D959ECFCBDE9C0550 /* Kingfisher-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Kingfisher-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\t36C41A4EDAFACF2FCF4214E703CD5C47 /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Result/Result.swift; sourceTree = \"<group>\"; };\n\t\t36DC95F95B0777638C99DDB71789CF16 /* DispatchQueueConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DispatchQueueConfiguration.swift; path = RxSwift/Schedulers/Internal/DispatchQueueConfiguration.swift; sourceTree = \"<group>\"; };\n\t\t36F99765559218EBDA04ED80AEF34EB9 /* Pods-RxXMLY.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"sourcecode.module-map\"; path = \"Pods-RxXMLY.modulemap\"; sourceTree = \"<group>\"; };\n\t\t3771D2D60EF94F8BBA0E912C27A80D24 /* RxTextViewDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTextViewDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxTextViewDelegateProxy.swift; sourceTree = \"<group>\"; };\n\t\t3795E84704A9198DC6E04FB5A7227CCA /* View.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = View.swift; path = Sources/ReactorKit/View.swift; sourceTree = \"<group>\"; };\n\t\t383DA86E343CBA75A7B8574AB75E1A1B /* RecursiveScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecursiveScheduler.swift; path = RxSwift/Schedulers/RecursiveScheduler.swift; sourceTree = \"<group>\"; };\n\t\t385C967E6D18858D5311CA87A4205434 /* ReactorKitRuntime.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ReactorKitRuntime.h; path = Sources/ReactorKitRuntime/include/ReactorKitRuntime.h; sourceTree = \"<group>\"; };\n\t\t387296DC1983BFD653D558D678637B29 /* RxSwift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"RxSwift-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\t38B56F8F2AC8700738ABD303DD4F3606 /* MJRefreshAutoFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoFooter.h; path = MJRefresh/Base/MJRefreshAutoFooter.h; sourceTree = \"<group>\"; };\n\t\t397F2D1B6C0CB8DEFA63186BB12618B2 /* ElementAt.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ElementAt.swift; path = RxSwift/Observables/ElementAt.swift; sourceTree = \"<group>\"; };\n\t\t3A098FD7778F9B758BBC03971A34449C /* SchedulerServices+Emulation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"SchedulerServices+Emulation.swift\"; path = \"RxSwift/Schedulers/SchedulerServices+Emulation.swift\"; sourceTree = \"<group>\"; };\n\t\t3B157B779C8184526F0932ECBA9879A9 /* TransformGestureRecognizers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransformGestureRecognizers.swift; path = Pod/Classes/iOS/TransformGestureRecognizers.swift; sourceTree = \"<group>\"; };\n\t\t3BB1570E1320634AB029069C7CA04D40 /* Buffer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Buffer.swift; path = RxSwift/Observables/Buffer.swift; sourceTree = \"<group>\"; };\n\t\t3BEAA51E3D065BAC60F1B85CBB1F26D5 /* NSObject+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"NSObject+Rx.swift\"; path = \"RxCocoa/Foundation/NSObject+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t3BEF595F5CDFC591D3F78073BECD08C6 /* RxDataSources-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"RxDataSources-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t3BF627D8C19D8504043EEDE55963F4BA /* UIScrollView+MJRefresh.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = \"UIScrollView+MJRefresh.m\"; path = \"MJRefresh/UIScrollView+MJRefresh.m\"; sourceTree = \"<group>\"; };\n\t\t3CCA6ED6120DA770AB86F564EEAC46DB /* Optional.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Optional.swift; path = RxSwift/Observables/Optional.swift; sourceTree = \"<group>\"; };\n\t\t3D11C85C7F13C6D98A3A465BC90BAD5C /* Utilities.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Utilities.swift; path = Sources/Differentiator/Utilities.swift; sourceTree = \"<group>\"; };\n\t\t3D450DFC0A437B3075E6E68C0FA1A2B3 /* Indicator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Indicator.swift; path = Sources/Indicator.swift; sourceTree = \"<group>\"; };\n\t\t3DA4D4657D80847325EA00819DC11ACD /* DelegateProxyType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelegateProxyType.swift; path = RxCocoa/Common/DelegateProxyType.swift; sourceTree = \"<group>\"; };\n\t\t3E00F875EA38811C01C6F56B33214C42 /* Moya.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Moya.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t3E6B1DB2C5390EA79CEFCA5BAC709AFF /* Generate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Generate.swift; path = RxSwift/Observables/Generate.swift; sourceTree = \"<group>\"; };\n\t\t3E96DBA0FB443524D03EAA0B1907D6DF /* SnapKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"sourcecode.module-map\"; path = SnapKit.modulemap; sourceTree = \"<group>\"; };\n\t\t3EEF0C4EECF8525D00D4B8CF83ED7D3E /* ObservableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObservableType.swift; path = RxSwift/ObservableType.swift; sourceTree = \"<group>\"; };\n\t\t3F697E60BD60ED1A4604DA7BF8581AB1 /* Pods-RxXMLY.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-RxXMLY.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t3F99F2A0C1CCF46EC645BA9E65F78200 /* IQTitleBarButtonItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTitleBarButtonItem.swift; path = IQKeyboardManagerSwift/IQToolbar/IQTitleBarButtonItem.swift; sourceTree = \"<group>\"; };\n\t\t404B3E0121644CBA834D592A1EB4E364 /* InfiniteSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InfiniteSequence.swift; path = Platform/DataStructures/InfiniteSequence.swift; sourceTree = \"<group>\"; };\n\t\t4086B02C434EDF398B3DEAC9194E36E9 /* ConstraintLayoutGuide.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutGuide.swift; path = Source/ConstraintLayoutGuide.swift; sourceTree = \"<group>\"; };\n\t\t40B36A7D5D671C2D2DCB124A4EE87A87 /* MJRefreshAutoNormalFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoNormalFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.h; sourceTree = \"<group>\"; };\n\t\t40C89EACDC9DB733AEDA2C1858349B05 /* ObjectMapper.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ObjectMapper.xcconfig; sourceTree = \"<group>\"; };\n\t\t41B3ACB613105C496C9AA802C306A439 /* RxGesture.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RxGesture.xcconfig; sourceTree = \"<group>\"; };\n\t\t41DF1FD6C9D2BDC29A48989F838D1ECD /* SectionedViewDataSourceType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SectionedViewDataSourceType.swift; path = RxCocoa/Common/SectionedViewDataSourceType.swift; sourceTree = \"<group>\"; };\n\t\t424B56D99302A846FFD60288ED3225A3 /* ConstraintMaker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMaker.swift; path = Source/ConstraintMaker.swift; sourceTree = \"<group>\"; };\n\t\t4284532690122048902F462ECE7D36F5 /* RxPickerViewDataSourceProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxPickerViewDataSourceProxy.swift; path = RxCocoa/iOS/Proxies/RxPickerViewDataSourceProxy.swift; sourceTree = \"<group>\"; };\n\t\t42A26062E1F6F9B2A5BC508EA3D00288 /* ToJSON.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ToJSON.swift; path = Sources/ToJSON.swift; sourceTree = \"<group>\"; };\n\t\t42F0AF2A7F102777266AB6FFCA689615 /* ViewTransition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ViewTransition.swift; path = Sources/RxDataSources/ViewTransition.swift; sourceTree = \"<group>\"; };\n\t\t430B138602CD2D328367A37FEE11E65F /* URLNavigator.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = URLNavigator.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t434BF576D15902B83DA5D893260FA1D6 /* ConstraintLayoutGuideDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutGuideDSL.swift; path = Source/ConstraintLayoutGuideDSL.swift; sourceTree = \"<group>\"; };\n\t\t43F0F183E8964F9C8D16E30F45CF6844 /* MJRefreshBackGifFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackGifFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.m; sourceTree = \"<group>\"; };\n\t\t44409A050584D330FC1B6F6D3CD9B53E /* MJRefreshAutoStateFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshAutoStateFooter.h; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.h; sourceTree = \"<group>\"; };\n\t\t4497D98DB94E983018E6F6C2A4DBAF68 /* Empty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Empty.swift; path = RxSwift/Observables/Empty.swift; sourceTree = \"<group>\"; };\n\t\t44D999B360E6504760FF4A8DD2CB17A1 /* RxMutableBox.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxMutableBox.swift; path = RxSwift/RxMutableBox.swift; sourceTree = \"<group>\"; };\n\t\t459BCD44D36BC348042325F44BD78250 /* ItemPath.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ItemPath.swift; path = Sources/Differentiator/ItemPath.swift; sourceTree = \"<group>\"; };\n\t\t4602CBFEB0FDD72D7A2FF806152CFC81 /* RxNavigationControllerDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxNavigationControllerDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxNavigationControllerDelegateProxy.swift; sourceTree = \"<group>\"; };\n\t\t4629139792CEE6CCF32F59002002790D /* RxCocoa.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"sourcecode.module-map\"; path = RxCocoa.modulemap; sourceTree = \"<group>\"; };\n\t\t465C09D0B89915A2BF9E8EE9623D1080 /* Moya-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Moya-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t46E1355C3CBDC013D697081398F8B462 /* ConstraintLayoutGuide+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"ConstraintLayoutGuide+Extensions.swift\"; path = \"Source/ConstraintLayoutGuide+Extensions.swift\"; sourceTree = \"<group>\"; };\n\t\t4761B90E528EAB72D76DD1A76777354E /* Alamofire.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"sourcecode.module-map\"; path = Alamofire.modulemap; sourceTree = \"<group>\"; };\n\t\t4773B687AFC9012C6545F9C30E80356F /* UISwitch+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UISwitch+Rx.swift\"; path = \"RxCocoa/iOS/UISwitch+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t47C651CFF068171CF1C1237A69E7D99A /* Diff.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Diff.swift; path = Sources/Differentiator/Diff.swift; sourceTree = \"<group>\"; };\n\t\t47F3ADD7515A562BFBBBB8888ADA3090 /* HistoricalScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HistoricalScheduler.swift; path = RxSwift/Schedulers/HistoricalScheduler.swift; sourceTree = \"<group>\"; };\n\t\t4896403B4FA72B445E17270A138939D3 /* HasDisposeBag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = HasDisposeBag.swift; sourceTree = \"<group>\"; };\n\t\t4914A9BB07C4CB2A6DDD5D0096A0BE87 /* Reduce.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Reduce.swift; path = RxSwift/Observables/Reduce.swift; sourceTree = \"<group>\"; };\n\t\t49461972A7736ED5C10EA776E946211B /* Disposables.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disposables.swift; path = RxSwift/Disposables/Disposables.swift; sourceTree = \"<group>\"; };\n\t\t495C0C539FEC03003AFB93904736DE91 /* Cancelable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Cancelable.swift; path = RxSwift/Cancelable.swift; sourceTree = \"<group>\"; };\n\t\t49DA791DE895721812C9EB83583324F0 /* URLMatchResult.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLMatchResult.swift; path = Sources/URLMatcher/URLMatchResult.swift; sourceTree = \"<group>\"; };\n\t\t49F4BBE33D9DA445DD902A8A15991A56 /* EnumTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EnumTransform.swift; path = Sources/EnumTransform.swift; sourceTree = \"<group>\"; };\n\t\t4A42C76F3823E2EFA148B18E55C8D6B2 /* BehaviorRelay.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BehaviorRelay.swift; path = RxCocoa/Traits/BehaviorRelay.swift; sourceTree = \"<group>\"; };\n\t\t4A6B64332C20EFFA0F9444871E3166E2 /* ConstraintDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDSL.swift; path = Source/ConstraintDSL.swift; sourceTree = \"<group>\"; };\n\t\t4C08FCDD6B32CEDDEA0C67B874CFF29A /* Mappable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Mappable.swift; path = Sources/Mappable.swift; sourceTree = \"<group>\"; };\n\t\t4C13EACC6D3C59A28B692EFB2DB14F6E /* RxCollectionViewDataSourceProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCollectionViewDataSourceProxy.swift; path = RxCocoa/iOS/Proxies/RxCollectionViewDataSourceProxy.swift; sourceTree = \"<group>\"; };\n\t\t4C467041F0E9683A1B964FB3053EFBD7 /* TYCyclePagerView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"sourcecode.module-map\"; path = TYCyclePagerView.modulemap; sourceTree = \"<group>\"; };\n\t\t4CB47246A17CA14228A79384E13C42EC /* CredentialsPlugin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CredentialsPlugin.swift; path = Sources/Moya/Plugins/CredentialsPlugin.swift; sourceTree = \"<group>\"; };\n\t\t4CE22F0C823232387AAE225F52265246 /* BooleanDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BooleanDisposable.swift; path = RxSwift/Disposables/BooleanDisposable.swift; sourceTree = \"<group>\"; };\n\t\t4CF8C44E75B472322D8DC2B86B893ED9 /* SkipWhile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SkipWhile.swift; path = RxSwift/Observables/SkipWhile.swift; sourceTree = \"<group>\"; };\n\t\t4D3E83D571BF2E77162C09F72FD66D3C /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = Sources/Filter.swift; sourceTree = \"<group>\"; };\n\t\t4D811B382CEAC4FADDA971AFE90AD50A /* CustomDateFormatTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CustomDateFormatTransform.swift; path = Sources/CustomDateFormatTransform.swift; sourceTree = \"<group>\"; };\n\t\t4DBD4CA78A84FE60982AF0780EC62DD2 /* SwiftyJSON.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwiftyJSON.swift; path = Source/SwiftyJSON.swift; sourceTree = \"<group>\"; };\n\t\t4DCA82E849FDD3356D44EC7B8EE2BA84 /* SchedulerType+SharedSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"SchedulerType+SharedSequence.swift\"; path = \"RxCocoa/Traits/SharedSequence/SchedulerType+SharedSequence.swift\"; sourceTree = \"<group>\"; };\n\t\t4DD33D08EA36F2C8861A36D8E15B3610 /* SwiftyJSON-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"SwiftyJSON-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t4E295D0CB7D2F465413AC6086CBF8C49 /* SwiftyJSON.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftyJSON.xcconfig; sourceTree = \"<group>\"; };\n\t\t4F54F7C7B743ADE4D45AF0D405AA82BA /* ReusableKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"ReusableKit-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t4F5B061DB45E3912FBD1E11E6F1A842E /* SnapKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SnapKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t4F707D328F3FE6B0BA81F88374DC441C /* UIRotationGestureRecognizer+RxGesture.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIRotationGestureRecognizer+RxGesture.swift\"; path = \"Pod/Classes/iOS/UIRotationGestureRecognizer+RxGesture.swift\"; sourceTree = \"<group>\"; };\n\t\t4FC00E6B5EA00A0D7CA1DC61742ABA25 /* TYCyclePagerTransformLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = TYCyclePagerTransformLayout.h; path = TYCyclePagerViewDemo/TYCyclePagerView/TYCyclePagerTransformLayout.h; sourceTree = \"<group>\"; };\n\t\t500A7C34BE698156B2539B1AFD8A1AF3 /* UILongPressGestureRecognizer+RxGesture.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UILongPressGestureRecognizer+RxGesture.swift\"; path = \"Pod/Classes/iOS/UILongPressGestureRecognizer+RxGesture.swift\"; sourceTree = \"<group>\"; };\n\t\t502F0D4E9FE8FBC064C04982F146FE43 /* Queue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Queue.swift; path = Platform/DataStructures/Queue.swift; sourceTree = \"<group>\"; };\n\t\t504FC395E9A355EFA723008D25BE2E85 /* URLNavigator-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"URLNavigator-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t507ED73099FD654BE7A82BBDAADE2C57 /* IQKeyboardManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardManager.swift; path = IQKeyboardManagerSwift/IQKeyboardManager.swift; sourceTree = \"<group>\"; };\n\t\t50A9B85F6C0935020B51702CEF26AC84 /* TYPagerController.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TYPagerController.xcconfig; sourceTree = \"<group>\"; };\n\t\t50E667F49AB3F41A361BA1B406783ABF /* IQUIView+IQKeyboardToolbar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"IQUIView+IQKeyboardToolbar.swift\"; path = \"IQKeyboardManagerSwift/IQToolbar/IQUIView+IQKeyboardToolbar.swift\"; sourceTree = \"<group>\"; };\n\t\t51312E298DD4FE8C24D45F0F9149E1EB /* IQKeyboardManagerSwift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"IQKeyboardManagerSwift-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t51BA22372DFDD297D4C486B391AE3C50 /* UICollectionView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UICollectionView+Rx.swift\"; path = \"RxCocoa/iOS/UICollectionView+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t52986B63E04FBCE90E31182FC836DF8C /* Completable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Completable.swift; path = RxSwift/Traits/Completable.swift; sourceTree = \"<group>\"; };\n\t\t52A0824858ABB06E40B1588D14FF9498 /* Constraint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Constraint.swift; path = Source/Constraint.swift; sourceTree = \"<group>\"; };\n\t\t52A5AC3A3FC014CA05565755B1794774 /* SwiftyColor-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"SwiftyColor-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\t52D36179922B35EB5035CA039865F6B7 /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Image.swift; path = Sources/Image.swift; sourceTree = \"<group>\"; };\n\t\t530479F817D071873ED5DC57B4372350 /* HexColorTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HexColorTransform.swift; path = Sources/HexColorTransform.swift; sourceTree = \"<group>\"; };\n\t\t53647AFE918247CC408B6EF13349D614 /* UI+SectionedViewType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UI+SectionedViewType.swift\"; path = \"Sources/RxDataSources/UI+SectionedViewType.swift\"; sourceTree = \"<group>\"; };\n\t\t536B3E455CFA43C1E70A9AD9ACF3CD69 /* UIViewController+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIViewController+Rx.swift\"; path = \"RxCocoa/iOS/UIViewController+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t5385AD0D889B0E809D292504198A4D49 /* Kingfisher-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Kingfisher-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t53D0CE43D178809120E722B457D98361 /* UISearchController+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UISearchController+Rx.swift\"; path = \"RxCocoa/iOS/UISearchController+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t53FDE7E458AD9BF6993525EC0EC3CBFF /* SwiftyColor-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"SwiftyColor-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t541CB7596A9F5575EA8684328858A044 /* Mapper.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Mapper.swift; path = Sources/Mapper.swift; sourceTree = \"<group>\"; };\n\t\t542762FC821F584B23860CBBBAF13564 /* AddRef.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AddRef.swift; path = RxSwift/Observables/AddRef.swift; sourceTree = \"<group>\"; };\n\t\t5459AEC7839E1C793C220140241E6CD8 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t54D4C9E3C57DE8A35333AAD4C4E744A0 /* SynchronizedDisposeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedDisposeType.swift; path = RxSwift/Concurrency/SynchronizedDisposeType.swift; sourceTree = \"<group>\"; };\n\t\t553E666C8126DEAEA023EE677226741F /* LayoutConstraint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LayoutConstraint.swift; path = Source/LayoutConstraint.swift; sourceTree = \"<group>\"; };\n\t\t553ED5CCD42E1F512E1D9E9466E47D44 /* TakeLast.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeLast.swift; path = RxSwift/Observables/TakeLast.swift; sourceTree = \"<group>\"; };\n\t\t55C6E2980720E2A6CC91BB366BC6C7B2 /* MJRefreshNormalHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshNormalHeader.h; path = MJRefresh/Custom/Header/MJRefreshNormalHeader.h; sourceTree = \"<group>\"; };\n\t\t569E77B7F0029A0A2087DE259C07DB22 /* UIPinchGestureRecognizer+RxGesture.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIPinchGestureRecognizer+RxGesture.swift\"; path = \"Pod/Classes/iOS/UIPinchGestureRecognizer+RxGesture.swift\"; sourceTree = \"<group>\"; };\n\t\t56FC32B26F57769DE2EFE454C78CC62C /* ImageTransition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageTransition.swift; path = Sources/ImageTransition.swift; sourceTree = \"<group>\"; };\n\t\t57EDA4292816BC724EE611C648E430DA /* Result-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Result-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\t58674873A60E033E010D6D00276BA742 /* UIApplication+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIApplication+Rx.swift\"; path = \"RxCocoa/iOS/UIApplication+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t589D959893A1EF698394AAC806F18758 /* UITapGestureRecognizer+RxGesture.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UITapGestureRecognizer+RxGesture.swift\"; path = \"Pod/Classes/iOS/UITapGestureRecognizer+RxGesture.swift\"; sourceTree = \"<group>\"; };\n\t\t58D1D78FFF97A04C18826C9383B3DFBD /* RxCocoa-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"RxCocoa-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t5900BA1E16E8EB96D52F16B3133DD305 /* TakeUntil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeUntil.swift; path = RxSwift/Observables/TakeUntil.swift; sourceTree = \"<group>\"; };\n\t\t591CADBCCC57E88AE178D78B8606C938 /* DataSources.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DataSources.swift; path = Sources/RxDataSources/DataSources.swift; sourceTree = \"<group>\"; };\n\t\t59330F519A185D61B0CDC18A2BC8BEF7 /* UISwipeGestureRecognizer+RxGesture.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UISwipeGestureRecognizer+RxGesture.swift\"; path = \"Pod/Classes/iOS/UISwipeGestureRecognizer+RxGesture.swift\"; sourceTree = \"<group>\"; };\n\t\t59356F06A577C220AEBEDC900F94102A /* Bag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Bag.swift; path = Platform/DataStructures/Bag.swift; sourceTree = \"<group>\"; };\n\t\t593B68AD069BBE7957F7B4AE1E9F164A /* InvocableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InvocableType.swift; path = RxSwift/Schedulers/Internal/InvocableType.swift; sourceTree = \"<group>\"; };\n\t\t59830F33473DBCA365D965B7747764A8 /* KingfisherManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KingfisherManager.swift; path = Sources/KingfisherManager.swift; sourceTree = \"<group>\"; };\n\t\t59B6B580BF9608405256B589F993BA72 /* BehaviorSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BehaviorSubject.swift; path = RxSwift/Subjects/BehaviorSubject.swift; sourceTree = \"<group>\"; };\n\t\t5A310736267696B70A17786FD9CE22A3 /* NavigatorType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NavigatorType.swift; path = Sources/URLNavigator/NavigatorType.swift; sourceTree = \"<group>\"; };\n\t\t5B4592368CE0F4DED0B9CAF915FC9215 /* ReusableKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"ReusableKit-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t5B8B57244416BAE5506E83DFBCCE1F45 /* UIScrollView+MJExtension.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = \"UIScrollView+MJExtension.m\"; path = \"MJRefresh/UIScrollView+MJExtension.m\"; sourceTree = \"<group>\"; };\n\t\t5B95FDEC37C94B6EBD089F1AD6038F94 /* Resource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Resource.swift; path = Sources/Resource.swift; sourceTree = \"<group>\"; };\n\t\t5BCDD91A5C3CBCA65A1E0746F0ABC174 /* Using.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Using.swift; path = RxSwift/Observables/Using.swift; sourceTree = \"<group>\"; };\n\t\t5CB1A48DF38EB6B4A32ADD9DF79B73FF /* ConstraintDescription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDescription.swift; path = Source/ConstraintDescription.swift; sourceTree = \"<group>\"; };\n\t\t5D1AFD41323E3922E91E58F1C828C74E /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t5D28FC1E29A3FEC5D1CF82FC68A09E26 /* ConstraintConstantTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintConstantTarget.swift; path = Source/ConstraintConstantTarget.swift; sourceTree = \"<group>\"; };\n\t\t5DED5486ED70B440763840FA459F4698 /* TransformOf.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransformOf.swift; path = Sources/TransformOf.swift; sourceTree = \"<group>\"; };\n\t\t5DF0A09A6DD2C0453F866A408223B631 /* Reactive.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Reactive.swift; path = RxSwift/Reactive.swift; sourceTree = \"<group>\"; };\n\t\t5E257A033C34CB083326378E455CBA7C /* SnapKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"SnapKit-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t5E6586D8B7FB36BDE9E96FE450F51E98 /* String+IdentifiableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"String+IdentifiableType.swift\"; path = \"Sources/RxDataSources/String+IdentifiableType.swift\"; sourceTree = \"<group>\"; };\n\t\t5E7C918776C8129D7372B1095C6E2BBD /* Differentiator-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Differentiator-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\t5EAD58DE19CDA807C841C29CE9804B80 /* UITableView+ReusableKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UITableView+ReusableKit.swift\"; path = \"Sources/ReusableKit/UITableView+ReusableKit.swift\"; sourceTree = \"<group>\"; };\n\t\t5EEFED166A077BBCCE208D34F71B616C /* ParameterEncoding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParameterEncoding.swift; path = Source/ParameterEncoding.swift; sourceTree = \"<group>\"; };\n\t\t5F34BA700CC37058B6A053DD142E65DB /* ObserveOn.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserveOn.swift; path = RxSwift/Observables/ObserveOn.swift; sourceTree = \"<group>\"; };\n\t\t5F70D589B9E780A60A3716F46A4ECF0D /* ReactorKitRuntime.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = ReactorKitRuntime.m; path = Sources/ReactorKitRuntime/ReactorKitRuntime.m; sourceTree = \"<group>\"; };\n\t\t6100112F9C1D863256E650CDE2B078D9 /* Kingfisher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Kingfisher.h; path = Sources/Kingfisher.h; sourceTree = \"<group>\"; };\n\t\t610AEB49CFD63698A27742F484C3B01B /* ConstraintInsetTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintInsetTarget.swift; path = Source/ConstraintInsetTarget.swift; sourceTree = \"<group>\"; };\n\t\t610EF28DB806E2D0ECBF17409EB9EABE /* UINavigationItem+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UINavigationItem+Rx.swift\"; path = \"RxCocoa/iOS/UINavigationItem+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t613B23B6CFFCB99006B5893BE2C653A5 /* MJRefreshStateHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshStateHeader.m; path = MJRefresh/Custom/Header/MJRefreshStateHeader.m; sourceTree = \"<group>\"; };\n\t\t622801585769EF5EF95DF31C3FC639A9 /* Signal+Subscription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"Signal+Subscription.swift\"; path = \"RxCocoa/Traits/Signal/Signal+Subscription.swift\"; sourceTree = \"<group>\"; };\n\t\t62DDFD5098F37CBDB331E2282F8DEB42 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t63C44514B1EC24A99AC7728B3503A038 /* Single.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Single.swift; path = RxSwift/Traits/Single.swift; sourceTree = \"<group>\"; };\n\t\t63CA5A419783AFF7463EA6144B0C1E36 /* IntegerType+IdentifiableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"IntegerType+IdentifiableType.swift\"; path = \"Sources/RxDataSources/IntegerType+IdentifiableType.swift\"; sourceTree = \"<group>\"; };\n\t\t63D809CF6C0676EAD17D2011895CB209 /* URLNavigator.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"sourcecode.module-map\"; path = URLNavigator.modulemap; sourceTree = \"<group>\"; };\n\t\t63F72D0F593F82201EA482E15012B694 /* ObservableConvertibleType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObservableConvertibleType.swift; path = RxSwift/ObservableConvertibleType.swift; sourceTree = \"<group>\"; };\n\t\t645CC45F2863AE7D2A6FB2A8C23E620F /* UISegmentedControl+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UISegmentedControl+Rx.swift\"; path = \"RxCocoa/iOS/UISegmentedControl+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t64E69BA43FC5913EAFEEADEA145AFF1F /* RxCocoaRuntime.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RxCocoaRuntime.h; path = RxCocoa/Runtime/include/RxCocoaRuntime.h; sourceTree = \"<group>\"; };\n\t\t64ED938103FC90F798F7A60F04981575 /* UIGestureRecognizer+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIGestureRecognizer+Rx.swift\"; path = \"RxCocoa/iOS/UIGestureRecognizer+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t655359FE97777A5E6376898C32918AD1 /* DateFormatterTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateFormatterTransform.swift; path = Sources/DateFormatterTransform.swift; sourceTree = \"<group>\"; };\n\t\t65CB9B0C5FAEB1D7382D6EDFA4938D81 /* Differentiator-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Differentiator-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t66AD8E23D6C4A5FFCFE4C066E700B676 /* VirtualTimeConverterType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VirtualTimeConverterType.swift; path = RxSwift/Schedulers/VirtualTimeConverterType.swift; sourceTree = \"<group>\"; };\n\t\t66B23F5CD12DC047D454DFB36DAF64B7 /* AnyEncodable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnyEncodable.swift; path = Sources/Moya/AnyEncodable.swift; sourceTree = \"<group>\"; };\n\t\t66C7719FC6A1EB8A6E7F08B0215685B3 /* RecursiveLock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecursiveLock.swift; path = Platform/RecursiveLock.swift; sourceTree = \"<group>\"; };\n\t\t68051FD77C0407C9B24515E31E177222 /* ObjectMapper.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ObjectMapper.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t68668B40B5E550006A59D5621EFB0561 /* ReusableKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ReusableKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t6A8E64555EB2FE7D579467AABA52EB26 /* ResultProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResultProtocol.swift; path = Result/ResultProtocol.swift; sourceTree = \"<group>\"; };\n\t\t6AC97A632E3388162A1E604E64EF8D3C /* URLNavigator-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"URLNavigator-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t6B2C9F6C4EE9F9989261CF1F3418FC9E /* RxCollectionViewReactiveArrayDataSource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCollectionViewReactiveArrayDataSource.swift; path = RxCocoa/iOS/DataSources/RxCollectionViewReactiveArrayDataSource.swift; sourceTree = \"<group>\"; };\n\t\t6C6A3B044CC344E98ACD7182BCE0685D /* TYPagerController.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"sourcecode.module-map\"; path = TYPagerController.modulemap; sourceTree = \"<group>\"; };\n\t\t6C82E28899508F47FDD43F9C7D4722F0 /* TYPagerView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = TYPagerView.m; path = TYPagerControllerDemo/TYPagerController/TYPagerView.m; sourceTree = \"<group>\"; };\n\t\t6D4BA91A34AD8C308124A2BAC574B3B9 /* MJRefreshBackFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackFooter.m; path = MJRefresh/Base/MJRefreshBackFooter.m; sourceTree = \"<group>\"; };\n\t\t6D94ED6DD481751BB6F57C5B6C60049A /* IQUIWindow+Hierarchy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"IQUIWindow+Hierarchy.swift\"; path = \"IQKeyboardManagerSwift/Categories/IQUIWindow+Hierarchy.swift\"; sourceTree = \"<group>\"; };\n\t\t6DB87787AD0F7333249395D1378FED63 /* AnonymousObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousObserver.swift; path = RxSwift/Observers/AnonymousObserver.swift; sourceTree = \"<group>\"; };\n\t\t6E3539D710126BA8CE5B7B6A9EBF994E /* NetworkLoggerPlugin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkLoggerPlugin.swift; path = Sources/Moya/Plugins/NetworkLoggerPlugin.swift; sourceTree = \"<group>\"; };\n\t\t6E8E6375D3923532919D7663A2689D73 /* AnimationConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnimationConfiguration.swift; path = Sources/RxDataSources/AnimationConfiguration.swift; sourceTree = \"<group>\"; };\n\t\t6EADA7DDE939B839BF4574A8A38504C9 /* ReactorKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"ReactorKit-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t6F10EACF1B2D7C5A4C670634756973B3 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };\n\t\t6F6066636CC572B64FC9681E44E91280 /* Result.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"sourcecode.module-map\"; path = Result.modulemap; sourceTree = \"<group>\"; };\n\t\t6FADD7C8C693834E93343EFB77D33AAD /* _RX.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RX.m; path = RxCocoa/Runtime/_RX.m; sourceTree = \"<group>\"; };\n\t\t6FE766E158FAC90198034E79F61FB2CE /* RxPickerViewAdapter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxPickerViewAdapter.swift; path = RxCocoa/iOS/DataSources/RxPickerViewAdapter.swift; sourceTree = \"<group>\"; };\n\t\t701196C1B8D5354D685D7DD627877FEA /* TailRecursiveSink.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TailRecursiveSink.swift; path = RxSwift/Observers/TailRecursiveSink.swift; sourceTree = \"<group>\"; };\n\t\t70459A28397D1E419B4B3394FA8435F3 /* Cancellable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Cancellable.swift; path = Sources/Moya/Cancellable.swift; sourceTree = \"<group>\"; };\n\t\t705EED60B52573B696D1FD8B6CB52FC2 /* ConstraintLayoutSupportDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutSupportDSL.swift; path = Source/ConstraintLayoutSupportDSL.swift; sourceTree = \"<group>\"; };\n\t\t70876246376D5A1D2C4ADF75F307186A /* OperationQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OperationQueueScheduler.swift; path = RxSwift/Schedulers/OperationQueueScheduler.swift; sourceTree = \"<group>\"; };\n\t\t7088D6C1ADBF5BBD12CFF84A0E220FA2 /* UITextField+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UITextField+Rx.swift\"; path = \"RxCocoa/iOS/UITextField+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t70EBA339974E545CDC23F472B6A4BD3E /* SingleAssignmentDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SingleAssignmentDisposable.swift; path = RxSwift/Disposables/SingleAssignmentDisposable.swift; sourceTree = \"<group>\"; };\n\t\t712CA70976070E14072608793D09319A /* SwiftyJSON.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"sourcecode.module-map\"; path = SwiftyJSON.modulemap; sourceTree = \"<group>\"; };\n\t\t716F007B040C0CDD77F14CF5209FEE01 /* Pods-RxXMLY.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"Pods-RxXMLY.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t720B12F497653C86DA2AF27BCCDEFC2D /* ResponseSerialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResponseSerialization.swift; path = Source/ResponseSerialization.swift; sourceTree = \"<group>\"; };\n\t\t7253973D128A903FF19D65F0A9DB9316 /* AFError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AFError.swift; path = Source/AFError.swift; sourceTree = \"<group>\"; };\n\t\t737DA5252745C9E3883929C8A145E22E /* Moya-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Moya-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\t74418F5529BCA8630BE486D0F6A76D6C /* TTRangeSlider.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"sourcecode.module-map\"; path = TTRangeSlider.modulemap; sourceTree = \"<group>\"; };\n\t\t74515FDED92421AF135AF3C0B8B08A1B /* DispatchQueue+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"DispatchQueue+Alamofire.swift\"; path = \"Source/DispatchQueue+Alamofire.swift\"; sourceTree = \"<group>\"; };\n\t\t7481193578343285EC8F430B736D1314 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; };\n\t\t74A0AC039E269E338928C0D25F4ABC01 /* Endpoint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Endpoint.swift; path = Sources/Moya/Endpoint.swift; sourceTree = \"<group>\"; };\n\t\t74AE307751AFEBCC18F1E034FE08A05F /* Box.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Box.swift; path = Sources/Box.swift; sourceTree = \"<group>\"; };\n\t\t7553CCC7443EE20DAEB595357CD7198F /* RxTableViewDataSourceProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTableViewDataSourceProxy.swift; path = RxCocoa/iOS/Proxies/RxTableViewDataSourceProxy.swift; sourceTree = \"<group>\"; };\n\t\t75AD8F0F482E2F585B2664D1635B4706 /* MJRefreshConst.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshConst.m; path = MJRefresh/MJRefreshConst.m; sourceTree = \"<group>\"; };\n\t\t7645EEB7C195C4CF487DFA28BA57D8E5 /* UIRefreshControl+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIRefreshControl+Rx.swift\"; path = \"RxCocoa/iOS/UIRefreshControl+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t76B7D152E72F3D0808E4186445E4FC9B /* IQNSArray+Sort.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"IQNSArray+Sort.swift\"; path = \"IQKeyboardManagerSwift/Categories/IQNSArray+Sort.swift\"; sourceTree = \"<group>\"; };\n\t\t76C763EC2CA9D13E7E93A029686393D1 /* CacheSerializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CacheSerializer.swift; path = Sources/CacheSerializer.swift; sourceTree = \"<group>\"; };\n\t\t770CC8138D39A339E5C8057EC2DD1F7D /* DelaySubscription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelaySubscription.swift; path = RxSwift/Observables/DelaySubscription.swift; sourceTree = \"<group>\"; };\n\t\t77AB7A6BBF44C678FD2D852835009017 /* RxCocoa.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxCocoa.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t77D21DAC0D06E0D6BBF5A78CB767E815 /* MJRefreshNormalHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshNormalHeader.m; path = MJRefresh/Custom/Header/MJRefreshNormalHeader.m; sourceTree = \"<group>\"; };\n\t\t78266012E1D0050485CA537DD6F66FF5 /* MJRefresh-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"MJRefresh-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\t7897B0DA6B24D6557C87D44F527163A2 /* RxCollectionViewSectionedReloadDataSource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCollectionViewSectionedReloadDataSource.swift; path = Sources/RxDataSources/RxCollectionViewSectionedReloadDataSource.swift; sourceTree = \"<group>\"; };\n\t\t78C07D23AF9D0ED48A9FEB791BA9FE25 /* DictionaryTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DictionaryTransform.swift; path = Sources/DictionaryTransform.swift; sourceTree = \"<group>\"; };\n\t\t79B73C8686EF3B5668892169B223FA54 /* ReusableKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"sourcecode.module-map\"; path = ReusableKit.modulemap; sourceTree = \"<group>\"; };\n\t\t7A0ECA86834476786492EC1E52EB3E13 /* GroupBy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GroupBy.swift; path = RxSwift/Observables/GroupBy.swift; sourceTree = \"<group>\"; };\n\t\t7A4923E32C7795B1406F85C0D769B8F1 /* NavigatorDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NavigatorDelegate.swift; path = Sources/URLNavigator/NavigatorDelegate.swift; sourceTree = \"<group>\"; };\n\t\t7A8F833CA4526A1FF65CC394962AD92E /* NSObject+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = \"NSObject+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t7AA6F3E86B6FCC86A1E5A52F243EE56D /* SwiftyColor.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SwiftyColor.xcconfig; sourceTree = \"<group>\"; };\n\t\t7ADE1D2FF0526260DCE037584DAB5A0D /* MapError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MapError.swift; path = Sources/MapError.swift; sourceTree = \"<group>\"; };\n\t\t7B3743F6F50232B4A27328B734F963F8 /* UITableView+RxReusableKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UITableView+RxReusableKit.swift\"; path = \"Sources/RxReusableKit/UITableView+RxReusableKit.swift\"; sourceTree = \"<group>\"; };\n\t\t7B37D88DF834AFA3231D9F6EF76598D8 /* ConstraintPriorityTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintPriorityTarget.swift; path = Source/ConstraintPriorityTarget.swift; sourceTree = \"<group>\"; };\n\t\t7BED0C58934B33DC41A1432BABD2EFA8 /* TakeWhile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeWhile.swift; path = RxSwift/Observables/TakeWhile.swift; sourceTree = \"<group>\"; };\n\t\t7C1A7F6D1EC5B670FE3CF2E00D21C2D6 /* Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Driver.swift; path = RxCocoa/Traits/Driver/Driver.swift; sourceTree = \"<group>\"; };\n\t\t7C4B50F1957DB069477D1DF3B46EE040 /* UIProgressView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIProgressView+Rx.swift\"; path = \"RxCocoa/iOS/UIProgressView+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t7C5ABD7D168407FE39CC76E2B5D13784 /* Scan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Scan.swift; path = RxSwift/Observables/Scan.swift; sourceTree = \"<group>\"; };\n\t\t7D4430407B638D271F51E5D3E920BB51 /* Deferred.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deferred.swift; path = RxSwift/Observables/Deferred.swift; sourceTree = \"<group>\"; };\n\t\t7DA9FEB5DF32D81B067986FD382163B1 /* SwiftyColor-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"SwiftyColor-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t7E01EF7A9628B4C49AC12163B4FE6A91 /* UIControl+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIControl+Rx.swift\"; path = \"RxCocoa/iOS/UIControl+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t7E2E1626B3D838551A7744F976FEB850 /* ConstraintOffsetTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintOffsetTarget.swift; path = Source/ConstraintOffsetTarget.swift; sourceTree = \"<group>\"; };\n\t\t7FF0A342E014C442F7C7474857AF5961 /* Timeline.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeline.swift; path = Source/Timeline.swift; sourceTree = \"<group>\"; };\n\t\t8065BEF90C7FDDBD3D7FB5E732D08AD7 /* RxGesture.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"sourcecode.module-map\"; path = RxGesture.modulemap; sourceTree = \"<group>\"; };\n\t\t80810E76C51AA5F19CE1D4B0D55E060C /* IQUITextFieldView+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"IQUITextFieldView+Additions.swift\"; path = \"IQKeyboardManagerSwift/Categories/IQUITextFieldView+Additions.swift\"; sourceTree = \"<group>\"; };\n\t\t809E8BEC46CF11685F9980428C93B446 /* RxCocoaObjCRuntimeError+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"RxCocoaObjCRuntimeError+Extensions.swift\"; path = \"RxCocoa/Common/RxCocoaObjCRuntimeError+Extensions.swift\"; sourceTree = \"<group>\"; };\n\t\t80A58779165736F60C355BBAAF75C027 /* Errors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Errors.swift; path = RxSwift/Errors.swift; sourceTree = \"<group>\"; };\n\t\t80DD88365EFE5E0A8E363300ADCE2DCC /* SessionDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionDelegate.swift; path = Source/SessionDelegate.swift; sourceTree = \"<group>\"; };\n\t\t812C7F916BBBCD2970C245989B39CD1B /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Source/Result.swift; sourceTree = \"<group>\"; };\n\t\t81B1BE2330946471DDB4A3A11D43E0B8 /* ConstraintView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintView.swift; path = Source/ConstraintView.swift; sourceTree = \"<group>\"; };\n\t\t81B6FFA1A029CC85A9BD8A4847631CD7 /* IntegerOperators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IntegerOperators.swift; path = Sources/IntegerOperators.swift; sourceTree = \"<group>\"; };\n\t\t82C7B1F1647EBCD9A81E7A2788701631 /* SnapKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SnapKit.xcconfig; sourceTree = \"<group>\"; };\n\t\t834769F9B06E2DF4306C35CB6F967BAE /* ObserverType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserverType.swift; path = RxSwift/ObserverType.swift; sourceTree = \"<group>\"; };\n\t\t83A11C513330652C7580864E6FF559BC /* AssociatedObjectStore.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssociatedObjectStore.swift; path = Sources/ReactorKit/AssociatedObjectStore.swift; sourceTree = \"<group>\"; };\n\t\t83B89463432FAA55975050E17F0E6B42 /* ServerTrustPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServerTrustPolicy.swift; path = Source/ServerTrustPolicy.swift; sourceTree = \"<group>\"; };\n\t\t83BF88F0362AAB340061528783A19B27 /* AnimatableSectionModelType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnimatableSectionModelType.swift; path = Sources/Differentiator/AnimatableSectionModelType.swift; sourceTree = \"<group>\"; };\n\t\t83F0BF62BA5033111F22B49D2DA78D30 /* ConstraintMakerFinalizable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerFinalizable.swift; path = Source/ConstraintMakerFinalizable.swift; sourceTree = \"<group>\"; };\n\t\t84378AB9BAB98B7273235CFA0707DE2D /* RxPickerViewAdapter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxPickerViewAdapter.swift; path = Sources/RxDataSources/RxPickerViewAdapter.swift; sourceTree = \"<group>\"; };\n\t\t84E9E4B67AD852A6167EFE006AD2043F /* NSObject_Rx.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NSObject_Rx.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t8503DD41469B8F78519D7D0B98DBEE66 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t85302FAB5FE773C188E3758D45ABFF83 /* Pods-RxXMLY-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"Pods-RxXMLY-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t8533AEEE8CD59BA624CA9267423D28E5 /* NSObject+Rx-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"NSObject+Rx-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\t8546B56E228E6A78E32833D60BB6D648 /* UIView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIView+Rx.swift\"; path = \"RxCocoa/iOS/UIView+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t85B5D2C3BA32F9BC3AA7C975B97F6A50 /* CollectionViewSectionedDataSource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CollectionViewSectionedDataSource.swift; path = Sources/RxDataSources/CollectionViewSectionedDataSource.swift; sourceTree = \"<group>\"; };\n\t\t861BD4AC5D5011049786E6352C62DC93 /* StartWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StartWith.swift; path = RxSwift/Observables/StartWith.swift; sourceTree = \"<group>\"; };\n\t\t86FCD05DCA4B5988057772E478AA3B7C /* BehaviorRelay+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"BehaviorRelay+Driver.swift\"; path = \"RxCocoa/Traits/Driver/BehaviorRelay+Driver.swift\"; sourceTree = \"<group>\"; };\n\t\t87874701D9E81D433E42E8AAABDFFD7A /* IQTextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTextView.swift; path = IQKeyboardManagerSwift/IQTextView/IQTextView.swift; sourceTree = \"<group>\"; };\n\t\t87C5FAB0B3B58A21449A74F3BE0722D4 /* GestureFactory.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GestureFactory.swift; path = Pod/Classes/GestureFactory.swift; sourceTree = \"<group>\"; };\n\t\t87CE09E0A8341C183F59A37440D5153A /* InvocableScheduledItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InvocableScheduledItem.swift; path = RxSwift/Schedulers/Internal/InvocableScheduledItem.swift; sourceTree = \"<group>\"; };\n\t\t88860B4DEDC2F32A5AC3E06DD5F534B0 /* TYTabPagerController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = TYTabPagerController.h; path = TYPagerControllerDemo/TYPagerController/TabPager/TYTabPagerController.h; sourceTree = \"<group>\"; };\n\t\t889059818A6183D31A0BDC7C6B981849 /* ControlProperty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ControlProperty.swift; path = RxCocoa/Traits/ControlProperty.swift; sourceTree = \"<group>\"; };\n\t\t88CB6A2CAB2E3799803CD1C118F1F107 /* IQUIViewController+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"IQUIViewController+Additions.swift\"; path = \"IQKeyboardManagerSwift/Categories/IQUIViewController+Additions.swift\"; sourceTree = \"<group>\"; };\n\t\t88CD1219127C85AAD3C013FB79D9BA84 /* ImmutableMappable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImmutableMappable.swift; path = Sources/ImmutableMappable.swift; sourceTree = \"<group>\"; };\n\t\t89BBA936343137BAF519218BA7905C65 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t8A5ABA18A2D1A61A185ED12DF70B8F30 /* Result.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Result.xcconfig; sourceTree = \"<group>\"; };\n\t\t8ACB6BCA51D81D396B134C596B0FB8C1 /* Dematerialize.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Dematerialize.swift; path = RxSwift/Observables/Dematerialize.swift; sourceTree = \"<group>\"; };\n\t\t8B3B388CB20702989EAED439666B6E88 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t8BCCB28DE00E01DFCDBAFD966F967237 /* Catch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Catch.swift; path = RxSwift/Observables/Catch.swift; sourceTree = \"<group>\"; };\n\t\t8C5BD7D77FAF305B2C6E8F85C768FC42 /* RefCountDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RefCountDisposable.swift; path = RxSwift/Disposables/RefCountDisposable.swift; sourceTree = \"<group>\"; };\n\t\t8C6994BF34E50D97EB111CDFB02DA22A /* Moya-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"Moya-dummy.m\"; sourceTree = \"<group>\"; };\n\t\t8C8ADE73FE10FA15ABAA1CB4FB6DAD62 /* Maybe.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Maybe.swift; path = RxSwift/Traits/Maybe.swift; sourceTree = \"<group>\"; };\n\t\t8CF3671CDFCBADF26426E2EC9ED34424 /* RxTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTarget.swift; path = RxCocoa/Common/RxTarget.swift; sourceTree = \"<group>\"; };\n\t\t8D3F2B09E35E2D2EFA58CB9D9261E7D0 /* NSObject+Rx.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = \"NSObject+Rx.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t8D9FE6C7F2AC2C3319C58D4272FD52C1 /* IQKeyboardManagerSwift.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardManagerSwift.xcconfig; sourceTree = \"<group>\"; };\n\t\t8DC2D7127D27BDD70C5EC0A4FF96074D /* Producer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Producer.swift; path = RxSwift/Observables/Producer.swift; sourceTree = \"<group>\"; };\n\t\t8E365162D0EA4A1CE302074F5079D99D /* ObservableConvertibleType+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"ObservableConvertibleType+Driver.swift\"; path = \"RxCocoa/Traits/Driver/ObservableConvertibleType+Driver.swift\"; sourceTree = \"<group>\"; };\n\t\t8E49B1A15261BE86B3137451B245C6BE /* TYTabPagerBar.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = TYTabPagerBar.m; path = TYPagerControllerDemo/TYPagerController/TabPager/TYTabPagerBar.m; sourceTree = \"<group>\"; };\n\t\t8E6990B20E9EA105BBB88B21C57593B5 /* IQBarButtonItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQBarButtonItem.swift; path = IQKeyboardManagerSwift/IQToolbar/IQBarButtonItem.swift; sourceTree = \"<group>\"; };\n\t\t8F2CEBF6D286D3D808C8AB81A58AFF59 /* Debug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debug.swift; path = RxSwift/Observables/Debug.swift; sourceTree = \"<group>\"; };\n\t\t8F3B9C1AE8FD54707F43CF28561D8FF7 /* SwiftyJSON-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"SwiftyJSON-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t8F5E590482B741DD275B9A87B7EAF4DA /* Never.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Never.swift; path = RxSwift/Observables/Never.swift; sourceTree = \"<group>\"; };\n\t\t8F92102426225DFFC6D512690BD4167B /* ConstraintMakerPriortizable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerPriortizable.swift; path = Source/ConstraintMakerPriortizable.swift; sourceTree = \"<group>\"; };\n\t\t8FF79B88AE1A71885D5E17758DB372B4 /* MJRefresh-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"MJRefresh-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t8FF93E1E76B5ED1DA01941D734DB3531 /* MJRefreshFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshFooter.h; path = MJRefresh/Base/MJRefreshFooter.h; sourceTree = \"<group>\"; };\n\t\t90107D958C65D510896483F2CB8060BA /* ObservableType+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"ObservableType+Extensions.swift\"; path = \"RxSwift/ObservableType+Extensions.swift\"; sourceTree = \"<group>\"; };\n\t\t9096DCC6CC66370C372F38BF8C1E435A /* RxPickerViewDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxPickerViewDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxPickerViewDelegateProxy.swift; sourceTree = \"<group>\"; };\n\t\t90D0F930F0AE0A2471269302003B8A5F /* RxWebViewDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxWebViewDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxWebViewDelegateProxy.swift; sourceTree = \"<group>\"; };\n\t\t91425961AD55DFFE4C3BCB82A387076E /* Differentiator.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"sourcecode.module-map\"; path = Differentiator.modulemap; sourceTree = \"<group>\"; };\n\t\t9158E32ACD5A2977E6DE91E13F5C7A66 /* TYPagerController-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"TYPagerController-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t91BE41B89A55956B97FA90BA78DA1A4C /* MJRefreshHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshHeader.h; path = MJRefresh/Base/MJRefreshHeader.h; sourceTree = \"<group>\"; };\n\t\t91EFB17C939EB1CE9FDE66074D20AA83 /* MJRefreshComponent.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshComponent.h; path = MJRefresh/Base/MJRefreshComponent.h; sourceTree = \"<group>\"; };\n\t\t91F4320128E8926FF21C0A92F70CFBBD /* TYCyclePagerView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TYCyclePagerView.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t923B40C1B730134DE3FB93D56434F359 /* SectionModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SectionModel.swift; path = Sources/Differentiator/SectionModel.swift; sourceTree = \"<group>\"; };\n\t\t924F8DE96A22311CC14038BB62C8997D /* IQKeyboardManagerSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = IQKeyboardManagerSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };\n\t\t9547423EEA761582EF5FDB90684A1EE8 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t954CE4894A117D9DA14AE5D47A6BAE88 /* Map.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Map.swift; path = RxSwift/Observables/Map.swift; sourceTree = \"<group>\"; };\n\t\t957D3B23678E4698CC79A2DE9EA9F96A /* _RXKVOObserver.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RXKVOObserver.m; path = RxCocoa/Runtime/_RXKVOObserver.m; sourceTree = \"<group>\"; };\n\t\t95A5AC992E4B703AA08D0A815AAED779 /* ImmediateSchedulerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImmediateSchedulerType.swift; path = RxSwift/ImmediateSchedulerType.swift; sourceTree = \"<group>\"; };\n\t\t95CF89A127DC79551BAA8988F82BD1E2 /* Event.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Event.swift; path = RxSwift/Event.swift; sourceTree = \"<group>\"; };\n\t\t95E7A514BFE979A1185DE2AD4CF665AB /* IQKeyboardManagerSwift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"IQKeyboardManagerSwift-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t95F766DA63DDEB880E468218435A871E /* SessionManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SessionManager.swift; path = Source/SessionManager.swift; sourceTree = \"<group>\"; };\n\t\t9647D7ACC10E74465531ADEEFD4D2E0B /* ActionSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ActionSubject.swift; path = Sources/ReactorKit/ActionSubject.swift; sourceTree = \"<group>\"; };\n\t\t96BC1A1EF9084AA9223F0E5E094C6ABC /* DispatchQueue+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"DispatchQueue+Extensions.swift\"; path = \"Platform/DispatchQueue+Extensions.swift\"; sourceTree = \"<group>\"; };\n\t\t96BF47DDEF17AC72F8EBF9CF0EA9DC04 /* _RXObjCRuntime.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RXObjCRuntime.m; path = RxCocoa/Runtime/_RXObjCRuntime.m; sourceTree = \"<group>\"; };\n\t\t9707233113E3D0E414A32F652E88D1D8 /* UITabBar+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UITabBar+Rx.swift\"; path = \"RxCocoa/iOS/UITabBar+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t973B74E176AD01454BE984AC4A7136A0 /* IQKeyboardManagerSwift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"IQKeyboardManagerSwift-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\t97927D56FAC9E735B7340A75B06C0600 /* Then.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Then.swift; path = Sources/Then/Then.swift; sourceTree = \"<group>\"; };\n\t\t97B60E643384171A74CED9D708E98F3D /* RxDataSources.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxDataSources.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t9855A9C6CDDA35414C161F75BED8B6F8 /* Alamofire.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.xcconfig; sourceTree = \"<group>\"; };\n\t\t98B0262ADD4A92D4CCFE4F51BE3FD5D5 /* UIBarButtonItem+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIBarButtonItem+Rx.swift\"; path = \"RxCocoa/iOS/UIBarButtonItem+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t98BFA9BCF11C38855F14FC8D710D4E95 /* RxCocoa.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCocoa.swift; path = RxCocoa/RxCocoa.swift; sourceTree = \"<group>\"; };\n\t\t9946E97DCFB4572476564D33A05975E4 /* SynchronizedUnsubscribeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedUnsubscribeType.swift; path = RxSwift/Concurrency/SynchronizedUnsubscribeType.swift; sourceTree = \"<group>\"; };\n\t\t99692BFA25CF2437019950A2EFAE0291 /* VirtualTimeScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VirtualTimeScheduler.swift; path = RxSwift/Schedulers/VirtualTimeScheduler.swift; sourceTree = \"<group>\"; };\n\t\t9979EBBDCDD9A7DDDB0725FEC97660E7 /* URLTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLTransform.swift; path = Sources/URLTransform.swift; sourceTree = \"<group>\"; };\n\t\t99F328B2BEE043C872339B6E419D2095 /* Sequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sequence.swift; path = RxSwift/Observables/Sequence.swift; sourceTree = \"<group>\"; };\n\t\t9A82E326004C5937DB3D98AD29CEDFBA /* Platform.Linux.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Linux.swift; path = Platform/Platform.Linux.swift; sourceTree = \"<group>\"; };\n\t\t9BBEE2DB22AD2B01DE2D742F08B660DE /* UIButton+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIButton+Rx.swift\"; path = \"RxCocoa/iOS/UIButton+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\t9C5AF229FF21FF8786BD3CDF9E0BD504 /* Platform.Linux.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Linux.swift; path = Platform/Platform.Linux.swift; sourceTree = \"<group>\"; };\n\t\t9CD9A0FE14A09A30BF80B2ABA5E19488 /* RxGestureRecognizerDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxGestureRecognizerDelegate.swift; path = Pod/Classes/RxGestureRecognizerDelegate.swift; sourceTree = \"<group>\"; };\n\t\t9CEA02DF9281493AB02811A381B532ED /* TYCyclePagerView.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TYCyclePagerView.xcconfig; sourceTree = \"<group>\"; };\n\t\t9D01082F46B5E949B212F6A27CDEF6DF /* RxTabBarControllerDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTabBarControllerDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxTabBarControllerDelegateProxy.swift; sourceTree = \"<group>\"; };\n\t\t9D4AFB0C0C4C623DA01CF63FA53AE13C /* RxSwift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"sourcecode.module-map\"; path = RxSwift.modulemap; sourceTree = \"<group>\"; };\n\t\t9D52DB027375B4BF6987825A6BF5751B /* RxAlamofire.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RxAlamofire.xcconfig; sourceTree = \"<group>\"; };\n\t\t9D8CA91B2544EA3008663944FBDDBB5F /* MJRefreshGifHeader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshGifHeader.h; path = MJRefresh/Custom/Header/MJRefreshGifHeader.h; sourceTree = \"<group>\"; };\n\t\t9DB0EFCE41B9CC2A562FFA3E9B2C8CD1 /* TTRangeSlider-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"TTRangeSlider-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\t9F86ADA13F9525995BA4102D3E1950B2 /* RxCollectionViewSectionedAnimatedDataSource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCollectionViewSectionedAnimatedDataSource.swift; path = Sources/RxDataSources/RxCollectionViewSectionedAnimatedDataSource.swift; sourceTree = \"<group>\"; };\n\t\t9FDFBC7B8CD4E93779C4C76ACF38B06D /* FormatIndicatedCacheSerializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FormatIndicatedCacheSerializer.swift; path = Sources/FormatIndicatedCacheSerializer.swift; sourceTree = \"<group>\"; };\n\t\tA088E5F2C74178B8F5D416C973214422 /* Zip+Collection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"Zip+Collection.swift\"; path = \"RxSwift/Observables/Zip+Collection.swift\"; sourceTree = \"<group>\"; };\n\t\tA0E83A69D9C8F0B40317DD90BF832D26 /* SwitchIfEmpty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwitchIfEmpty.swift; path = RxSwift/Observables/SwitchIfEmpty.swift; sourceTree = \"<group>\"; };\n\t\tA1A112A635DA48EF8CB77AF4F3AE614D /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tA212CBEA9196364FF0A6F2FA43D9CE76 /* ReactorKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"sourcecode.module-map\"; path = ReactorKit.modulemap; sourceTree = \"<group>\"; };\n\t\tA222328DE93D544E711805351EB49909 /* RxDataSources.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RxDataSources.xcconfig; sourceTree = \"<group>\"; };\n\t\tA25F9545112FB4EA2545D303AC81CFB1 /* Delay.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Delay.swift; path = RxSwift/Observables/Delay.swift; sourceTree = \"<group>\"; };\n\t\tA276DD5300A0CD1F004D67179921FE96 /* AsyncLock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsyncLock.swift; path = RxSwift/Concurrency/AsyncLock.swift; sourceTree = \"<group>\"; };\n\t\tA27C7B9B2AA2EBC3F3078495A3B4B248 /* TTRangeSlider-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"TTRangeSlider-dummy.m\"; sourceTree = \"<group>\"; };\n\t\tA2B78D4FFAD19F5D58FA9B42B6E4F2FE /* NSLayoutConstraint+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"NSLayoutConstraint+Rx.swift\"; path = \"RxCocoa/Common/NSLayoutConstraint+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tA32996D04BF42DF4610DB92306B85695 /* AnimatableSectionModelType+ItemPath.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"AnimatableSectionModelType+ItemPath.swift\"; path = \"Sources/Differentiator/AnimatableSectionModelType+ItemPath.swift\"; sourceTree = \"<group>\"; };\n\t\tA468830C4A1700A0C17545C662543173 /* ConstraintViewDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintViewDSL.swift; path = Source/ConstraintViewDSL.swift; sourceTree = \"<group>\"; };\n\t\tA46A36F4BF38056EAA48578282F54B60 /* TTRangeSlider.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = TTRangeSlider.m; path = Pod/Classes/TTRangeSlider.m; sourceTree = \"<group>\"; };\n\t\tA5C87EF44982A4D3803D88EB9983E52D /* UIGestureRecognizer+RxGesture.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIGestureRecognizer+RxGesture.swift\"; path = \"Pod/Classes/iOS/UIGestureRecognizer+RxGesture.swift\"; sourceTree = \"<group>\"; };\n\t\tA5D6508C06EC007A57DBB3099AD5C617 /* LockOwnerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LockOwnerType.swift; path = RxSwift/Concurrency/LockOwnerType.swift; sourceTree = \"<group>\"; };\n\t\tA5E925D1347A4A7AE44D07D3342D1BCB /* TYCyclePagerView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"TYCyclePagerView-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\tA678D15F6F0F97A723B186CEA25EE5A4 /* Zip+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"Zip+arity.swift\"; path = \"RxSwift/Observables/Zip+arity.swift\"; sourceTree = \"<group>\"; };\n\t\tA6BE7CE8E3CF10B0BE4713CA7CD3FDC9 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tA6EC870FE5CE9FD966D23435C1DB6E0C /* IQKeyboardReturnKeyHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardReturnKeyHandler.swift; path = IQKeyboardManagerSwift/IQKeyboardReturnKeyHandler.swift; sourceTree = \"<group>\"; };\n\t\tA6F0EAB300D0CE91C61EF3E29868A1D0 /* NSObject+Rx-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"NSObject+Rx-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\tA7F044D3460E87057EB82CCDD5C4D545 /* Differentiator.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Differentiator.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tA7F1EA6B598A844B871DB54C2C1C197D /* AnimatableSectionModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnimatableSectionModel.swift; path = Sources/Differentiator/AnimatableSectionModel.swift; sourceTree = \"<group>\"; };\n\t\tA82133367E269E7AA71B9DB6052EFEEB /* Alamofire-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"Alamofire-dummy.m\"; sourceTree = \"<group>\"; };\n\t\tA93A51F7564EC64C94864C9A11DF7A0D /* TYPageControl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = TYPageControl.h; path = TYCyclePagerViewDemo/TYCyclePagerView/TYPageControl.h; sourceTree = \"<group>\"; };\n\t\tA93AB57B4326570AC0951E305DD04B1F /* RxAlamofire-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"RxAlamofire-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\tA95B5537CC319932AD399F0660CB16D8 /* SwiftyColor.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftyColor.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tA962B38EA206CD0B32DEC9E6DC414479 /* ControlEvent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ControlEvent.swift; path = RxCocoa/Traits/ControlEvent.swift; sourceTree = \"<group>\"; };\n\t\tA9A3DB0E144693D175CBA841C8B10601 /* RetryWhen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RetryWhen.swift; path = RxSwift/Observables/RetryWhen.swift; sourceTree = \"<group>\"; };\n\t\tAA64CC4D23BCB33D713381874C6A93C9 /* RxTableViewSectionedReloadDataSource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTableViewSectionedReloadDataSource.swift; path = Sources/RxDataSources/RxTableViewSectionedReloadDataSource.swift; sourceTree = \"<group>\"; };\n\t\tAA67591D1C61133E2F626EA1C2E097FE /* Observable+Bind.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"Observable+Bind.swift\"; path = \"RxCocoa/Common/Observable+Bind.swift\"; sourceTree = \"<group>\"; };\n\t\tAAA5BE3862DD3A00CBB848A024A5E863 /* ControlEvent+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"ControlEvent+Driver.swift\"; path = \"RxCocoa/Traits/Driver/ControlEvent+Driver.swift\"; sourceTree = \"<group>\"; };\n\t\tAB53371318D8626F8F670FACB15EC0F0 /* MoyaProvider+Internal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"MoyaProvider+Internal.swift\"; path = \"Sources/Moya/MoyaProvider+Internal.swift\"; sourceTree = \"<group>\"; };\n\t\tABBD78A9569D4426E15EAE838A7F4562 /* RxSearchControllerDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxSearchControllerDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxSearchControllerDelegateProxy.swift; sourceTree = \"<group>\"; };\n\t\tABF289602106E94D3F277B9C7F39FF7C /* UIView+MJExtension.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = \"UIView+MJExtension.m\"; path = \"MJRefresh/UIView+MJExtension.m\"; sourceTree = \"<group>\"; };\n\t\tAC1DC57990281D4F45BE128AADCE4143 /* UICollectionView+ReusableKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UICollectionView+ReusableKit.swift\"; path = \"Sources/ReusableKit/UICollectionView+ReusableKit.swift\"; sourceTree = \"<group>\"; };\n\t\tAC294161F7CCD1280208FEC5EE254218 /* Driver+Subscription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"Driver+Subscription.swift\"; path = \"RxCocoa/Traits/Driver/Driver+Subscription.swift\"; sourceTree = \"<group>\"; };\n\t\tAE4600B7894931DEAFCABE02CD7AB268 /* GroupedObservable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GroupedObservable.swift; path = RxSwift/GroupedObservable.swift; sourceTree = \"<group>\"; };\n\t\tAE48FA13FBA4585E33723ED2572A6754 /* TextInput.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TextInput.swift; path = RxCocoa/Common/TextInput.swift; sourceTree = \"<group>\"; };\n\t\tAE7697FE2AC8BF4148D6676FBC1B5A23 /* UIWebView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIWebView+Rx.swift\"; path = \"RxCocoa/iOS/UIWebView+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tAE8EA095AFC8941AABB28F7469B54C94 /* Pods-RxXMLY-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = \"Pods-RxXMLY-acknowledgements.markdown\"; sourceTree = \"<group>\"; };\n\t\tAE8FF0C7C94471EB15B40751856B8D53 /* ItemEvents.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ItemEvents.swift; path = RxCocoa/iOS/Events/ItemEvents.swift; sourceTree = \"<group>\"; };\n\t\tAE9BA3DB7A5A422C613CFBFB2811FEA5 /* Timeout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeout.swift; path = RxSwift/Observables/Timeout.swift; sourceTree = \"<group>\"; };\n\t\tAF66AEF465B9C56A648DA16DBF3D2E4E /* SharedSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SharedSequence.swift; path = RxCocoa/Traits/SharedSequence/SharedSequence.swift; sourceTree = \"<group>\"; };\n\t\tAF9EE6B5C17353C6D306E650D41F6A57 /* RxCocoa-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"RxCocoa-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\tAFBBB6581E245F03FD7746F2B3F6838A /* UITableView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UITableView+Rx.swift\"; path = \"RxCocoa/iOS/UITableView+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tB00A5B87228E30280657500960598B59 /* LayoutConstraintItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LayoutConstraintItem.swift; path = Source/LayoutConstraintItem.swift; sourceTree = \"<group>\"; };\n\t\tB00B2D1E5594681E1384A988B35D66F6 /* WithLatestFrom.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WithLatestFrom.swift; path = RxSwift/Observables/WithLatestFrom.swift; sourceTree = \"<group>\"; };\n\t\tB013E2FF6D44578E3E483B417504DD8F /* ReusableKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ReusableKit.xcconfig; sourceTree = \"<group>\"; };\n\t\tB09E2CE4824B4A44FE923169E5B3934C /* PrimitiveSequence+Zip+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"PrimitiveSequence+Zip+arity.swift\"; path = \"RxSwift/Traits/PrimitiveSequence+Zip+arity.swift\"; sourceTree = \"<group>\"; };\n\t\tB0D0CA0D4B6A0E2EB840F4E5D6C75340 /* _RXObjCRuntime.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RXObjCRuntime.h; path = RxCocoa/Runtime/include/_RXObjCRuntime.h; sourceTree = \"<group>\"; };\n\t\tB0E8C13296CD0445ED73183C8774BA83 /* Kingfisher.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"sourcecode.module-map\"; path = Kingfisher.modulemap; sourceTree = \"<group>\"; };\n\t\tB10806D65630D3922CC4632E4B961170 /* BinaryDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BinaryDisposable.swift; path = RxSwift/Disposables/BinaryDisposable.swift; sourceTree = \"<group>\"; };\n\t\tB1D09ED075CFA4F5069E951F7B848972 /* UICollectionView+RxReusableKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UICollectionView+RxReusableKit.swift\"; path = \"Sources/RxReusableKit/UICollectionView+RxReusableKit.swift\"; sourceTree = \"<group>\"; };\n\t\tB20C215CD03F9EC325B96AD2A4621096 /* ConstraintLayoutSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutSupport.swift; path = Source/ConstraintLayoutSupport.swift; sourceTree = \"<group>\"; };\n\t\tB216F1C86A2BB68A807DD4CD8314351F /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tB228A61D64CA44B4648977930AEEBF5F /* TYPagerController.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TYPagerController.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tB28CBB9A2FC6BD76A7188D520046176D /* KingfisherOptionsInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KingfisherOptionsInfo.swift; path = Sources/KingfisherOptionsInfo.swift; sourceTree = \"<group>\"; };\n\t\tB2C6C61F18ADC817A64446B3F214A416 /* Pods_RxXMLY.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RxXMLY.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tB2E6EA6ADCEAC27A4822132EBAC46122 /* Response.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Response.swift; path = Source/Response.swift; sourceTree = \"<group>\"; };\n\t\tB32CA5B611266CA013631C5E362ACECE /* ScheduledItemType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledItemType.swift; path = RxSwift/Schedulers/Internal/ScheduledItemType.swift; sourceTree = \"<group>\"; };\n\t\tB3F4C6BA01C9A3737D53D5029569BD25 /* UIPanGestureRecognizer+RxGesture.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIPanGestureRecognizer+RxGesture.swift\"; path = \"Pod/Classes/iOS/UIPanGestureRecognizer+RxGesture.swift\"; sourceTree = \"<group>\"; };\n\t\tB48B219E8CC99707DBEA39F8FF5389AA /* ImagePrefetcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImagePrefetcher.swift; path = Sources/ImagePrefetcher.swift; sourceTree = \"<group>\"; };\n\t\tB599D41042A76B9DF98EB3822B3056BA /* UIPageControl+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIPageControl+Rx.swift\"; path = \"RxCocoa/iOS/UIPageControl+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tB5A668A610822A5EACD5784C5EEE3E17 /* KVORepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KVORepresentable.swift; path = RxCocoa/Foundation/KVORepresentable.swift; sourceTree = \"<group>\"; };\n\t\tB68C41252797A96DC3101FEF24BD28A4 /* Moya.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"sourcecode.module-map\"; path = Moya.modulemap; sourceTree = \"<group>\"; };\n\t\tB6C6A5E1D3112FA5320C2F8509A9ADD7 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tB6DD7C62D3975725987453F154E89E03 /* Kingfisher.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Kingfisher.xcconfig; sourceTree = \"<group>\"; };\n\t\tB717B3469C2896926EF05EAF11498DA0 /* _RX.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RX.h; path = RxCocoa/Runtime/include/_RX.h; sourceTree = \"<group>\"; };\n\t\tB7AB99038CF5A8302F1BE2D35B09885A /* MJRefreshBackGifFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackGifFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.h; sourceTree = \"<group>\"; };\n\t\tB7B99FDB86B839402402CF4B9085F867 /* MJRefresh.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MJRefresh.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tB7FBCAED115C93A340B4D4817383226A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tB8020BB1D97D4EA3246C9476D7044FE7 /* NSObject+Rx-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"NSObject+Rx-dummy.m\"; sourceTree = \"<group>\"; };\n\t\tB840B6E9063F05A5F844D55042BC104D /* SharedSequence+Operators+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"SharedSequence+Operators+arity.swift\"; path = \"RxCocoa/Traits/SharedSequence/SharedSequence+Operators+arity.swift\"; sourceTree = \"<group>\"; };\n\t\tB86E459038ACF95C44868462505C56A6 /* TTRangeSliderDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = TTRangeSliderDelegate.h; path = Pod/Classes/TTRangeSliderDelegate.h; sourceTree = \"<group>\"; };\n\t\tB8D62DD162002F9C56F1C29692DB9FB4 /* Request.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Request.swift; path = Source/Request.swift; sourceTree = \"<group>\"; };\n\t\tB8DAA4F672011BE9BD20D53B1B64E479 /* Disposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disposable.swift; path = RxSwift/Disposable.swift; sourceTree = \"<group>\"; };\n\t\tB97FA317AEF5791CA7299591278DDD85 /* RxPickerViewDataSourceType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxPickerViewDataSourceType.swift; path = RxCocoa/iOS/Protocols/RxPickerViewDataSourceType.swift; sourceTree = \"<group>\"; };\n\t\tB9B6B63EED3B0A8A6802499D6992A2CE /* RxDataSources-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"RxDataSources-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\tB9CFFF8A56873944159E6B04DBAD45BD /* Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deprecated.swift; path = Sources/RxDataSources/Deprecated.swift; sourceTree = \"<group>\"; };\n\t\tBAB7E27C2C9842A03F3BD947DD8493A2 /* IQKeyboardManagerConstantsInternal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardManagerConstantsInternal.swift; path = IQKeyboardManagerSwift/Constants/IQKeyboardManagerConstantsInternal.swift; sourceTree = \"<group>\"; };\n\t\tBACE4EA986227C4D5F468E9FC4DB57BC /* DelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelegateProxy.swift; path = RxCocoa/Common/DelegateProxy.swift; sourceTree = \"<group>\"; };\n\t\tBB9B39409869FB19DBBE9E21A282D0E1 /* PublishRelay+Signal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"PublishRelay+Signal.swift\"; path = \"RxCocoa/Traits/Signal/PublishRelay+Signal.swift\"; sourceTree = \"<group>\"; };\n\t\tBC0C35EACA9CABA73CF6D660DB55A64A /* TYPagerController-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"TYPagerController-dummy.m\"; sourceTree = \"<group>\"; };\n\t\tBC52351249DB2B467541996968B175A0 /* ObjectMapper-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"ObjectMapper-dummy.m\"; sourceTree = \"<group>\"; };\n\t\tBC645F028499DF5A3CB986DD6D4358F1 /* Result.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Result.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tBC7B9021F90F58D6E367BA8B4C9C2B14 /* ToArray.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ToArray.swift; path = RxSwift/Observables/ToArray.swift; sourceTree = \"<group>\"; };\n\t\tBCC1C0B2E36AC5340AC67AD9AD286793 /* ObjectMapper.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"sourcecode.module-map\"; path = ObjectMapper.modulemap; sourceTree = \"<group>\"; };\n\t\tBDA8654A5097FB77F91981EC742DE882 /* MultiTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultiTarget.swift; path = Sources/Moya/MultiTarget.swift; sourceTree = \"<group>\"; };\n\t\tBDC3EE36C7DE6D97F96B2B36B0E557C9 /* ScheduledItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledItem.swift; path = RxSwift/Schedulers/Internal/ScheduledItem.swift; sourceTree = \"<group>\"; };\n\t\tBE0C2F5C5C4F8CD822C21482EBE49DD8 /* RxGesture-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"RxGesture-dummy.m\"; sourceTree = \"<group>\"; };\n\t\tBE113770F3941380D55A0F946E7431DE /* TYTabPagerView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = TYTabPagerView.m; path = TYPagerControllerDemo/TYPagerController/TabPager/TYTabPagerView.m; sourceTree = \"<group>\"; };\n\t\tBE49DD1F3CB80E0DCB3ED742E3DED62B /* SchedulerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SchedulerType.swift; path = RxSwift/SchedulerType.swift; sourceTree = \"<group>\"; };\n\t\tBE4CFCC4E9A965F95EE17202FBB5F310 /* SynchronizedOnType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedOnType.swift; path = RxSwift/Concurrency/SynchronizedOnType.swift; sourceTree = \"<group>\"; };\n\t\tBE4D4A9C4DD3E20DEF7AD0D414C67442 /* UITabBarItem+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UITabBarItem+Rx.swift\"; path = \"RxCocoa/iOS/UITabBarItem+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tBE521621242425215AB95C0D1F947998 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tBE96693365ED0583573F43D8F5B57187 /* ImageView+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"ImageView+Kingfisher.swift\"; path = \"Sources/ImageView+Kingfisher.swift\"; sourceTree = \"<group>\"; };\n\t\tBEB35F8259524796939172BEB9769CB6 /* PriorityQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PriorityQueue.swift; path = Platform/DataStructures/PriorityQueue.swift; sourceTree = \"<group>\"; };\n\t\tBEF74C2451A7C311E3C89E75D4746DD4 /* RxScrollViewDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxScrollViewDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxScrollViewDelegateProxy.swift; sourceTree = \"<group>\"; };\n\t\tC0112A7EDEEB67FF3C434A3F925DEA88 /* SubscriptionDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscriptionDisposable.swift; path = RxSwift/Disposables/SubscriptionDisposable.swift; sourceTree = \"<group>\"; };\n\t\tC0155AA3020891E25233E5B541EF2063 /* TYPagerController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = TYPagerController.h; path = TYPagerControllerDemo/TYPagerController/TYPagerController.h; sourceTree = \"<group>\"; };\n\t\tC0764078D276516AEF879D67E95D225E /* Changeset.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Changeset.swift; path = Sources/Differentiator/Changeset.swift; sourceTree = \"<group>\"; };\n\t\tC0B487DA905C4F895E0D126C1A062261 /* AnonymousDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousDisposable.swift; path = RxSwift/Disposables/AnonymousDisposable.swift; sourceTree = \"<group>\"; };\n\t\tC0B85CEF090EDD7737A7E0F1D0F0F169 /* TTRangeSlider.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = TTRangeSlider.h; path = Pod/Classes/TTRangeSlider.h; sourceTree = \"<group>\"; };\n\t\tC0DB238A8FB8D79A81E67CBB38ECF524 /* Differentiator-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"Differentiator-dummy.m\"; sourceTree = \"<group>\"; };\n\t\tC10FF295CB8B9A0152FA38DF372846A4 /* CompositeDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CompositeDisposable.swift; path = RxSwift/Disposables/CompositeDisposable.swift; sourceTree = \"<group>\"; };\n\t\tC1DC026D0D8F36437F6F9662A1805D0E /* PublishSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PublishSubject.swift; path = RxSwift/Subjects/PublishSubject.swift; sourceTree = \"<group>\"; };\n\t\tC2316CDD5367CCF5307F4C680E70DBBA /* UISearchBar+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UISearchBar+Rx.swift\"; path = \"RxCocoa/iOS/UISearchBar+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tC2617565C24877EE61A697C90E5405A2 /* ReactorKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"ReactorKit-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\tC47049CF48166B10EF910F23995AEC84 /* TYCyclePagerTransformLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = TYCyclePagerTransformLayout.m; path = TYCyclePagerViewDemo/TYCyclePagerView/TYCyclePagerTransformLayout.m; sourceTree = \"<group>\"; };\n\t\tC481BF3DA3A78A8E7F5176B802625CC6 /* Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deprecated.swift; path = RxSwift/Deprecated.swift; sourceTree = \"<group>\"; };\n\t\tC5A28FC784D68445E20B42FEE607E770 /* Then-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Then-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\tC5B39EAE40FAC88E85E0EDD5108794F0 /* TYPagerViewLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = TYPagerViewLayout.h; path = TYPagerControllerDemo/TYPagerController/TYPagerViewLayout.h; sourceTree = \"<group>\"; };\n\t\tC5BFA257EAD55FA150B56C6B292EAA44 /* RequestModifier.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RequestModifier.swift; path = Sources/RequestModifier.swift; sourceTree = \"<group>\"; };\n\t\tC60A46D85400354A02A72584F53237D8 /* Optional+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"Optional+Extensions.swift\"; path = \"Sources/Differentiator/Optional+Extensions.swift\"; sourceTree = \"<group>\"; };\n\t\tC68244972029A1CB9C966D064AB6967F /* MJRefreshGifHeader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshGifHeader.m; path = MJRefresh/Custom/Header/MJRefreshGifHeader.m; sourceTree = \"<group>\"; };\n\t\tC70DA4143C75E4B49245F0F990AF117E /* RxGesture-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"RxGesture-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\tC755463902805FE86A327D9AD0B26200 /* RxTabBarDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTabBarDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxTabBarDelegateProxy.swift; sourceTree = \"<group>\"; };\n\t\tC7A200DBF260A1DD96FA33642A921C9F /* ConcurrentDispatchQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConcurrentDispatchQueueScheduler.swift; path = RxSwift/Schedulers/ConcurrentDispatchQueueScheduler.swift; sourceTree = \"<group>\"; };\n\t\tC7AF230FEF4F9203FE69CA75CAC56E33 /* PrimitiveSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PrimitiveSequence.swift; path = RxSwift/Traits/PrimitiveSequence.swift; sourceTree = \"<group>\"; };\n\t\tC84F456A91C16DC64488D342C8BC5929 /* Binder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Binder.swift; path = RxCocoa/Common/Binder.swift; sourceTree = \"<group>\"; };\n\t\tC8B8D267B8E5E2A789EBA75CCFF121F2 /* SwiftyJSON-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"SwiftyJSON-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\tCB17D569CE831A4F4E00E2FC816EBBC9 /* ImageProcessor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageProcessor.swift; path = Sources/ImageProcessor.swift; sourceTree = \"<group>\"; };\n\t\tCBD70508C00E38F1FE63CED0383CAFE6 /* Platform.Darwin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Darwin.swift; path = Platform/Platform.Darwin.swift; sourceTree = \"<group>\"; };\n\t\tCC6A0E89EEA59CA5659D2EED0C773FD1 /* ImageCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageCache.swift; path = Sources/ImageCache.swift; sourceTree = \"<group>\"; };\n\t\tCC6B9B2770629FBEE8FF3829E91ACE5A /* Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Kingfisher.swift; path = Sources/Kingfisher.swift; sourceTree = \"<group>\"; };\n\t\tCC94DB3E4DBB1ECF4FA33EBC9EAACFDF /* Switch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Switch.swift; path = RxSwift/Observables/Switch.swift; sourceTree = \"<group>\"; };\n\t\tCD67BEEE3096E3E2BD09DF6158788A6E /* TYTabPagerBarLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = TYTabPagerBarLayout.h; path = TYPagerControllerDemo/TYPagerController/TabPager/TYTabPagerBarLayout.h; sourceTree = \"<group>\"; };\n\t\tCDB96EFEBACCC377C2C1852E1187BDE3 /* UIStepper+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIStepper+Rx.swift\"; path = \"RxCocoa/iOS/UIStepper+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tCE2E4D442D52B0894ED51620B7A11E8B /* RxTextStorageDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTextStorageDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxTextStorageDelegateProxy.swift; sourceTree = \"<group>\"; };\n\t\tCEA052CCABE96871EBBAFD7D6C959A06 /* AccessTokenPlugin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AccessTokenPlugin.swift; path = Sources/Moya/Plugins/AccessTokenPlugin.swift; sourceTree = \"<group>\"; };\n\t\tCEC01AC2D958140E2A090D7B632F5567 /* ControlProperty+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"ControlProperty+Driver.swift\"; path = \"RxCocoa/Traits/Driver/ControlProperty+Driver.swift\"; sourceTree = \"<group>\"; };\n\t\tCF47A0081987D5825B05757F83159AE9 /* UIButton+Kingfisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIButton+Kingfisher.swift\"; path = \"Sources/UIButton+Kingfisher.swift\"; sourceTree = \"<group>\"; };\n\t\tD06DCA6A0B6616240EC75F089FCB605D /* AnyObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnyObserver.swift; path = RxSwift/AnyObserver.swift; sourceTree = \"<group>\"; };\n\t\tD0C3B1C0259FBCD7A10525F73D370CF5 /* UIActivityIndicatorView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIActivityIndicatorView+Rx.swift\"; path = \"RxCocoa/iOS/UIActivityIndicatorView+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tD1CF8E77098D7789AB0555F960E5B430 /* ConstraintPriority.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintPriority.swift; path = Source/ConstraintPriority.swift; sourceTree = \"<group>\"; };\n\t\tD2A7C9B0E3259DE8E0442244250D596F /* ConstraintConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintConfig.swift; path = Source/ConstraintConfig.swift; sourceTree = \"<group>\"; };\n\t\tD2D55E77F429A861A4AEA5872801C81A /* SnapKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"SnapKit-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\tD2E1B85E14851EF923C2BD626BE22587 /* Create.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Create.swift; path = RxSwift/Observables/Create.swift; sourceTree = \"<group>\"; };\n\t\tD302B83E9CE0D2B43DFA34A03D0DBE2B /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tD3869DF0902D254BD40D6B02E11A8B52 /* IdentifiableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IdentifiableType.swift; path = Sources/Differentiator/IdentifiableType.swift; sourceTree = \"<group>\"; };\n\t\tD3F7DB8C08BAE7F26A0EE85DA33C3905 /* NSObject+Rx+RawRepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"NSObject+Rx+RawRepresentable.swift\"; path = \"RxCocoa/Foundation/NSObject+Rx+RawRepresentable.swift\"; sourceTree = \"<group>\"; };\n\t\tD4A33E97EE17B95FCE36DEBE7ACE03F3 /* Result-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"Result-dummy.m\"; sourceTree = \"<group>\"; };\n\t\tD52211FFC97D4BB7CF97DA504F823D77 /* MJRefresh-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"MJRefresh-dummy.m\"; sourceTree = \"<group>\"; };\n\t\tD57C9A2A08ACCD09288F0F61A6D87B43 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tD58AEC2CC3F21D23D64B1106A4C82CA2 /* IQKeyboardManager.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"wrapper.plug-in\"; name = IQKeyboardManager.bundle; path = IQKeyboardManagerSwift/Resources/IQKeyboardManager.bundle; sourceTree = \"<group>\"; };\n\t\tD5B52B71645C13D27A3C4B3A58EA2440 /* RxGesture.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxGesture.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tD609A4B215C782073049E462F652D85D /* TYTabPagerBarCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = TYTabPagerBarCell.h; path = TYPagerControllerDemo/TYPagerController/TabPager/TYTabPagerBarCell.h; sourceTree = \"<group>\"; };\n\t\tD69D61C111C8F4287DFE589110A04EA4 /* UIAlertAction+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIAlertAction+Rx.swift\"; path = \"RxCocoa/iOS/UIAlertAction+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tD6AD0538BC7F97DC3694296C53DBE9C8 /* Then-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"Then-dummy.m\"; sourceTree = \"<group>\"; };\n\t\tD71887F7534D1360E1CF05E79FDAC471 /* Stub.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Stub.swift; path = Sources/ReactorKit/Stub.swift; sourceTree = \"<group>\"; };\n\t\tD76F782371F7D6EF97DE209867481EA5 /* HistoricalSchedulerTimeConverter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HistoricalSchedulerTimeConverter.swift; path = RxSwift/Schedulers/HistoricalSchedulerTimeConverter.swift; sourceTree = \"<group>\"; };\n\t\tD783020743D1A18018EE614D78D965A2 /* URLNavigator-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"URLNavigator-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\tD819115F4043DA9F9126B97A2AAD84BD /* UIPickerView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIPickerView+Rx.swift\"; path = \"RxCocoa/iOS/UIPickerView+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tD85A799653D3BC7BA7BDB6BD691336F8 /* URLRequest+Encoding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"URLRequest+Encoding.swift\"; path = \"Sources/Moya/URLRequest+Encoding.swift\"; sourceTree = \"<group>\"; };\n\t\tD8FDDBEBD3900E6B6B3DE7D9D96C0CFA /* URLSession+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"URLSession+Rx.swift\"; path = \"RxCocoa/Foundation/URLSession+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tD94169655CF6B1F44A9F5A11128DFBB5 /* UINavigationController+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UINavigationController+Rx.swift\"; path = \"RxCocoa/iOS/UINavigationController+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tDA67E4E3F08A96BF5B2596ED0FC34196 /* DefaultIfEmpty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DefaultIfEmpty.swift; path = RxSwift/Observables/DefaultIfEmpty.swift; sourceTree = \"<group>\"; };\n\t\tDA8C0C17C65F493BBDD9F7C413C2C378 /* IdentifiableValue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IdentifiableValue.swift; path = Sources/Differentiator/IdentifiableValue.swift; sourceTree = \"<group>\"; };\n\t\tDA9C2D5FD4A6E72AF207648A0646DCCF /* RxCollectionViewDataSourceType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCollectionViewDataSourceType.swift; path = RxCocoa/iOS/Protocols/RxCollectionViewDataSourceType.swift; sourceTree = \"<group>\"; };\n\t\tDB2A4AE8B923CFBB0D0531CB91C712CE /* MJRefresh.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = MJRefresh.xcconfig; sourceTree = \"<group>\"; };\n\t\tDB7464D95C191D51D7944010316440FF /* Response.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Response.swift; path = Sources/Moya/Response.swift; sourceTree = \"<group>\"; };\n\t\tDB98DBDF6250E6EDD9D4711CCA72CDE3 /* URLMatcher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLMatcher.swift; path = Sources/URLMatcher/URLMatcher.swift; sourceTree = \"<group>\"; };\n\t\tDBF02AD8B77821AA7137D153FD7D26DC /* UIImageView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIImageView+Rx.swift\"; path = \"RxCocoa/iOS/UIImageView+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tDC01CD4F0AF25E87AE052DB77D446F12 /* MJRefreshBackNormalFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshBackNormalFooter.m; path = MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m; sourceTree = \"<group>\"; };\n\t\tDC30C48A2548E77051CB43345238F5E4 /* MultipartFormData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipartFormData.swift; path = Source/MultipartFormData.swift; sourceTree = \"<group>\"; };\n\t\tDC3268ED5E6ABB0ABCDEEE48CE0CD78F /* NetworkReachabilityManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NetworkReachabilityManager.swift; path = Source/NetworkReachabilityManager.swift; sourceTree = \"<group>\"; };\n\t\tDD1C4965E4534F094C7E5D0417A804AC /* DistinctUntilChanged.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DistinctUntilChanged.swift; path = RxSwift/Observables/DistinctUntilChanged.swift; sourceTree = \"<group>\"; };\n\t\tDD71B5E50804962A47932EB53600027A /* Moya+Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"Moya+Alamofire.swift\"; path = \"Sources/Moya/Moya+Alamofire.swift\"; sourceTree = \"<group>\"; };\n\t\tDD77C22F0E17F82C01E907DC393087DA /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tDD7CFB953733E5734A907460B2C40BCE /* ReusableKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"ReusableKit-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\tDE17B34AF63AF3BB97075A6D295FDCB3 /* RxAlamofire-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"RxAlamofire-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\tDE28FDBE90B525AD5F5FF81C344D3D2A /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tDE2A6BA18853C4598D21FDBBD902BD32 /* IQKeyboardManagerSwift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"sourcecode.module-map\"; path = IQKeyboardManagerSwift.modulemap; sourceTree = \"<group>\"; };\n\t\tDE31A7BD0FFA90C66DA1DEBAD573E053 /* UILabel+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UILabel+Rx.swift\"; path = \"RxCocoa/iOS/UILabel+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tDE50048633BEA4A961DBEE8DC7631174 /* SwiftyColor.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"sourcecode.module-map\"; path = SwiftyColor.modulemap; sourceTree = \"<group>\"; };\n\t\tDEB5737B2DA2DF3423F29C0CBB7542DA /* Range.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Range.swift; path = RxSwift/Observables/Range.swift; sourceTree = \"<group>\"; };\n\t\tE00D0BE5D24B8BDE0B2711827A346D65 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tE010BA57C8A6D94C6A65D63FA871BFCB /* RxGesture-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"RxGesture-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\tE018F18F377B9190734B1D9EB8160AD7 /* Skip.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Skip.swift; path = RxSwift/Observables/Skip.swift; sourceTree = \"<group>\"; };\n\t\tE02E53CE029ADA867E576C62B9054390 /* RxAlamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxAlamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tE031F5913ADD2E4B2FE376BDDB99068C /* RxDataSources-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"RxDataSources-dummy.m\"; sourceTree = \"<group>\"; };\n\t\tE03BFCA5D027189D74E5502CC0D58735 /* Logging.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Logging.swift; path = RxCocoa/Foundation/Logging.swift; sourceTree = \"<group>\"; };\n\t\tE127D4A1CC515D5A1562D756ADE9089E /* ShareReplayScope.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ShareReplayScope.swift; path = RxSwift/Observables/ShareReplayScope.swift; sourceTree = \"<group>\"; };\n\t\tE168570235239A51FCD669B5E01BD944 /* TTRangeSlider.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = TTRangeSlider.xcconfig; sourceTree = \"<group>\"; };\n\t\tE1D44E21411F23F3505F31B444A1A104 /* TYCyclePagerView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = TYCyclePagerView.m; path = TYCyclePagerViewDemo/TYCyclePagerView/TYCyclePagerView.m; sourceTree = \"<group>\"; };\n\t\tE3508AF1777C25C4BC5CE6002832B9BF /* RxCollectionViewDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCollectionViewDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxCollectionViewDelegateProxy.swift; sourceTree = \"<group>\"; };\n\t\tE4051F928839DBFCB64F5087D54C40E3 /* CombineLatest+Collection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"CombineLatest+Collection.swift\"; path = \"RxSwift/Observables/CombineLatest+Collection.swift\"; sourceTree = \"<group>\"; };\n\t\tE415D1E19F77D7279C5F140411D69E67 /* First.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = First.swift; path = RxSwift/Observables/First.swift; sourceTree = \"<group>\"; };\n\t\tE417881CF3E530ABBE356AD806F81649 /* Materialize.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Materialize.swift; path = RxSwift/Observables/Materialize.swift; sourceTree = \"<group>\"; };\n\t\tE420D6F4781A96E122D216CBDA976615 /* MainScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MainScheduler.swift; path = RxSwift/Schedulers/MainScheduler.swift; sourceTree = \"<group>\"; };\n\t\tE4373BBA3EC79125E217AF8056418360 /* MJRefreshBackFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackFooter.h; path = MJRefresh/Base/MJRefreshBackFooter.h; sourceTree = \"<group>\"; };\n\t\tE441DE19DC813E660F49CCA5AF0FA3F5 /* EnumOperators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EnumOperators.swift; path = Sources/EnumOperators.swift; sourceTree = \"<group>\"; };\n\t\tE4CFC30F3E8C50C2772DDC74F2AC0626 /* TYCyclePagerView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = \"TYCyclePagerView-dummy.m\"; sourceTree = \"<group>\"; };\n\t\tE5D465BD6EB72259B11615DB9761D3DB /* MultipartFormData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipartFormData.swift; path = Sources/Moya/MultipartFormData.swift; sourceTree = \"<group>\"; };\n\t\tE6BE51ED2DAF09F29A0DDADC0911D49B /* RxTableViewReactiveArrayDataSource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTableViewReactiveArrayDataSource.swift; path = RxCocoa/iOS/DataSources/RxTableViewReactiveArrayDataSource.swift; sourceTree = \"<group>\"; };\n\t\tE6D2C080BD70A34F38B01F04F8C066D6 /* SharedTypes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SharedTypes.swift; path = Pod/Classes/SharedTypes.swift; sourceTree = \"<group>\"; };\n\t\tE6F687744CD01C74158C6A8CA1C9B497 /* MJRefreshAutoStateFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoStateFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.m; sourceTree = \"<group>\"; };\n\t\tE7023AE71AB1962FA73C0D900E6564BE /* Validation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Validation.swift; path = Source/Validation.swift; sourceTree = \"<group>\"; };\n\t\tE74A11FE1DBDB7EA6BDB703F6B58F460 /* Do.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Do.swift; path = RxSwift/Observables/Do.swift; sourceTree = \"<group>\"; };\n\t\tE75CBFE107A4EA81EDD844CA7F371A0B /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tE800F1732A0D7B4A6640BE266F14DDC8 /* _RXKVOObserver.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RXKVOObserver.h; path = RxCocoa/Runtime/include/_RXKVOObserver.h; sourceTree = \"<group>\"; };\n\t\tE8D611801824EEACA86E5FF945882746 /* RxAlamofire.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"sourcecode.module-map\"; path = RxAlamofire.modulemap; sourceTree = \"<group>\"; };\n\t\tE8D6DDBD1576F25B98F7059832A190A3 /* Pods-RxXMLY-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = \"Pods-RxXMLY-resources.sh\"; sourceTree = \"<group>\"; };\n\t\tE915131DA668033B6756FDE94DD6C130 /* SwiftyJSON.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftyJSON.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tE91D5BAB4A332A7524C3625B57B61925 /* ObservableConvertibleType+Signal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"ObservableConvertibleType+Signal.swift\"; path = \"RxCocoa/Traits/Signal/ObservableConvertibleType+Signal.swift\"; sourceTree = \"<group>\"; };\n\t\tE9246ADE8730ABD21F1BBC59333EA31E /* RxCocoa.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxCocoa.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tE99B4913C9AF498445CF9BB785FFBFFF /* TYPageControl.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = TYPageControl.m; path = TYCyclePagerViewDemo/TYCyclePagerView/TYPageControl.m; sourceTree = \"<group>\"; };\n\t\tE9A37A86FC5231B8DFC0C17337CC40F5 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tEA3EFB292391C42C14DBF00E49C533EC /* NSBundle+MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = \"NSBundle+MJRefresh.h\"; path = \"MJRefresh/NSBundle+MJRefresh.h\"; sourceTree = \"<group>\"; };\n\t\tEA47B9E0DFFD8D15F19F5033E63B9026 /* CurrentThreadScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CurrentThreadScheduler.swift; path = RxSwift/Schedulers/CurrentThreadScheduler.swift; sourceTree = \"<group>\"; };\n\t\tEAAE74B8E84AC1A31796559B46480858 /* RecursiveLock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecursiveLock.swift; path = Platform/RecursiveLock.swift; sourceTree = \"<group>\"; };\n\t\tEC29C744A1F98EEA2D40646969A57510 /* DataTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DataTransform.swift; path = Sources/DataTransform.swift; sourceTree = \"<group>\"; };\n\t\tEC5873F3553D2C072C19D661AA844D1C /* MJRefreshAutoGifFooter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = MJRefreshAutoGifFooter.m; path = MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.m; sourceTree = \"<group>\"; };\n\t\tEC5D50260AEE66CC8FD97C3CF9E10E7F /* Then.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Then.xcconfig; sourceTree = \"<group>\"; };\n\t\tEC766D153E5F9EEED025A6A61E553812 /* MJRefresh.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = \"sourcecode.module-map\"; path = MJRefresh.modulemap; sourceTree = \"<group>\"; };\n\t\tEC8A134B3C9407540FCDEC584183133D /* Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Rx.swift; path = RxSwift/Rx.swift; sourceTree = \"<group>\"; };\n\t\tECECB25BC65301EB453951C200FFCD22 /* RxSwift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"RxSwift-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\tEDA69717822ACCAAF367E9F539039219 /* AsMaybe.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsMaybe.swift; path = RxSwift/Observables/AsMaybe.swift; sourceTree = \"<group>\"; };\n\t\tEE68236572EEA4E94A38244743901FE9 /* UIScrollView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIScrollView+Rx.swift\"; path = \"RxCocoa/iOS/UIScrollView+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tEF04BEEB09DE1352D9F767144EF0FD50 /* ScheduledDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledDisposable.swift; path = RxSwift/Disposables/ScheduledDisposable.swift; sourceTree = \"<group>\"; };\n\t\tEFD5B31121E42968628607F4CA11A4BC /* Differentiator.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Differentiator.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tF01E5E91EC940C05D243E33611C9CA5C /* SnapKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"SnapKit-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\tF03D2DC1D0CBA5B7FB557A21D0DA5771 /* TransformOperators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransformOperators.swift; path = Sources/TransformOperators.swift; sourceTree = \"<group>\"; };\n\t\tF0758B65380EFC2497BC08F9A7E4F402 /* DisposeBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DisposeBase.swift; path = RxSwift/Disposables/DisposeBase.swift; sourceTree = \"<group>\"; };\n\t\tF08868A7AD5BECFD90CC22A62671DC82 /* SerialDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SerialDisposable.swift; path = RxSwift/Disposables/SerialDisposable.swift; sourceTree = \"<group>\"; };\n\t\tF1AC2191C0BA5AC761428DAD97E25B05 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tF1D0EF5DC8B377434B4B9FAA777B65E0 /* MJRefreshBackNormalFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackNormalFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.h; sourceTree = \"<group>\"; };\n\t\tF28EC587F2484F4548370BCE6AA22C0C /* UIDatePicker+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIDatePicker+Rx.swift\"; path = \"RxCocoa/iOS/UIDatePicker+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tF293CCDAB139CAA1824ACDC4BB8DE2EA /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tF364B3A757735A453DB16E22F1A2D52A /* Lock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Lock.swift; path = RxSwift/Concurrency/Lock.swift; sourceTree = \"<group>\"; };\n\t\tF384E81160731D07A8472A16F0EF1EFD /* Bag+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"Bag+Rx.swift\"; path = \"RxSwift/Extensions/Bag+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tF3AFC24D86F7304F0B4AF511C9B9970A /* NSDecimalNumberTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NSDecimalNumberTransform.swift; path = Sources/NSDecimalNumberTransform.swift; sourceTree = \"<group>\"; };\n\t\tF4851621D756478D43208A461240D7CF /* ISO8601DateTransform.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ISO8601DateTransform.swift; path = Sources/ISO8601DateTransform.swift; sourceTree = \"<group>\"; };\n\t\tF4E3F42EFB30F56006250129E4BF5ABF /* TYPagerController-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"TYPagerController-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\tF4F172EFA622B78B8E948E1F153B1BDD /* Task.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Task.swift; path = Sources/Moya/Task.swift; sourceTree = \"<group>\"; };\n\t\tF5367CAC7283271F0E12047EE1E54190 /* DispatchQueue+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"DispatchQueue+Extensions.swift\"; path = \"Platform/DispatchQueue+Extensions.swift\"; sourceTree = \"<group>\"; };\n\t\tF570C010C51F2EDFA2B29E61A28988D2 /* Signal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Signal.swift; path = RxCocoa/Traits/Signal/Signal.swift; sourceTree = \"<group>\"; };\n\t\tF5EB9FACBAF778C2D7E39429AAFFADE7 /* ConstraintAttributes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintAttributes.swift; path = Source/ConstraintAttributes.swift; sourceTree = \"<group>\"; };\n\t\tF6367B989A05CB68EFF4B1822D8DB33E /* UITextView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UITextView+Rx.swift\"; path = \"RxCocoa/iOS/UITextView+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tF68D0C4E903F4B9E77676032554A5278 /* Placeholder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Placeholder.swift; path = Sources/Placeholder.swift; sourceTree = \"<group>\"; };\n\t\tF71B53FF12451C5503271983A3FE932B /* Then-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Then-umbrella.h\"; sourceTree = \"<group>\"; };\n\t\tF728D985BB2068A70834B0E454690223 /* NSTextStorage+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"NSTextStorage+Rx.swift\"; path = \"RxCocoa/iOS/NSTextStorage+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tF73232742568F2DC4E279896B22BA8A3 /* TransformType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransformType.swift; path = Sources/TransformType.swift; sourceTree = \"<group>\"; };\n\t\tF76E37DE05B72E5ACE3CC2FEA524DC00 /* UIScrollView+MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = \"UIScrollView+MJRefresh.h\"; path = \"MJRefresh/UIScrollView+MJRefresh.h\"; sourceTree = \"<group>\"; };\n\t\tF79A80A6FF76E139A757BFA4110503E7 /* KVORepresentable+Swift.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"KVORepresentable+Swift.swift\"; path = \"RxCocoa/Foundation/KVORepresentable+Swift.swift\"; sourceTree = \"<group>\"; };\n\t\tF7B06E614268F88A37528BE5B8A08933 /* NotificationCenter+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"NotificationCenter+Rx.swift\"; path = \"RxCocoa/Foundation/NotificationCenter+Rx.swift\"; sourceTree = \"<group>\"; };\n\t\tF9218E907F18A770B1DFDE2EDEAA3480 /* MJRefreshBackStateFooter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefreshBackStateFooter.h; path = MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.h; sourceTree = \"<group>\"; };\n\t\tF9B85640D4BCBBFE6662A71B6EE98AE9 /* ReplaySubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReplaySubject.swift; path = RxSwift/Subjects/ReplaySubject.swift; sourceTree = \"<group>\"; };\n\t\tFA64F8A7EA7F1D019BA4637FA772850D /* TYTabPagerBarLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = TYTabPagerBarLayout.m; path = TYPagerControllerDemo/TYPagerController/TabPager/TYTabPagerBarLayout.m; sourceTree = \"<group>\"; };\n\t\tFB352C9155E142C44FAE86885DBC3E62 /* IQUIScrollView+Additions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"IQUIScrollView+Additions.swift\"; path = \"IQKeyboardManagerSwift/Categories/IQUIScrollView+Additions.swift\"; sourceTree = \"<group>\"; };\n\t\tFB6BED57753CCBC597942DFD41588338 /* Then.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Then.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tFB757B34331F94A8CE2ABFE0AC0050D4 /* ImageDownloader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageDownloader.swift; path = Sources/ImageDownloader.swift; sourceTree = \"<group>\"; };\n\t\tFB8C71D5C39C423BB61425ABDC60B40B /* UIScrollView+MJExtension.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = \"UIScrollView+MJExtension.h\"; path = \"MJRefresh/UIScrollView+MJExtension.h\"; sourceTree = \"<group>\"; };\n\t\tFC0E5E64017E2B544B9C4365BF0DBBF5 /* KVORepresentable+CoreGraphics.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"KVORepresentable+CoreGraphics.swift\"; path = \"RxCocoa/Foundation/KVORepresentable+CoreGraphics.swift\"; sourceTree = \"<group>\"; };\n\t\tFC57AF3FEB7D99891C6F7BD5610269D7 /* MJRefresh.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = MJRefresh.h; path = MJRefresh/MJRefresh.h; sourceTree = \"<group>\"; };\n\t\tFCA359E28EBA408A36C0296FA25A6731 /* ConstraintInsets.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintInsets.swift; path = Source/ConstraintInsets.swift; sourceTree = \"<group>\"; };\n\t\tFD5F22C193A3AD6545BDE4B91729668D /* UIScreenEdgePanGestureRecognizer+RxGesture.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"UIScreenEdgePanGestureRecognizer+RxGesture.swift\"; path = \"Pod/Classes/iOS/UIScreenEdgePanGestureRecognizer+RxGesture.swift\"; sourceTree = \"<group>\"; };\n\t\tFDD6B542F72BB78245FF7A817E211A9D /* TYCyclePagerView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"TYCyclePagerView-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\tFE2F015C7CCD3096659FF2450B75E15F /* Result-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = \"Result-prefix.pch\"; sourceTree = \"<group>\"; };\n\t\tFE622F585E2DE18232A22FD2E069BE75 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tFF01C2ED8BF6578C8212FD3EAC90D3E2 /* Completable+AndThen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = \"Completable+AndThen.swift\"; path = \"RxSwift/Traits/Completable+AndThen.swift\"; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t0342A957F1A5702D324BDF4037D7D6B3 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tEE7B1C447D0CF446C179EA74E5646A94 /* Foundation.framework in Frameworks */,\n\t\t\t\tB14375A0B7445CA462819C7468B3EF21 /* UIKit.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t1AAD91176E5F5F9AD062AD678F6746E4 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tA2D9F9EFFDFE9C19DA842E826B06BCEB /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t1E430C90A89892CE9179EEDDCBFED27E /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tAC1E75DFB1009851DBAA58FF21A18D95 /* Foundation.framework in Frameworks */,\n\t\t\t\t8D70BCBAC4C9EBC91472AB223B7485AE /* RxSwift.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t23AD706635149AE5F75579590BA4B09C /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tEADFC7E11D0CCEE93B2F2B90B02C8CF7 /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t23D3B010AD4A853FE7ED1D97A480065F /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t5539A3CD2B653BA23D68AED9ADEA40C5 /* Alamofire.framework in Frameworks */,\n\t\t\t\tDB912D996DC177901DACA697F2EF96F9 /* Foundation.framework in Frameworks */,\n\t\t\t\t5B72B69DD603A056FE26772F3CFD56E8 /* Result.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2CCEFAA691F3229A3313687F2CC6981E /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tE3EF505A67060CFB3E503F5B79D6E909 /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2E345FD99987A0C2F53C3EB5089F2023 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t55F024586B17FD47A9D6CACB88B6BED3 /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2E911FDC90F1E7ACD11F0B68CC7B1FCA /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tE272024F3BB38967141313D5CB8E4120 /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t31195B5F7226702168F8D241576F56D5 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t5C11C8A05966C040DCDE2E2B1B0C8D7A /* Foundation.framework in Frameworks */,\n\t\t\t\tBADF32BF243CAB2D89D072A0C2A9D791 /* RxCocoa.framework in Frameworks */,\n\t\t\t\t03649B1E46C35FC5D9BC8CE4EFC3AF5D /* RxSwift.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t4B7C72EFD055B004BD8D36238863B2D5 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tDBCCE10306122D22ABD5132028DEC06B /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t5642B75CBC2CCDA7E44A7707DD089AF1 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t34E6139A80CA53099913276CC5157304 /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t674E18361DBF81F73164E63E79DDC140 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t29AEA44F673962935BCE359544C2EE0D /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t69C6F60DD2457704809BD1D3D4543AD9 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD9EAAE4A13D0E04E0557CA100CE0A2BF /* Foundation.framework in Frameworks */,\n\t\t\t\t7335E13169D3E91E60ABF132EE768E99 /* RxSwift.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t73BF36D607B79591CC85E897840E2802 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tE77D52EE7D897833F4A8441A8F2477B5 /* Alamofire.framework in Frameworks */,\n\t\t\t\t2A7AE49F85F20FEDA1833CAB32D7933D /* Foundation.framework in Frameworks */,\n\t\t\t\t7F47526A3CC008FF7F1D3232D3435559 /* RxSwift.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t748266AA260D6CE008E3FF2C76A52D04 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t089250578AFBD4AD861843847252D462 /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t7981EDCD0900235B2B3D12DBC172DB34 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t4546CA3500EDD39DBE8AD016CD79BDFC /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t81A5C814ACEB86CB06CD6C51383982FE /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tBB04209DDB72CD325AE09D2EC3EBC380 /* CoreGraphics.framework in Frameworks */,\n\t\t\t\tA25F717B5E0C4E6A6DE933B0BF0F6417 /* Foundation.framework in Frameworks */,\n\t\t\t\t81A2F975614A9B94F265CD3BA816B0A4 /* QuartzCore.framework in Frameworks */,\n\t\t\t\tEE20C85515D53DE61D8435080677F58E /* UIKit.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t943D1D0C588FD46C297C76EB927A6963 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t47C3E46E339F974D2B413D2F96BD02B7 /* Differentiator.framework in Frameworks */,\n\t\t\t\tF740D92AE1DF1156C9BE899D7A4FE12A /* Foundation.framework in Frameworks */,\n\t\t\t\t89DB813358F7013E9E1AAA822417FE86 /* RxCocoa.framework in Frameworks */,\n\t\t\t\tC2F4A31052D8F8C636829A7109A45DB2 /* RxSwift.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t99195E4207764744AEC07ECCBCD550EB /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t73B9C996AED49ED7CF8EC2A6F1738059 /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tAABC11B0DB149687903FAC188E5420A1 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2BF0E4469C13CAA14361A3D5B07E1706 /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tC0B9722E352CF90C920286E6F029D3C0 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t52416A6AC7387ECACCC45596498D96AD /* CFNetwork.framework in Frameworks */,\n\t\t\t\t0CA6357476373C221D44C498AA1D65FE /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tC4F4068871A73EB6FBE8042AF2063595 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t78C198E9BB56FB59BD494C8FA759645B /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tC9E038B57740EF2F804D34B1C9393F02 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t019D5A551A09E129AE3D95BCB378028E /* Foundation.framework in Frameworks */,\n\t\t\t\tAB9F26D130FF443CBE0DA2ADE2E27479 /* RxCocoa.framework in Frameworks */,\n\t\t\t\tC084E86C68138F0227379212201B1D11 /* RxSwift.framework in Frameworks */,\n\t\t\t\t51D96676F916DC1EB1EEA5F91481E01C /* UIKit.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tE14E1AD13C72905A9744DCFC4CB6754B /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tC446D343DA5F7767B64807C921A7BA4A /* Foundation.framework in Frameworks */,\n\t\t\t\tE37B94CD6DB302F6D233BD878772B868 /* RxSwift.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tE6817D3D95D3783EE1F540DE3EA42D19 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t0C83C395557B207600B4BFEFB71F662D /* Foundation.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t0065A8C3C82D11C680574000E0D0A173 /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t2382EF1B0260B04756F14D3A5B99D192 /* Info.plist */,\n\t\t\t\t4C467041F0E9683A1B964FB3053EFBD7 /* TYCyclePagerView.modulemap */,\n\t\t\t\t9CEA02DF9281493AB02811A381B532ED /* TYCyclePagerView.xcconfig */,\n\t\t\t\tE4CFC30F3E8C50C2772DDC74F2AC0626 /* TYCyclePagerView-dummy.m */,\n\t\t\t\tFDD6B542F72BB78245FF7A817E211A9D /* TYCyclePagerView-prefix.pch */,\n\t\t\t\tA5E925D1347A4A7AE44D07D3342D1BCB /* TYCyclePagerView-umbrella.h */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/TYCyclePagerView\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t00B445FBF5C55D58619DD22ADD326E0B /* RxAlamofire */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC2E4BC97956884C852E7E3676114F4CD /* Core */,\n\t\t\t\tEEBFA1F60BB4035823034A2E49888E19 /* Support Files */,\n\t\t\t);\n\t\t\tpath = RxAlamofire;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t013689684E64F7EE37E9EED321657B7F /* SnapKit */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t52A0824858ABB06E40B1588D14FF9498 /* Constraint.swift */,\n\t\t\t\tF5EB9FACBAF778C2D7E39429AAFFADE7 /* ConstraintAttributes.swift */,\n\t\t\t\tD2A7C9B0E3259DE8E0442244250D596F /* ConstraintConfig.swift */,\n\t\t\t\t5D28FC1E29A3FEC5D1CF82FC68A09E26 /* ConstraintConstantTarget.swift */,\n\t\t\t\t5CB1A48DF38EB6B4A32ADD9DF79B73FF /* ConstraintDescription.swift */,\n\t\t\t\t4A6B64332C20EFFA0F9444871E3166E2 /* ConstraintDSL.swift */,\n\t\t\t\tFCA359E28EBA408A36C0296FA25A6731 /* ConstraintInsets.swift */,\n\t\t\t\t610AEB49CFD63698A27742F484C3B01B /* ConstraintInsetTarget.swift */,\n\t\t\t\t10DC35A2E29CA2B46E24A2F022E9163B /* ConstraintItem.swift */,\n\t\t\t\t4086B02C434EDF398B3DEAC9194E36E9 /* ConstraintLayoutGuide.swift */,\n\t\t\t\t46E1355C3CBDC013D697081398F8B462 /* ConstraintLayoutGuide+Extensions.swift */,\n\t\t\t\t434BF576D15902B83DA5D893260FA1D6 /* ConstraintLayoutGuideDSL.swift */,\n\t\t\t\tB20C215CD03F9EC325B96AD2A4621096 /* ConstraintLayoutSupport.swift */,\n\t\t\t\t705EED60B52573B696D1FD8B6CB52FC2 /* ConstraintLayoutSupportDSL.swift */,\n\t\t\t\t424B56D99302A846FFD60288ED3225A3 /* ConstraintMaker.swift */,\n\t\t\t\t222AACF264926205DACCB10D9C8464D7 /* ConstraintMakerEditable.swift */,\n\t\t\t\t0768925949DA79DC0DB78B89D10ECB45 /* ConstraintMakerExtendable.swift */,\n\t\t\t\t83F0BF62BA5033111F22B49D2DA78D30 /* ConstraintMakerFinalizable.swift */,\n\t\t\t\t8F92102426225DFFC6D512690BD4167B /* ConstraintMakerPriortizable.swift */,\n\t\t\t\t1FA2A35E8B50492B40B48AC0A94A8904 /* ConstraintMakerRelatable.swift */,\n\t\t\t\t1B6E2178443AA8FE2901D19303B3B8F9 /* ConstraintMultiplierTarget.swift */,\n\t\t\t\t7E2E1626B3D838551A7744F976FEB850 /* ConstraintOffsetTarget.swift */,\n\t\t\t\tD1CF8E77098D7789AB0555F960E5B430 /* ConstraintPriority.swift */,\n\t\t\t\t7B37D88DF834AFA3231D9F6EF76598D8 /* ConstraintPriorityTarget.swift */,\n\t\t\t\t328686532CB38406B7BB3A32945B6474 /* ConstraintRelatableTarget.swift */,\n\t\t\t\t1C458E0D7CD6F0DD83AC852BC8419AD7 /* ConstraintRelation.swift */,\n\t\t\t\t81B1BE2330946471DDB4A3A11D43E0B8 /* ConstraintView.swift */,\n\t\t\t\t02ACAB88021BEBB2FCA8B6883F2CE332 /* ConstraintView+Extensions.swift */,\n\t\t\t\tA468830C4A1700A0C17545C662543173 /* ConstraintViewDSL.swift */,\n\t\t\t\t1D315F44377FFD3AEDE15898C2971BEC /* Debugging.swift */,\n\t\t\t\t553E666C8126DEAEA023EE677226741F /* LayoutConstraint.swift */,\n\t\t\t\tB00A5B87228E30280657500960598B59 /* LayoutConstraintItem.swift */,\n\t\t\t\t1EE2A49804E43DA5A796136D1D79109F /* Typealiases.swift */,\n\t\t\t\t01A8496A2160E940A6246AB063ADFA02 /* UILayoutSupport+Extensions.swift */,\n\t\t\t\tC87EF0D2F5E72ED8D8AE2A78F9590FBF /* Support Files */,\n\t\t\t);\n\t\t\tpath = SnapKit;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t02CB0B03CB75DEE740DEEDAFC9A4B34D /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA1A112A635DA48EF8CB77AF4F3AE614D /* Alamofire.framework */,\n\t\t\t\tA7F044D3460E87057EB82CCDD5C4D545 /* Differentiator.framework */,\n\t\t\t\t266FFDCA364C275317DA17C75FA9B1B3 /* Result.framework */,\n\t\t\t\t77AB7A6BBF44C678FD2D852835009017 /* RxCocoa.framework */,\n\t\t\t\tDE28FDBE90B525AD5F5FF81C344D3D2A /* RxSwift.framework */,\n\t\t\t\tD5050FC1A785C83B3ADD912414E51051 /* iOS */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0E9D9F01EDD13FD4E5C0AB6FD5BB2A5A /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB6C6A5E1D3112FA5320C2F8509A9ADD7 /* Info.plist */,\n\t\t\t\t74418F5529BCA8630BE486D0F6A76D6C /* TTRangeSlider.modulemap */,\n\t\t\t\tE168570235239A51FCD669B5E01BD944 /* TTRangeSlider.xcconfig */,\n\t\t\t\tA27C7B9B2AA2EBC3F3078495A3B4B248 /* TTRangeSlider-dummy.m */,\n\t\t\t\t9DB0EFCE41B9CC2A562FFA3E9B2C8CD1 /* TTRangeSlider-prefix.pch */,\n\t\t\t\t18601CAC220AFC4C4A67E4C19A37FA0C /* TTRangeSlider-umbrella.h */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/TTRangeSlider\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1064728F3888D15A87C94E495EFE16CC /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t0A7149E89BECF86F1AE3C3567AB16589 /* MJRefresh.bundle */,\n\t\t\t);\n\t\t\tname = Resources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t125AE60B5B1A09953287C270122642EE /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD58AEC2CC3F21D23D64B1106A4C82CA2 /* IQKeyboardManager.bundle */,\n\t\t\t);\n\t\t\tname = Resources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t19AF7A80FF7FACF9DA96ECF7C6C84AE6 /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3565F6A3B549B0D54D7B9937CBDF22F5 /* Info.plist */,\n\t\t\t\t6C6A3B044CC344E98ACD7182BCE0685D /* TYPagerController.modulemap */,\n\t\t\t\t50A9B85F6C0935020B51702CEF26AC84 /* TYPagerController.xcconfig */,\n\t\t\t\tBC0C35EACA9CABA73CF6D660DB55A64A /* TYPagerController-dummy.m */,\n\t\t\t\t9158E32ACD5A2977E6DE91E13F5C7A66 /* TYPagerController-prefix.pch */,\n\t\t\t\tF4E3F42EFB30F56006250129E4BF5ABF /* TYPagerController-umbrella.h */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/TYPagerController\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B1EA4443A2498E941CD029F27E9639D /* RxSwift */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB1D09ED075CFA4F5069E951F7B848972 /* UICollectionView+RxReusableKit.swift */,\n\t\t\t\t7B3743F6F50232B4A27328B734F963F8 /* UITableView+RxReusableKit.swift */,\n\t\t\t);\n\t\t\tname = RxSwift;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t22A086CB1B582E984EBA7863AED9A385 /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5459AEC7839E1C793C220140241E6CD8 /* Info.plist */,\n\t\t\t\t4629139792CEE6CCF32F59002002790D /* RxCocoa.modulemap */,\n\t\t\t\t351B9B4056B3818966E04C76590FC3B7 /* RxCocoa.xcconfig */,\n\t\t\t\t58D1D78FFF97A04C18826C9383B3DFBD /* RxCocoa-dummy.m */,\n\t\t\t\t0E79B5AC02467F0FC951B7F0808BE955 /* RxCocoa-prefix.pch */,\n\t\t\t\tAF9EE6B5C17353C6D306E650D41F6A57 /* RxCocoa-umbrella.h */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/RxCocoa\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t24DBE0B1E85B2506F4E5B030BBFE143F /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD57C9A2A08ACCD09288F0F61A6D87B43 /* Info.plist */,\n\t\t\t\tA212CBEA9196364FF0A6F2FA43D9CE76 /* ReactorKit.modulemap */,\n\t\t\t\t319F0938C83A11D7010E8A6B1A8BC27E /* ReactorKit.xcconfig */,\n\t\t\t\t6EADA7DDE939B839BF4574A8A38504C9 /* ReactorKit-dummy.m */,\n\t\t\t\tC2617565C24877EE61A697C90E5405A2 /* ReactorKit-prefix.pch */,\n\t\t\t\t1BC61193B3F56535040C0A61FA71C455 /* ReactorKit-umbrella.h */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/ReactorKit\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t2A11EEEC2D225026B3E7D7223F9F7A6F /* MJRefresh */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFC57AF3FEB7D99891C6F7BD5610269D7 /* MJRefresh.h */,\n\t\t\t\t38B56F8F2AC8700738ABD303DD4F3606 /* MJRefreshAutoFooter.h */,\n\t\t\t\t23859CF12D4131E1E0B8B0209A00B878 /* MJRefreshAutoFooter.m */,\n\t\t\t\t1A0EE75F34E2C1B1E6254873E3066CEA /* MJRefreshAutoGifFooter.h */,\n\t\t\t\tEC5873F3553D2C072C19D661AA844D1C /* MJRefreshAutoGifFooter.m */,\n\t\t\t\t40B36A7D5D671C2D2DCB124A4EE87A87 /* MJRefreshAutoNormalFooter.h */,\n\t\t\t\t0D076E9D89814329C802E72B0C0229A2 /* MJRefreshAutoNormalFooter.m */,\n\t\t\t\t44409A050584D330FC1B6F6D3CD9B53E /* MJRefreshAutoStateFooter.h */,\n\t\t\t\tE6F687744CD01C74158C6A8CA1C9B497 /* MJRefreshAutoStateFooter.m */,\n\t\t\t\tE4373BBA3EC79125E217AF8056418360 /* MJRefreshBackFooter.h */,\n\t\t\t\t6D4BA91A34AD8C308124A2BAC574B3B9 /* MJRefreshBackFooter.m */,\n\t\t\t\tB7AB99038CF5A8302F1BE2D35B09885A /* MJRefreshBackGifFooter.h */,\n\t\t\t\t43F0F183E8964F9C8D16E30F45CF6844 /* MJRefreshBackGifFooter.m */,\n\t\t\t\tF1D0EF5DC8B377434B4B9FAA777B65E0 /* MJRefreshBackNormalFooter.h */,\n\t\t\t\tDC01CD4F0AF25E87AE052DB77D446F12 /* MJRefreshBackNormalFooter.m */,\n\t\t\t\tF9218E907F18A770B1DFDE2EDEAA3480 /* MJRefreshBackStateFooter.h */,\n\t\t\t\t0BF9B78A8693992A08F4F159CCDE50CA /* MJRefreshBackStateFooter.m */,\n\t\t\t\t91EFB17C939EB1CE9FDE66074D20AA83 /* MJRefreshComponent.h */,\n\t\t\t\t118F0C07C32E76EF6489509A4F07F50B /* MJRefreshComponent.m */,\n\t\t\t\t1C7E38D158EEE0908532959AA8DCB439 /* MJRefreshConst.h */,\n\t\t\t\t75AD8F0F482E2F585B2664D1635B4706 /* MJRefreshConst.m */,\n\t\t\t\t8FF93E1E76B5ED1DA01941D734DB3531 /* MJRefreshFooter.h */,\n\t\t\t\t0748670A15DF8EB5BA1C623F6B944876 /* MJRefreshFooter.m */,\n\t\t\t\t9D8CA91B2544EA3008663944FBDDBB5F /* MJRefreshGifHeader.h */,\n\t\t\t\tC68244972029A1CB9C966D064AB6967F /* MJRefreshGifHeader.m */,\n\t\t\t\t91BE41B89A55956B97FA90BA78DA1A4C /* MJRefreshHeader.h */,\n\t\t\t\t203840BDEB077FAE0820685734949691 /* MJRefreshHeader.m */,\n\t\t\t\t55C6E2980720E2A6CC91BB366BC6C7B2 /* MJRefreshNormalHeader.h */,\n\t\t\t\t77D21DAC0D06E0D6BBF5A78CB767E815 /* MJRefreshNormalHeader.m */,\n\t\t\t\t09B0C33CD96D9A514D7DB3610C6D2F6E /* MJRefreshStateHeader.h */,\n\t\t\t\t613B23B6CFFCB99006B5893BE2C653A5 /* MJRefreshStateHeader.m */,\n\t\t\t\tEA3EFB292391C42C14DBF00E49C533EC /* NSBundle+MJRefresh.h */,\n\t\t\t\t09517CD921BEB56F91C5FA7988170302 /* NSBundle+MJRefresh.m */,\n\t\t\t\tFB8C71D5C39C423BB61425ABDC60B40B /* UIScrollView+MJExtension.h */,\n\t\t\t\t5B8B57244416BAE5506E83DFBCCE1F45 /* UIScrollView+MJExtension.m */,\n\t\t\t\tF76E37DE05B72E5ACE3CC2FEA524DC00 /* UIScrollView+MJRefresh.h */,\n\t\t\t\t3BF627D8C19D8504043EEDE55963F4BA /* UIScrollView+MJRefresh.m */,\n\t\t\t\t02FA95A68EC5AC5D4C787DD8DAA5C118 /* UIView+MJExtension.h */,\n\t\t\t\tABF289602106E94D3F277B9C7F39FF7C /* UIView+MJExtension.m */,\n\t\t\t\t1064728F3888D15A87C94E495EFE16CC /* Resources */,\n\t\t\t\tA723DA53CE13E2220EC96B75C92CBEDE /* Support Files */,\n\t\t\t);\n\t\t\tpath = MJRefresh;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t304EFC2FC2C7CF78255AFFCF0DB1A0DB /* RxSwift */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t542762FC821F584B23860CBBBAF13564 /* AddRef.swift */,\n\t\t\t\t332E6B6D83344EA6F35D0681ADEAD1A7 /* Amb.swift */,\n\t\t\t\tC0B487DA905C4F895E0D126C1A062261 /* AnonymousDisposable.swift */,\n\t\t\t\t6DB87787AD0F7333249395D1378FED63 /* AnonymousObserver.swift */,\n\t\t\t\tD06DCA6A0B6616240EC75F089FCB605D /* AnyObserver.swift */,\n\t\t\t\tEDA69717822ACCAAF367E9F539039219 /* AsMaybe.swift */,\n\t\t\t\t2FA6CC0C558EDC9E6881C22246E9E059 /* AsSingle.swift */,\n\t\t\t\tA276DD5300A0CD1F004D67179921FE96 /* AsyncLock.swift */,\n\t\t\t\t272D79A04BED524CBED07D2B4EC99B49 /* AsyncSubject.swift */,\n\t\t\t\t59356F06A577C220AEBEDC900F94102A /* Bag.swift */,\n\t\t\t\tF384E81160731D07A8472A16F0EF1EFD /* Bag+Rx.swift */,\n\t\t\t\t59B6B580BF9608405256B589F993BA72 /* BehaviorSubject.swift */,\n\t\t\t\tB10806D65630D3922CC4632E4B961170 /* BinaryDisposable.swift */,\n\t\t\t\t4CE22F0C823232387AAE225F52265246 /* BooleanDisposable.swift */,\n\t\t\t\t3BB1570E1320634AB029069C7CA04D40 /* Buffer.swift */,\n\t\t\t\t495C0C539FEC03003AFB93904736DE91 /* Cancelable.swift */,\n\t\t\t\t8BCCB28DE00E01DFCDBAFD966F967237 /* Catch.swift */,\n\t\t\t\t18A31C1EE5C5A400DA67610DDECCBD49 /* CombineLatest.swift */,\n\t\t\t\t280D08DD70717640589F62EB1F6FD19B /* CombineLatest+arity.swift */,\n\t\t\t\tE4051F928839DBFCB64F5087D54C40E3 /* CombineLatest+Collection.swift */,\n\t\t\t\t52986B63E04FBCE90E31182FC836DF8C /* Completable.swift */,\n\t\t\t\tFF01C2ED8BF6578C8212FD3EAC90D3E2 /* Completable+AndThen.swift */,\n\t\t\t\tC10FF295CB8B9A0152FA38DF372846A4 /* CompositeDisposable.swift */,\n\t\t\t\t26530B988040DFAD1200285B6F15D492 /* Concat.swift */,\n\t\t\t\tC7A200DBF260A1DD96FA33642A921C9F /* ConcurrentDispatchQueueScheduler.swift */,\n\t\t\t\t1BCF16201BDE699E2122416B0D2FBD6E /* ConcurrentMainScheduler.swift */,\n\t\t\t\t06147002706BB75CECECA91480E5C0E6 /* ConnectableObservableType.swift */,\n\t\t\t\tD2E1B85E14851EF923C2BD626BE22587 /* Create.swift */,\n\t\t\t\tEA47B9E0DFFD8D15F19F5033E63B9026 /* CurrentThreadScheduler.swift */,\n\t\t\t\t23E72118C85ED536830E63BFEF402950 /* Debounce.swift */,\n\t\t\t\t8F2CEBF6D286D3D808C8AB81A58AFF59 /* Debug.swift */,\n\t\t\t\tDA67E4E3F08A96BF5B2596ED0FC34196 /* DefaultIfEmpty.swift */,\n\t\t\t\t7D4430407B638D271F51E5D3E920BB51 /* Deferred.swift */,\n\t\t\t\tA25F9545112FB4EA2545D303AC81CFB1 /* Delay.swift */,\n\t\t\t\t770CC8138D39A339E5C8057EC2DD1F7D /* DelaySubscription.swift */,\n\t\t\t\t8ACB6BCA51D81D396B134C596B0FB8C1 /* Dematerialize.swift */,\n\t\t\t\tC481BF3DA3A78A8E7F5176B802625CC6 /* Deprecated.swift */,\n\t\t\t\t96BC1A1EF9084AA9223F0E5E094C6ABC /* DispatchQueue+Extensions.swift */,\n\t\t\t\t36DC95F95B0777638C99DDB71789CF16 /* DispatchQueueConfiguration.swift */,\n\t\t\t\tB8DAA4F672011BE9BD20D53B1B64E479 /* Disposable.swift */,\n\t\t\t\t49461972A7736ED5C10EA776E946211B /* Disposables.swift */,\n\t\t\t\t23FEC5DC4D59BF5FF4FE6E5DE5CF64BC /* DisposeBag.swift */,\n\t\t\t\tF0758B65380EFC2497BC08F9A7E4F402 /* DisposeBase.swift */,\n\t\t\t\tDD1C4965E4534F094C7E5D0417A804AC /* DistinctUntilChanged.swift */,\n\t\t\t\tE74A11FE1DBDB7EA6BDB703F6B58F460 /* Do.swift */,\n\t\t\t\t397F2D1B6C0CB8DEFA63186BB12618B2 /* ElementAt.swift */,\n\t\t\t\t4497D98DB94E983018E6F6C2A4DBAF68 /* Empty.swift */,\n\t\t\t\t0785C89934FE4C79E378F80B3EAA947F /* Enumerated.swift */,\n\t\t\t\t04FE7430ECAF1467968440D35165D54B /* Error.swift */,\n\t\t\t\t80A58779165736F60C355BBAAF75C027 /* Errors.swift */,\n\t\t\t\t95CF89A127DC79551BAA8988F82BD1E2 /* Event.swift */,\n\t\t\t\t20D269397D68987A4E3F571B01394F0E /* Filter.swift */,\n\t\t\t\tE415D1E19F77D7279C5F140411D69E67 /* First.swift */,\n\t\t\t\t3E6B1DB2C5390EA79CEFCA5BAC709AFF /* Generate.swift */,\n\t\t\t\t7A0ECA86834476786492EC1E52EB3E13 /* GroupBy.swift */,\n\t\t\t\tAE4600B7894931DEAFCABE02CD7AB268 /* GroupedObservable.swift */,\n\t\t\t\t47F3ADD7515A562BFBBBB8888ADA3090 /* HistoricalScheduler.swift */,\n\t\t\t\tD76F782371F7D6EF97DE209867481EA5 /* HistoricalSchedulerTimeConverter.swift */,\n\t\t\t\t95A5AC992E4B703AA08D0A815AAED779 /* ImmediateSchedulerType.swift */,\n\t\t\t\t404B3E0121644CBA834D592A1EB4E364 /* InfiniteSequence.swift */,\n\t\t\t\t87CE09E0A8341C183F59A37440D5153A /* InvocableScheduledItem.swift */,\n\t\t\t\t593B68AD069BBE7957F7B4AE1E9F164A /* InvocableType.swift */,\n\t\t\t\t096040CC61B2863666482591D451AA38 /* Just.swift */,\n\t\t\t\tF364B3A757735A453DB16E22F1A2D52A /* Lock.swift */,\n\t\t\t\tA5D6508C06EC007A57DBB3099AD5C617 /* LockOwnerType.swift */,\n\t\t\t\tE420D6F4781A96E122D216CBDA976615 /* MainScheduler.swift */,\n\t\t\t\t954CE4894A117D9DA14AE5D47A6BAE88 /* Map.swift */,\n\t\t\t\tE417881CF3E530ABBE356AD806F81649 /* Materialize.swift */,\n\t\t\t\t8C8ADE73FE10FA15ABAA1CB4FB6DAD62 /* Maybe.swift */,\n\t\t\t\t14223DB3BAAFC3650B856F3ED4CA3293 /* Merge.swift */,\n\t\t\t\t0D21901F32D924DB95300B2C650103E1 /* Multicast.swift */,\n\t\t\t\t8F5E590482B741DD275B9A87B7EAF4DA /* Never.swift */,\n\t\t\t\t20CECB0BD149F46C10733B4F2D2D92DC /* NopDisposable.swift */,\n\t\t\t\t2B34630D7EB0A587B97952108987DB65 /* Observable.swift */,\n\t\t\t\t63F72D0F593F82201EA482E15012B694 /* ObservableConvertibleType.swift */,\n\t\t\t\t3EEF0C4EECF8525D00D4B8CF83ED7D3E /* ObservableType.swift */,\n\t\t\t\t90107D958C65D510896483F2CB8060BA /* ObservableType+Extensions.swift */,\n\t\t\t\t0C40C05B2CC135DAAF345CD1E46FE065 /* ObservableType+PrimitiveSequence.swift */,\n\t\t\t\t5F34BA700CC37058B6A053DD142E65DB /* ObserveOn.swift */,\n\t\t\t\t1003DE1B3A476A1579EADFC5DEE4DC09 /* ObserverBase.swift */,\n\t\t\t\t834769F9B06E2DF4306C35CB6F967BAE /* ObserverType.swift */,\n\t\t\t\t70876246376D5A1D2C4ADF75F307186A /* OperationQueueScheduler.swift */,\n\t\t\t\t3CCA6ED6120DA770AB86F564EEAC46DB /* Optional.swift */,\n\t\t\t\t17F817A4133AB7260E9700802CE54631 /* Platform.Darwin.swift */,\n\t\t\t\t9C5AF229FF21FF8786BD3CDF9E0BD504 /* Platform.Linux.swift */,\n\t\t\t\tC7AF230FEF4F9203FE69CA75CAC56E33 /* PrimitiveSequence.swift */,\n\t\t\t\tB09E2CE4824B4A44FE923169E5B3934C /* PrimitiveSequence+Zip+arity.swift */,\n\t\t\t\t30D68DEE1421B7ED892C4E0B33E9CC35 /* PriorityQueue.swift */,\n\t\t\t\t8DC2D7127D27BDD70C5EC0A4FF96074D /* Producer.swift */,\n\t\t\t\tC1DC026D0D8F36437F6F9662A1805D0E /* PublishSubject.swift */,\n\t\t\t\t502F0D4E9FE8FBC064C04982F146FE43 /* Queue.swift */,\n\t\t\t\tDEB5737B2DA2DF3423F29C0CBB7542DA /* Range.swift */,\n\t\t\t\t5DF0A09A6DD2C0453F866A408223B631 /* Reactive.swift */,\n\t\t\t\tEAAE74B8E84AC1A31796559B46480858 /* RecursiveLock.swift */,\n\t\t\t\t383DA86E343CBA75A7B8574AB75E1A1B /* RecursiveScheduler.swift */,\n\t\t\t\t4914A9BB07C4CB2A6DDD5D0096A0BE87 /* Reduce.swift */,\n\t\t\t\t8C5BD7D77FAF305B2C6E8F85C768FC42 /* RefCountDisposable.swift */,\n\t\t\t\t2D6D95EA842EF7D1BFA6D8191AAE620B /* Repeat.swift */,\n\t\t\t\tF9B85640D4BCBBFE6662A71B6EE98AE9 /* ReplaySubject.swift */,\n\t\t\t\tA9A3DB0E144693D175CBA841C8B10601 /* RetryWhen.swift */,\n\t\t\t\tEC8A134B3C9407540FCDEC584183133D /* Rx.swift */,\n\t\t\t\t44D999B360E6504760FF4A8DD2CB17A1 /* RxMutableBox.swift */,\n\t\t\t\t351865278BBE506A2B088B8755AD46BD /* Sample.swift */,\n\t\t\t\t7C5ABD7D168407FE39CC76E2B5D13784 /* Scan.swift */,\n\t\t\t\tEF04BEEB09DE1352D9F767144EF0FD50 /* ScheduledDisposable.swift */,\n\t\t\t\tBDC3EE36C7DE6D97F96B2B36B0E557C9 /* ScheduledItem.swift */,\n\t\t\t\tB32CA5B611266CA013631C5E362ACECE /* ScheduledItemType.swift */,\n\t\t\t\t3A098FD7778F9B758BBC03971A34449C /* SchedulerServices+Emulation.swift */,\n\t\t\t\tBE49DD1F3CB80E0DCB3ED742E3DED62B /* SchedulerType.swift */,\n\t\t\t\t99F328B2BEE043C872339B6E419D2095 /* Sequence.swift */,\n\t\t\t\t0A81EC5AF3F05041AE6EB4193B2BFEE3 /* SerialDispatchQueueScheduler.swift */,\n\t\t\t\tF08868A7AD5BECFD90CC22A62671DC82 /* SerialDisposable.swift */,\n\t\t\t\tE127D4A1CC515D5A1562D756ADE9089E /* ShareReplayScope.swift */,\n\t\t\t\t63C44514B1EC24A99AC7728B3503A038 /* Single.swift */,\n\t\t\t\t70EBA339974E545CDC23F472B6A4BD3E /* SingleAssignmentDisposable.swift */,\n\t\t\t\t0D231836443906AF664DE2289F32D387 /* SingleAsync.swift */,\n\t\t\t\t0D305720CFFC3323166DEE86CAF9341B /* Sink.swift */,\n\t\t\t\tE018F18F377B9190734B1D9EB8160AD7 /* Skip.swift */,\n\t\t\t\t30C22B352D9B240DC40532BF2241C498 /* SkipUntil.swift */,\n\t\t\t\t4CF8C44E75B472322D8DC2B86B893ED9 /* SkipWhile.swift */,\n\t\t\t\t861BD4AC5D5011049786E6352C62DC93 /* StartWith.swift */,\n\t\t\t\t1D3CBDD7BD1351D05617EDFD0171017D /* String+Rx.swift */,\n\t\t\t\t089E5120665D4B93D03D218D3D11C2F1 /* SubjectType.swift */,\n\t\t\t\t137E979916631AD9ACADADEEEBBBAE5B /* SubscribeOn.swift */,\n\t\t\t\tC0112A7EDEEB67FF3C434A3F925DEA88 /* SubscriptionDisposable.swift */,\n\t\t\t\t1DB825CD3DE4C8C88F1EB6E75E3046B2 /* SwiftSupport.swift */,\n\t\t\t\tCC94DB3E4DBB1ECF4FA33EBC9EAACFDF /* Switch.swift */,\n\t\t\t\tA0E83A69D9C8F0B40317DD90BF832D26 /* SwitchIfEmpty.swift */,\n\t\t\t\t54D4C9E3C57DE8A35333AAD4C4E744A0 /* SynchronizedDisposeType.swift */,\n\t\t\t\tBE4CFCC4E9A965F95EE17202FBB5F310 /* SynchronizedOnType.swift */,\n\t\t\t\t9946E97DCFB4572476564D33A05975E4 /* SynchronizedUnsubscribeType.swift */,\n\t\t\t\t701196C1B8D5354D685D7DD627877FEA /* TailRecursiveSink.swift */,\n\t\t\t\t1F80E196EA77F97C6AA8A3D2410BFE76 /* Take.swift */,\n\t\t\t\t553ED5CCD42E1F512E1D9E9466E47D44 /* TakeLast.swift */,\n\t\t\t\t5900BA1E16E8EB96D52F16B3133DD305 /* TakeUntil.swift */,\n\t\t\t\t7BED0C58934B33DC41A1432BABD2EFA8 /* TakeWhile.swift */,\n\t\t\t\t29C099BC759B6B4145E48DE537580E13 /* Throttle.swift */,\n\t\t\t\tAE9BA3DB7A5A422C613CFBFB2811FEA5 /* Timeout.swift */,\n\t\t\t\t039485063DF511DC852BBCD65C474C9B /* Timer.swift */,\n\t\t\t\tBC7B9021F90F58D6E367BA8B4C9C2B14 /* ToArray.swift */,\n\t\t\t\t5BCDD91A5C3CBCA65A1E0746F0ABC174 /* Using.swift */,\n\t\t\t\t66AD8E23D6C4A5FFCFE4C066E700B676 /* VirtualTimeConverterType.swift */,\n\t\t\t\t99692BFA25CF2437019950A2EFAE0291 /* VirtualTimeScheduler.swift */,\n\t\t\t\t2A9BB47909385E153DEAF4820584660C /* Window.swift */,\n\t\t\t\tB00B2D1E5594681E1384A988B35D66F6 /* WithLatestFrom.swift */,\n\t\t\t\t2F954956863F74706AA3A395F8401F14 /* Zip.swift */,\n\t\t\t\tA678D15F6F0F97A723B186CEA25EE5A4 /* Zip+arity.swift */,\n\t\t\t\tA088E5F2C74178B8F5D416C973214422 /* Zip+Collection.swift */,\n\t\t\t\t7C6A2244A91617645C0390EDBBB4FD1F /* Support Files */,\n\t\t\t);\n\t\t\tpath = RxSwift;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t30849D5837BB3A25E52DB968699B62A0 /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB216F1C86A2BB68A807DD4CD8314351F /* Info.plist */,\n\t\t\t\tBCC1C0B2E36AC5340AC67AD9AD286793 /* ObjectMapper.modulemap */,\n\t\t\t\t40C89EACDC9DB733AEDA2C1858349B05 /* ObjectMapper.xcconfig */,\n\t\t\t\tBC52351249DB2B467541996968B175A0 /* ObjectMapper-dummy.m */,\n\t\t\t\t1039A64D7973971C931057162135E4B5 /* ObjectMapper-prefix.pch */,\n\t\t\t\t0A332DD66083AD9F2BEB500FC7F9B60E /* ObjectMapper-umbrella.h */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/ObjectMapper\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t38BFD9FA65D37C0B02CF123BFDEAA695 /* Core */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t188117C123963623C4A723C6D908FDF6 /* ReusableKit.swift */,\n\t\t\t\tAC1DC57990281D4F45BE128AADCE4143 /* UICollectionView+ReusableKit.swift */,\n\t\t\t\t5EAD58DE19CDA807C841C29CE9804B80 /* UITableView+ReusableKit.swift */,\n\t\t\t);\n\t\t\tname = Core;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t45B00A8DA5873AD20582737CD95C2411 /* Moya */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD2FEDEA5B32B192432554BB4449C46F8 /* Core */,\n\t\t\t\tDEA91A40A855CC667C28E90C7BC1131C /* Support Files */,\n\t\t\t);\n\t\t\tpath = Moya;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t45BA95C8E036FDF76B829A05394F3326 /* SwiftyColor */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t01D96AEEF8ACF586BFC5351394E36F02 /* SwiftyColor.swift */,\n\t\t\t\t53A5B24B0F63B17031A5156469414C11 /* Support Files */,\n\t\t\t);\n\t\t\tpath = SwiftyColor;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t487312B5947B5B410F4B2D74B97A64B4 /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD302B83E9CE0D2B43DFA34A03D0DBE2B /* Info.plist */,\n\t\t\t\t32D7A430AD912A7D4AEE013B35DE2741 /* NSObject+Rx.modulemap */,\n\t\t\t\t8D3F2B09E35E2D2EFA58CB9D9261E7D0 /* NSObject+Rx.xcconfig */,\n\t\t\t\tB8020BB1D97D4EA3246C9476D7044FE7 /* NSObject+Rx-dummy.m */,\n\t\t\t\tA6F0EAB300D0CE91C61EF3E29868A1D0 /* NSObject+Rx-prefix.pch */,\n\t\t\t\t8533AEEE8CD59BA624CA9267423D28E5 /* NSObject+Rx-umbrella.h */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/NSObject+Rx\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t488B1D880370242DA6DAA1BC23EE213D /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t91425961AD55DFFE4C3BCB82A387076E /* Differentiator.modulemap */,\n\t\t\t\t02242206E1BBE2B18A7CA031B7102D98 /* Differentiator.xcconfig */,\n\t\t\t\tC0DB238A8FB8D79A81E67CBB38ECF524 /* Differentiator-dummy.m */,\n\t\t\t\t65CB9B0C5FAEB1D7382D6EDFA4938D81 /* Differentiator-prefix.pch */,\n\t\t\t\t5E7C918776C8129D7372B1095C6E2BBD /* Differentiator-umbrella.h */,\n\t\t\t\tE9A37A86FC5231B8DFC0C17337CC40F5 /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/Differentiator\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4F4D1E519FEB89BA1386B9D98230B348 /* ObjectMapper */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4D811B382CEAC4FADDA971AFE90AD50A /* CustomDateFormatTransform.swift */,\n\t\t\t\tEC29C744A1F98EEA2D40646969A57510 /* DataTransform.swift */,\n\t\t\t\t655359FE97777A5E6376898C32918AD1 /* DateFormatterTransform.swift */,\n\t\t\t\t0B86B4FEA51A1E51158BB9084C301356 /* DateTransform.swift */,\n\t\t\t\t78C07D23AF9D0ED48A9FEB791BA9FE25 /* DictionaryTransform.swift */,\n\t\t\t\tE441DE19DC813E660F49CCA5AF0FA3F5 /* EnumOperators.swift */,\n\t\t\t\t49F4BBE33D9DA445DD902A8A15991A56 /* EnumTransform.swift */,\n\t\t\t\t236D0EC42AF18C98E4FFEB08963E7C51 /* FromJSON.swift */,\n\t\t\t\t530479F817D071873ED5DC57B4372350 /* HexColorTransform.swift */,\n\t\t\t\t88CD1219127C85AAD3C013FB79D9BA84 /* ImmutableMappable.swift */,\n\t\t\t\t81B6FFA1A029CC85A9BD8A4847631CD7 /* IntegerOperators.swift */,\n\t\t\t\tF4851621D756478D43208A461240D7CF /* ISO8601DateTransform.swift */,\n\t\t\t\t1E49107D99771943128C7B1A58B2781A /* Map.swift */,\n\t\t\t\t7ADE1D2FF0526260DCE037584DAB5A0D /* MapError.swift */,\n\t\t\t\t4C08FCDD6B32CEDDEA0C67B874CFF29A /* Mappable.swift */,\n\t\t\t\t541CB7596A9F5575EA8684328858A044 /* Mapper.swift */,\n\t\t\t\tF3AFC24D86F7304F0B4AF511C9B9970A /* NSDecimalNumberTransform.swift */,\n\t\t\t\t115F5111E88B41835988258D0B9D90F2 /* Operators.swift */,\n\t\t\t\t42A26062E1F6F9B2A5BC508EA3D00288 /* ToJSON.swift */,\n\t\t\t\t5DED5486ED70B440763840FA459F4698 /* TransformOf.swift */,\n\t\t\t\tF03D2DC1D0CBA5B7FB557A21D0DA5771 /* TransformOperators.swift */,\n\t\t\t\tF73232742568F2DC4E279896B22BA8A3 /* TransformType.swift */,\n\t\t\t\t9979EBBDCDD9A7DDDB0725FEC97660E7 /* URLTransform.swift */,\n\t\t\t\t30849D5837BB3A25E52DB968699B62A0 /* Support Files */,\n\t\t\t);\n\t\t\tpath = ObjectMapper;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t536713D0367D857983EAE8C88CBFAD20 /* TTRangeSlider */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC0B85CEF090EDD7737A7E0F1D0F0F169 /* TTRangeSlider.h */,\n\t\t\t\tA46A36F4BF38056EAA48578282F54B60 /* TTRangeSlider.m */,\n\t\t\t\tB86E459038ACF95C44868462505C56A6 /* TTRangeSliderDelegate.h */,\n\t\t\t\t0E9D9F01EDD13FD4E5C0AB6FD5BB2A5A /* Support Files */,\n\t\t\t);\n\t\t\tpath = TTRangeSlider;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t53A5B24B0F63B17031A5156469414C11 /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB7FBCAED115C93A340B4D4817383226A /* Info.plist */,\n\t\t\t\tDE50048633BEA4A961DBEE8DC7631174 /* SwiftyColor.modulemap */,\n\t\t\t\t7AA6F3E86B6FCC86A1E5A52F243EE56D /* SwiftyColor.xcconfig */,\n\t\t\t\t7DA9FEB5DF32D81B067986FD382163B1 /* SwiftyColor-dummy.m */,\n\t\t\t\t53FDE7E458AD9BF6993525EC0EC3CBFF /* SwiftyColor-prefix.pch */,\n\t\t\t\t52A5AC3A3FC014CA05565755B1794774 /* SwiftyColor-umbrella.h */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/SwiftyColor\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t58F2F503951D4229783CFCA7DB8EFEEB /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBE521621242425215AB95C0D1F947998 /* Info.plist */,\n\t\t\t\t63D809CF6C0676EAD17D2011895CB209 /* URLNavigator.modulemap */,\n\t\t\t\t268594CEB578B4D18F4F1B30652F617B /* URLNavigator.xcconfig */,\n\t\t\t\t504FC395E9A355EFA723008D25BE2E85 /* URLNavigator-dummy.m */,\n\t\t\t\t6AC97A632E3388162A1E604E64EF8D3C /* URLNavigator-prefix.pch */,\n\t\t\t\tD783020743D1A18018EE614D78D965A2 /* URLNavigator-umbrella.h */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/URLNavigator\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t60E933F022A2CA3C626EFE6FCECD25C1 /* ReactorKit */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9647D7ACC10E74465531ADEEFD4D2E0B /* ActionSubject.swift */,\n\t\t\t\t83A11C513330652C7580864E6FF559BC /* AssociatedObjectStore.swift */,\n\t\t\t\t1C74C02A940DA7E7A70BFF3EDB096E49 /* Reactor.swift */,\n\t\t\t\t385C967E6D18858D5311CA87A4205434 /* ReactorKitRuntime.h */,\n\t\t\t\t5F70D589B9E780A60A3716F46A4ECF0D /* ReactorKitRuntime.m */,\n\t\t\t\t1A0CBF488AAC85E03EDD426C11452A46 /* StoryboardView.swift */,\n\t\t\t\tD71887F7534D1360E1CF05E79FDAC471 /* Stub.swift */,\n\t\t\t\t3795E84704A9198DC6E04FB5A7227CCA /* View.swift */,\n\t\t\t\t24DBE0B1E85B2506F4E5B030BBFE143F /* Support Files */,\n\t\t\t);\n\t\t\tpath = ReactorKit;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t620E4B9F95F286C23D5010BD6D3438BE /* Targets Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC517B73BB29B67C841CF338715E23F63 /* Pods-RxXMLY */,\n\t\t\t);\n\t\t\tname = \"Targets Support Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t675A751295C96B00405E15E00041E422 /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tDD77C22F0E17F82C01E907DC393087DA /* Info.plist */,\n\t\t\t\t6F6066636CC572B64FC9681E44E91280 /* Result.modulemap */,\n\t\t\t\t8A5ABA18A2D1A61A185ED12DF70B8F30 /* Result.xcconfig */,\n\t\t\t\tD4A33E97EE17B95FCE36DEBE7ACE03F3 /* Result-dummy.m */,\n\t\t\t\tFE2F015C7CCD3096659FF2450B75E15F /* Result-prefix.pch */,\n\t\t\t\t57EDA4292816BC724EE611C648E430DA /* Result-umbrella.h */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/Result\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t712E1C09C3CA54FA0B661841A1FB2F97 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA6BE7CE8E3CF10B0BE4713CA7CD3FDC9 /* Alamofire.framework */,\n\t\t\t\tEFD5B31121E42968628607F4CA11A4BC /* Differentiator.framework */,\n\t\t\t\t924F8DE96A22311CC14038BB62C8997D /* IQKeyboardManagerSwift.framework */,\n\t\t\t\t1E1DF457C00960360E254419271FA76F /* Kingfisher.framework */,\n\t\t\t\tB7B99FDB86B839402402CF4B9085F867 /* MJRefresh.framework */,\n\t\t\t\t3E00F875EA38811C01C6F56B33214C42 /* Moya.framework */,\n\t\t\t\t84E9E4B67AD852A6167EFE006AD2043F /* NSObject_Rx.framework */,\n\t\t\t\t68051FD77C0407C9B24515E31E177222 /* ObjectMapper.framework */,\n\t\t\t\tB2C6C61F18ADC817A64446B3F214A416 /* Pods_RxXMLY.framework */,\n\t\t\t\t195D6043A1C7C9E2F93F03BF5A6C765E /* ReactorKit.framework */,\n\t\t\t\tBC645F028499DF5A3CB986DD6D4358F1 /* Result.framework */,\n\t\t\t\t68668B40B5E550006A59D5621EFB0561 /* ReusableKit.framework */,\n\t\t\t\tE02E53CE029ADA867E576C62B9054390 /* RxAlamofire.framework */,\n\t\t\t\tE9246ADE8730ABD21F1BBC59333EA31E /* RxCocoa.framework */,\n\t\t\t\t97B60E643384171A74CED9D708E98F3D /* RxDataSources.framework */,\n\t\t\t\tD5B52B71645C13D27A3C4B3A58EA2440 /* RxGesture.framework */,\n\t\t\t\t0971AB82F462A7C2F67101AD9407905F /* RxSwift.framework */,\n\t\t\t\t4F5B061DB45E3912FBD1E11E6F1A842E /* SnapKit.framework */,\n\t\t\t\tA95B5537CC319932AD399F0660CB16D8 /* SwiftyColor.framework */,\n\t\t\t\tE915131DA668033B6756FDE94DD6C130 /* SwiftyJSON.framework */,\n\t\t\t\tFB6BED57753CCBC597942DFD41588338 /* Then.framework */,\n\t\t\t\t2135AEA738411503ADADD4D2497AA4E6 /* TTRangeSlider.framework */,\n\t\t\t\t91F4320128E8926FF21C0A92F70CFBBD /* TYCyclePagerView.framework */,\n\t\t\t\tB228A61D64CA44B4648977930AEEBF5F /* TYPagerController.framework */,\n\t\t\t\t430B138602CD2D328367A37FEE11E65F /* URLNavigator.framework */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7396FD9E9C585EB1A3E6449CEC17B0F1 /* IQKeyboardManagerSwift */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8E6990B20E9EA105BBB88B21C57593B5 /* IQBarButtonItem.swift */,\n\t\t\t\t507ED73099FD654BE7A82BBDAADE2C57 /* IQKeyboardManager.swift */,\n\t\t\t\t12F89941B737495BB6B9D65D0A940759 /* IQKeyboardManagerConstants.swift */,\n\t\t\t\tBAB7E27C2C9842A03F3BD947DD8493A2 /* IQKeyboardManagerConstantsInternal.swift */,\n\t\t\t\tA6EC870FE5CE9FD966D23435C1DB6E0C /* IQKeyboardReturnKeyHandler.swift */,\n\t\t\t\t76B7D152E72F3D0808E4186445E4FC9B /* IQNSArray+Sort.swift */,\n\t\t\t\t2C114C6520E1FE3996B0B360BF559199 /* IQPreviousNextView.swift */,\n\t\t\t\t87874701D9E81D433E42E8AAABDFFD7A /* IQTextView.swift */,\n\t\t\t\t3F99F2A0C1CCF46EC645BA9E65F78200 /* IQTitleBarButtonItem.swift */,\n\t\t\t\t155A351F30BA1128E99E067F81CB72B2 /* IQToolbar.swift */,\n\t\t\t\tFB352C9155E142C44FAE86885DBC3E62 /* IQUIScrollView+Additions.swift */,\n\t\t\t\t80810E76C51AA5F19CE1D4B0D55E060C /* IQUITextFieldView+Additions.swift */,\n\t\t\t\t1EF8AC35D0E53603F8A97DBBE9FA33E2 /* IQUIView+Hierarchy.swift */,\n\t\t\t\t50E667F49AB3F41A361BA1B406783ABF /* IQUIView+IQKeyboardToolbar.swift */,\n\t\t\t\t88CB6A2CAB2E3799803CD1C118F1F107 /* IQUIViewController+Additions.swift */,\n\t\t\t\t6D94ED6DD481751BB6F57C5B6C60049A /* IQUIWindow+Hierarchy.swift */,\n\t\t\t\t125AE60B5B1A09953287C270122642EE /* Resources */,\n\t\t\t\tB6F2514C869FD45712CBC40F05EEAC6C /* Support Files */,\n\t\t\t);\n\t\t\tpath = IQKeyboardManagerSwift;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7A355B44A1746EE91ED56D1FB55506FC /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tFE622F585E2DE18232A22FD2E069BE75 /* Info.plist */,\n\t\t\t\t79B73C8686EF3B5668892169B223FA54 /* ReusableKit.modulemap */,\n\t\t\t\tB013E2FF6D44578E3E483B417504DD8F /* ReusableKit.xcconfig */,\n\t\t\t\t5B4592368CE0F4DED0B9CAF915FC9215 /* ReusableKit-dummy.m */,\n\t\t\t\t4F54F7C7B743ADE4D45AF0D405AA82BA /* ReusableKit-prefix.pch */,\n\t\t\t\tDD7CFB953733E5734A907460B2C40BCE /* ReusableKit-umbrella.h */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/ReusableKit\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7C6A2244A91617645C0390EDBBB4FD1F /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF293CCDAB139CAA1824ACDC4BB8DE2EA /* Info.plist */,\n\t\t\t\t9D4AFB0C0C4C623DA01CF63FA53AE13C /* RxSwift.modulemap */,\n\t\t\t\t0A8EF0EB23267E967663F5FA5A8E7686 /* RxSwift.xcconfig */,\n\t\t\t\t2D2C96C6D5355207398C46C9E66386BE /* RxSwift-dummy.m */,\n\t\t\t\tECECB25BC65301EB453951C200FFCD22 /* RxSwift-prefix.pch */,\n\t\t\t\t387296DC1983BFD653D558D678637B29 /* RxSwift-umbrella.h */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/RxSwift\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7DB346D0F39D3F0E887471402A8071AB = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */,\n\t\t\t\t02CB0B03CB75DEE740DEEDAFC9A4B34D /* Frameworks */,\n\t\t\t\t9219C6A5FCFAFE30FB019F9ABF07FAE1 /* Pods */,\n\t\t\t\t712E1C09C3CA54FA0B661841A1FB2F97 /* Products */,\n\t\t\t\t620E4B9F95F286C23D5010BD6D3438BE /* Targets Support Files */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t80B62B3BBDF1C43E982FC967D7AC3D71 /* RxCocoa */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB717B3469C2896926EF05EAF11498DA0 /* _RX.h */,\n\t\t\t\t6FADD7C8C693834E93343EFB77D33AAD /* _RX.m */,\n\t\t\t\t2534A262C08145CCB9C56D17DB32573D /* _RXDelegateProxy.h */,\n\t\t\t\t2DEC3152A51E8F66A48451B7A4EC9704 /* _RXDelegateProxy.m */,\n\t\t\t\tE800F1732A0D7B4A6640BE266F14DDC8 /* _RXKVOObserver.h */,\n\t\t\t\t957D3B23678E4698CC79A2DE9EA9F96A /* _RXKVOObserver.m */,\n\t\t\t\tB0D0CA0D4B6A0E2EB840F4E5D6C75340 /* _RXObjCRuntime.h */,\n\t\t\t\t96BF47DDEF17AC72F8EBF9CF0EA9DC04 /* _RXObjCRuntime.m */,\n\t\t\t\t0580BE8F6F974685A933A89D8A972BDA /* Bag.swift */,\n\t\t\t\t4A42C76F3823E2EFA148B18E55C8D6B2 /* BehaviorRelay.swift */,\n\t\t\t\t86FCD05DCA4B5988057772E478AA3B7C /* BehaviorRelay+Driver.swift */,\n\t\t\t\tC84F456A91C16DC64488D342C8BC5929 /* Binder.swift */,\n\t\t\t\tA962B38EA206CD0B32DEC9E6DC414479 /* ControlEvent.swift */,\n\t\t\t\tAAA5BE3862DD3A00CBB848A024A5E863 /* ControlEvent+Driver.swift */,\n\t\t\t\t889059818A6183D31A0BDC7C6B981849 /* ControlProperty.swift */,\n\t\t\t\tCEC01AC2D958140E2A090D7B632F5567 /* ControlProperty+Driver.swift */,\n\t\t\t\t05D420155A7835B81FCFE92D3FC75464 /* ControlTarget.swift */,\n\t\t\t\tBACE4EA986227C4D5F468E9FC4DB57BC /* DelegateProxy.swift */,\n\t\t\t\t3DA4D4657D80847325EA00819DC11ACD /* DelegateProxyType.swift */,\n\t\t\t\t2B88F0CF34C9C21FA5FACA8A0692AA4A /* Deprecated.swift */,\n\t\t\t\tF5367CAC7283271F0E12047EE1E54190 /* DispatchQueue+Extensions.swift */,\n\t\t\t\t7C1A7F6D1EC5B670FE3CF2E00D21C2D6 /* Driver.swift */,\n\t\t\t\tAC294161F7CCD1280208FEC5EE254218 /* Driver+Subscription.swift */,\n\t\t\t\t1530F4900EF841B8D75AB4AFA41076FB /* InfiniteSequence.swift */,\n\t\t\t\tAE8FF0C7C94471EB15B40751856B8D53 /* ItemEvents.swift */,\n\t\t\t\tB5A668A610822A5EACD5784C5EEE3E17 /* KVORepresentable.swift */,\n\t\t\t\tFC0E5E64017E2B544B9C4365BF0DBBF5 /* KVORepresentable+CoreGraphics.swift */,\n\t\t\t\tF79A80A6FF76E139A757BFA4110503E7 /* KVORepresentable+Swift.swift */,\n\t\t\t\tE03BFCA5D027189D74E5502CC0D58735 /* Logging.swift */,\n\t\t\t\tF7B06E614268F88A37528BE5B8A08933 /* NotificationCenter+Rx.swift */,\n\t\t\t\tA2B78D4FFAD19F5D58FA9B42B6E4F2FE /* NSLayoutConstraint+Rx.swift */,\n\t\t\t\t3BEAA51E3D065BAC60F1B85CBB1F26D5 /* NSObject+Rx.swift */,\n\t\t\t\t08A296320835E99AA5A0CED018A67A58 /* NSObject+Rx+KVORepresentable.swift */,\n\t\t\t\tD3F7DB8C08BAE7F26A0EE85DA33C3905 /* NSObject+Rx+RawRepresentable.swift */,\n\t\t\t\tF728D985BB2068A70834B0E454690223 /* NSTextStorage+Rx.swift */,\n\t\t\t\tAA67591D1C61133E2F626EA1C2E097FE /* Observable+Bind.swift */,\n\t\t\t\t8E365162D0EA4A1CE302074F5079D99D /* ObservableConvertibleType+Driver.swift */,\n\t\t\t\tE91D5BAB4A332A7524C3625B57B61925 /* ObservableConvertibleType+Signal.swift */,\n\t\t\t\tCBD70508C00E38F1FE63CED0383CAFE6 /* Platform.Darwin.swift */,\n\t\t\t\t9A82E326004C5937DB3D98AD29CEDFBA /* Platform.Linux.swift */,\n\t\t\t\tBEB35F8259524796939172BEB9769CB6 /* PriorityQueue.swift */,\n\t\t\t\t346F9291AC0BA83FB7B3962FC7F73267 /* PublishRelay.swift */,\n\t\t\t\tBB9B39409869FB19DBBE9E21A282D0E1 /* PublishRelay+Signal.swift */,\n\t\t\t\t1778148BC4EB285B75595B087B8FC931 /* Queue.swift */,\n\t\t\t\t66C7719FC6A1EB8A6E7F08B0215685B3 /* RecursiveLock.swift */,\n\t\t\t\t339F05AA6561AB55D443E3626724120A /* RxCocoa.h */,\n\t\t\t\t98BFA9BCF11C38855F14FC8D710D4E95 /* RxCocoa.swift */,\n\t\t\t\t809E8BEC46CF11685F9980428C93B446 /* RxCocoaObjCRuntimeError+Extensions.swift */,\n\t\t\t\t64E69BA43FC5913EAFEEADEA145AFF1F /* RxCocoaRuntime.h */,\n\t\t\t\t4C13EACC6D3C59A28B692EFB2DB14F6E /* RxCollectionViewDataSourceProxy.swift */,\n\t\t\t\tDA9C2D5FD4A6E72AF207648A0646DCCF /* RxCollectionViewDataSourceType.swift */,\n\t\t\t\tE3508AF1777C25C4BC5CE6002832B9BF /* RxCollectionViewDelegateProxy.swift */,\n\t\t\t\t6B2C9F6C4EE9F9989261CF1F3418FC9E /* RxCollectionViewReactiveArrayDataSource.swift */,\n\t\t\t\t4602CBFEB0FDD72D7A2FF806152CFC81 /* RxNavigationControllerDelegateProxy.swift */,\n\t\t\t\t6FE766E158FAC90198034E79F61FB2CE /* RxPickerViewAdapter.swift */,\n\t\t\t\t4284532690122048902F462ECE7D36F5 /* RxPickerViewDataSourceProxy.swift */,\n\t\t\t\tB97FA317AEF5791CA7299591278DDD85 /* RxPickerViewDataSourceType.swift */,\n\t\t\t\t9096DCC6CC66370C372F38BF8C1E435A /* RxPickerViewDelegateProxy.swift */,\n\t\t\t\tBEF74C2451A7C311E3C89E75D4746DD4 /* RxScrollViewDelegateProxy.swift */,\n\t\t\t\t0197B6C172230E3E4655E94AFC0EFD32 /* RxSearchBarDelegateProxy.swift */,\n\t\t\t\tABBD78A9569D4426E15EAE838A7F4562 /* RxSearchControllerDelegateProxy.swift */,\n\t\t\t\t9D01082F46B5E949B212F6A27CDEF6DF /* RxTabBarControllerDelegateProxy.swift */,\n\t\t\t\tC755463902805FE86A327D9AD0B26200 /* RxTabBarDelegateProxy.swift */,\n\t\t\t\t7553CCC7443EE20DAEB595357CD7198F /* RxTableViewDataSourceProxy.swift */,\n\t\t\t\t081D3C3389E6943F023464C1787FDC23 /* RxTableViewDataSourceType.swift */,\n\t\t\t\t013A0244BEC843116DF0F443778476C9 /* RxTableViewDelegateProxy.swift */,\n\t\t\t\tE6BE51ED2DAF09F29A0DDADC0911D49B /* RxTableViewReactiveArrayDataSource.swift */,\n\t\t\t\t8CF3671CDFCBADF26426E2EC9ED34424 /* RxTarget.swift */,\n\t\t\t\tCE2E4D442D52B0894ED51620B7A11E8B /* RxTextStorageDelegateProxy.swift */,\n\t\t\t\t3771D2D60EF94F8BBA0E912C27A80D24 /* RxTextViewDelegateProxy.swift */,\n\t\t\t\t90D0F930F0AE0A2471269302003B8A5F /* RxWebViewDelegateProxy.swift */,\n\t\t\t\t4DCA82E849FDD3356D44EC7B8EE2BA84 /* SchedulerType+SharedSequence.swift */,\n\t\t\t\t41DF1FD6C9D2BDC29A48989F838D1ECD /* SectionedViewDataSourceType.swift */,\n\t\t\t\tAF66AEF465B9C56A648DA16DBF3D2E4E /* SharedSequence.swift */,\n\t\t\t\t20DFDFC714EBFF20FC56B6534173B322 /* SharedSequence+Operators.swift */,\n\t\t\t\tB840B6E9063F05A5F844D55042BC104D /* SharedSequence+Operators+arity.swift */,\n\t\t\t\tF570C010C51F2EDFA2B29E61A28988D2 /* Signal.swift */,\n\t\t\t\t622801585769EF5EF95DF31C3FC639A9 /* Signal+Subscription.swift */,\n\t\t\t\tAE48FA13FBA4585E33723ED2572A6754 /* TextInput.swift */,\n\t\t\t\tD0C3B1C0259FBCD7A10525F73D370CF5 /* UIActivityIndicatorView+Rx.swift */,\n\t\t\t\tD69D61C111C8F4287DFE589110A04EA4 /* UIAlertAction+Rx.swift */,\n\t\t\t\t58674873A60E033E010D6D00276BA742 /* UIApplication+Rx.swift */,\n\t\t\t\t98B0262ADD4A92D4CCFE4F51BE3FD5D5 /* UIBarButtonItem+Rx.swift */,\n\t\t\t\t9BBEE2DB22AD2B01DE2D742F08B660DE /* UIButton+Rx.swift */,\n\t\t\t\t51BA22372DFDD297D4C486B391AE3C50 /* UICollectionView+Rx.swift */,\n\t\t\t\t7E01EF7A9628B4C49AC12163B4FE6A91 /* UIControl+Rx.swift */,\n\t\t\t\tF28EC587F2484F4548370BCE6AA22C0C /* UIDatePicker+Rx.swift */,\n\t\t\t\t64ED938103FC90F798F7A60F04981575 /* UIGestureRecognizer+Rx.swift */,\n\t\t\t\tDBF02AD8B77821AA7137D153FD7D26DC /* UIImageView+Rx.swift */,\n\t\t\t\tDE31A7BD0FFA90C66DA1DEBAD573E053 /* UILabel+Rx.swift */,\n\t\t\t\tD94169655CF6B1F44A9F5A11128DFBB5 /* UINavigationController+Rx.swift */,\n\t\t\t\t610EF28DB806E2D0ECBF17409EB9EABE /* UINavigationItem+Rx.swift */,\n\t\t\t\tB599D41042A76B9DF98EB3822B3056BA /* UIPageControl+Rx.swift */,\n\t\t\t\tD819115F4043DA9F9126B97A2AAD84BD /* UIPickerView+Rx.swift */,\n\t\t\t\t7C4B50F1957DB069477D1DF3B46EE040 /* UIProgressView+Rx.swift */,\n\t\t\t\t7645EEB7C195C4CF487DFA28BA57D8E5 /* UIRefreshControl+Rx.swift */,\n\t\t\t\tEE68236572EEA4E94A38244743901FE9 /* UIScrollView+Rx.swift */,\n\t\t\t\tC2316CDD5367CCF5307F4C680E70DBBA /* UISearchBar+Rx.swift */,\n\t\t\t\t53D0CE43D178809120E722B457D98361 /* UISearchController+Rx.swift */,\n\t\t\t\t645CC45F2863AE7D2A6FB2A8C23E620F /* UISegmentedControl+Rx.swift */,\n\t\t\t\t1B3623F446EB11D7EE2B1A505A7B1E5F /* UISlider+Rx.swift */,\n\t\t\t\tCDB96EFEBACCC377C2C1852E1187BDE3 /* UIStepper+Rx.swift */,\n\t\t\t\t4773B687AFC9012C6545F9C30E80356F /* UISwitch+Rx.swift */,\n\t\t\t\t9707233113E3D0E414A32F652E88D1D8 /* UITabBar+Rx.swift */,\n\t\t\t\t25A0BA6CC0B9439AAC6261DC60D7AE1C /* UITabBarController+Rx.swift */,\n\t\t\t\tBE4D4A9C4DD3E20DEF7AD0D414C67442 /* UITabBarItem+Rx.swift */,\n\t\t\t\tAFBBB6581E245F03FD7746F2B3F6838A /* UITableView+Rx.swift */,\n\t\t\t\t7088D6C1ADBF5BBD12CFF84A0E220FA2 /* UITextField+Rx.swift */,\n\t\t\t\tF6367B989A05CB68EFF4B1822D8DB33E /* UITextView+Rx.swift */,\n\t\t\t\t8546B56E228E6A78E32833D60BB6D648 /* UIView+Rx.swift */,\n\t\t\t\t536B3E455CFA43C1E70A9AD9ACF3CD69 /* UIViewController+Rx.swift */,\n\t\t\t\tAE7697FE2AC8BF4148D6676FBC1B5A23 /* UIWebView+Rx.swift */,\n\t\t\t\tD8FDDBEBD3900E6B6B3DE7D9D96C0CFA /* URLSession+Rx.swift */,\n\t\t\t\t22A086CB1B582E984EBA7863AED9A385 /* Support Files */,\n\t\t\t);\n\t\t\tpath = RxCocoa;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t849E14A0A0FF8260C7A696605813B350 /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF1AC2191C0BA5AC761428DAD97E25B05 /* Info.plist */,\n\t\t\t\t2FD006214C2E7016C83E906BBB4CD624 /* Then.modulemap */,\n\t\t\t\tEC5D50260AEE66CC8FD97C3CF9E10E7F /* Then.xcconfig */,\n\t\t\t\tD6AD0538BC7F97DC3694296C53DBE9C8 /* Then-dummy.m */,\n\t\t\t\tC5A28FC784D68445E20B42FEE607E770 /* Then-prefix.pch */,\n\t\t\t\tF71B53FF12451C5503271983A3FE932B /* Then-umbrella.h */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/Then\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t91854DC425805DA1171104E85059B15F /* Kingfisher */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t20735E206ED10BEE6B25EC79F4DB6BFA /* AnimatedImageView.swift */,\n\t\t\t\t74AE307751AFEBCC18F1E034FE08A05F /* Box.swift */,\n\t\t\t\t76C763EC2CA9D13E7E93A029686393D1 /* CacheSerializer.swift */,\n\t\t\t\t4D3E83D571BF2E77162C09F72FD66D3C /* Filter.swift */,\n\t\t\t\t9FDFBC7B8CD4E93779C4C76ACF38B06D /* FormatIndicatedCacheSerializer.swift */,\n\t\t\t\t52D36179922B35EB5035CA039865F6B7 /* Image.swift */,\n\t\t\t\tCC6A0E89EEA59CA5659D2EED0C773FD1 /* ImageCache.swift */,\n\t\t\t\tFB757B34331F94A8CE2ABFE0AC0050D4 /* ImageDownloader.swift */,\n\t\t\t\tB48B219E8CC99707DBEA39F8FF5389AA /* ImagePrefetcher.swift */,\n\t\t\t\tCB17D569CE831A4F4E00E2FC816EBBC9 /* ImageProcessor.swift */,\n\t\t\t\t56FC32B26F57769DE2EFE454C78CC62C /* ImageTransition.swift */,\n\t\t\t\tBE96693365ED0583573F43D8F5B57187 /* ImageView+Kingfisher.swift */,\n\t\t\t\t3D450DFC0A437B3075E6E68C0FA1A2B3 /* Indicator.swift */,\n\t\t\t\t6100112F9C1D863256E650CDE2B078D9 /* Kingfisher.h */,\n\t\t\t\tCC6B9B2770629FBEE8FF3829E91ACE5A /* Kingfisher.swift */,\n\t\t\t\t59830F33473DBCA365D965B7747764A8 /* KingfisherManager.swift */,\n\t\t\t\tB28CBB9A2FC6BD76A7188D520046176D /* KingfisherOptionsInfo.swift */,\n\t\t\t\tF68D0C4E903F4B9E77676032554A5278 /* Placeholder.swift */,\n\t\t\t\tC5BFA257EAD55FA150B56C6B292EAA44 /* RequestModifier.swift */,\n\t\t\t\t5B95FDEC37C94B6EBD089F1AD6038F94 /* Resource.swift */,\n\t\t\t\t348D24C7C0138AD0B581B484EA58AD8B /* String+MD5.swift */,\n\t\t\t\t0D8A0052E8AA49DDD883B85DEA3F90EF /* ThreadHelper.swift */,\n\t\t\t\tCF47A0081987D5825B05757F83159AE9 /* UIButton+Kingfisher.swift */,\n\t\t\t\tAF35B728E3D11CF36741264854AEE4DB /* Support Files */,\n\t\t\t);\n\t\t\tpath = Kingfisher;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9219C6A5FCFAFE30FB019F9ABF07FAE1 /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t94AFD9A0BE692417B5A84BF31B1763F3 /* Alamofire */,\n\t\t\t\tFE7BFC8454D904E1F9A200B5AA47553D /* Differentiator */,\n\t\t\t\t7396FD9E9C585EB1A3E6449CEC17B0F1 /* IQKeyboardManagerSwift */,\n\t\t\t\t91854DC425805DA1171104E85059B15F /* Kingfisher */,\n\t\t\t\t2A11EEEC2D225026B3E7D7223F9F7A6F /* MJRefresh */,\n\t\t\t\t45B00A8DA5873AD20582737CD95C2411 /* Moya */,\n\t\t\t\tC26864CA1ECB3E70EBF7A7DC22D08C02 /* NSObject+Rx */,\n\t\t\t\t4F4D1E519FEB89BA1386B9D98230B348 /* ObjectMapper */,\n\t\t\t\t60E933F022A2CA3C626EFE6FCECD25C1 /* ReactorKit */,\n\t\t\t\tA6BD63DC5D5D61FEFD9C681CFDA5C833 /* Result */,\n\t\t\t\tAC1EB74202399251F1E67DFED51A6FF0 /* ReusableKit */,\n\t\t\t\t00B445FBF5C55D58619DD22ADD326E0B /* RxAlamofire */,\n\t\t\t\t80B62B3BBDF1C43E982FC967D7AC3D71 /* RxCocoa */,\n\t\t\t\tCBCC60F9772D804FC0E251BD1EB78034 /* RxDataSources */,\n\t\t\t\tB53A238D42B5CB5510AEA87118ED8D68 /* RxGesture */,\n\t\t\t\t304EFC2FC2C7CF78255AFFCF0DB1A0DB /* RxSwift */,\n\t\t\t\t013689684E64F7EE37E9EED321657B7F /* SnapKit */,\n\t\t\t\t45BA95C8E036FDF76B829A05394F3326 /* SwiftyColor */,\n\t\t\t\tA0C41F30E953A47452B5187BA80452B2 /* SwiftyJSON */,\n\t\t\t\tB51488D131FEEE7D671B05C2D36AFA33 /* Then */,\n\t\t\t\t536713D0367D857983EAE8C88CBFAD20 /* TTRangeSlider */,\n\t\t\t\tB56A5B65D45C38D24EB740EBAD49DC83 /* TYCyclePagerView */,\n\t\t\t\tE0846B1B4A46262524A31FD8066ED283 /* TYPagerController */,\n\t\t\t\tE7BA26169D457678D84E11AE5BDBDE6A /* URLNavigator */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t94AFD9A0BE692417B5A84BF31B1763F3 /* Alamofire */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7253973D128A903FF19D65F0A9DB9316 /* AFError.swift */,\n\t\t\t\t1CD95565DA23CF770293505264420AE0 /* Alamofire.swift */,\n\t\t\t\t74515FDED92421AF135AF3C0B8B08A1B /* DispatchQueue+Alamofire.swift */,\n\t\t\t\tDC30C48A2548E77051CB43345238F5E4 /* MultipartFormData.swift */,\n\t\t\t\tDC3268ED5E6ABB0ABCDEEE48CE0CD78F /* NetworkReachabilityManager.swift */,\n\t\t\t\t187ACC537834C3D22473C47D21364850 /* Notifications.swift */,\n\t\t\t\t5EEFED166A077BBCCE208D34F71B616C /* ParameterEncoding.swift */,\n\t\t\t\tB8D62DD162002F9C56F1C29692DB9FB4 /* Request.swift */,\n\t\t\t\tB2E6EA6ADCEAC27A4822132EBAC46122 /* Response.swift */,\n\t\t\t\t720B12F497653C86DA2AF27BCCDEFC2D /* ResponseSerialization.swift */,\n\t\t\t\t812C7F916BBBCD2970C245989B39CD1B /* Result.swift */,\n\t\t\t\t83B89463432FAA55975050E17F0E6B42 /* ServerTrustPolicy.swift */,\n\t\t\t\t80DD88365EFE5E0A8E363300ADCE2DCC /* SessionDelegate.swift */,\n\t\t\t\t95F766DA63DDEB880E468218435A871E /* SessionManager.swift */,\n\t\t\t\t2CE37D8A7C1180573189B3F4D4D5D2A0 /* TaskDelegate.swift */,\n\t\t\t\t7FF0A342E014C442F7C7474857AF5961 /* Timeline.swift */,\n\t\t\t\tE7023AE71AB1962FA73C0D900E6564BE /* Validation.swift */,\n\t\t\t\tD14EB94F4E9A069FF4BDEECDA5906685 /* Support Files */,\n\t\t\t);\n\t\t\tpath = Alamofire;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tA0C41F30E953A47452B5187BA80452B2 /* SwiftyJSON */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4DBD4CA78A84FE60982AF0780EC62DD2 /* SwiftyJSON.swift */,\n\t\t\t\tB77159DF4E517929A1AF172DBA71E823 /* Support Files */,\n\t\t\t);\n\t\t\tpath = SwiftyJSON;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tA6BD63DC5D5D61FEFD9C681CFDA5C833 /* Result */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t36C41A4EDAFACF2FCF4214E703CD5C47 /* Result.swift */,\n\t\t\t\t6A8E64555EB2FE7D579467AABA52EB26 /* ResultProtocol.swift */,\n\t\t\t\t675A751295C96B00405E15E00041E422 /* Support Files */,\n\t\t\t);\n\t\t\tpath = Result;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tA723DA53CE13E2220EC96B75C92CBEDE /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5D1AFD41323E3922E91E58F1C828C74E /* Info.plist */,\n\t\t\t\tEC766D153E5F9EEED025A6A61E553812 /* MJRefresh.modulemap */,\n\t\t\t\tDB2A4AE8B923CFBB0D0531CB91C712CE /* MJRefresh.xcconfig */,\n\t\t\t\tD52211FFC97D4BB7CF97DA504F823D77 /* MJRefresh-dummy.m */,\n\t\t\t\t8FF79B88AE1A71885D5E17758DB372B4 /* MJRefresh-prefix.pch */,\n\t\t\t\t78266012E1D0050485CA537DD6F66FF5 /* MJRefresh-umbrella.h */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/MJRefresh\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAC1EB74202399251F1E67DFED51A6FF0 /* ReusableKit */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t38BFD9FA65D37C0B02CF123BFDEAA695 /* Core */,\n\t\t\t\t1B1EA4443A2498E941CD029F27E9639D /* RxSwift */,\n\t\t\t\t7A355B44A1746EE91ED56D1FB55506FC /* Support Files */,\n\t\t\t);\n\t\t\tpath = ReusableKit;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAF35B728E3D11CF36741264854AEE4DB /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tE00D0BE5D24B8BDE0B2711827A346D65 /* Info.plist */,\n\t\t\t\tB0E8C13296CD0445ED73183C8774BA83 /* Kingfisher.modulemap */,\n\t\t\t\tB6DD7C62D3975725987453F154E89E03 /* Kingfisher.xcconfig */,\n\t\t\t\t347D8CF191232FE2DBCADBECC8AB9A5F /* Kingfisher-dummy.m */,\n\t\t\t\t5385AD0D889B0E809D292504198A4D49 /* Kingfisher-prefix.pch */,\n\t\t\t\t36B939D525A7B01D959ECFCBDE9C0550 /* Kingfisher-umbrella.h */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/Kingfisher\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB51488D131FEEE7D671B05C2D36AFA33 /* Then */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t97927D56FAC9E735B7340A75B06C0600 /* Then.swift */,\n\t\t\t\t849E14A0A0FF8260C7A696605813B350 /* Support Files */,\n\t\t\t);\n\t\t\tpath = Then;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB53A238D42B5CB5510AEA87118ED8D68 /* RxGesture */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t87C5FAB0B3B58A21449A74F3BE0722D4 /* GestureFactory.swift */,\n\t\t\t\t9CD9A0FE14A09A30BF80B2ABA5E19488 /* RxGestureRecognizerDelegate.swift */,\n\t\t\t\tE6D2C080BD70A34F38B01F04F8C066D6 /* SharedTypes.swift */,\n\t\t\t\t3B157B779C8184526F0932ECBA9879A9 /* TransformGestureRecognizers.swift */,\n\t\t\t\tA5C87EF44982A4D3803D88EB9983E52D /* UIGestureRecognizer+RxGesture.swift */,\n\t\t\t\t500A7C34BE698156B2539B1AFD8A1AF3 /* UILongPressGestureRecognizer+RxGesture.swift */,\n\t\t\t\tB3F4C6BA01C9A3737D53D5029569BD25 /* UIPanGestureRecognizer+RxGesture.swift */,\n\t\t\t\t569E77B7F0029A0A2087DE259C07DB22 /* UIPinchGestureRecognizer+RxGesture.swift */,\n\t\t\t\t4F707D328F3FE6B0BA81F88374DC441C /* UIRotationGestureRecognizer+RxGesture.swift */,\n\t\t\t\tFD5F22C193A3AD6545BDE4B91729668D /* UIScreenEdgePanGestureRecognizer+RxGesture.swift */,\n\t\t\t\t59330F519A185D61B0CDC18A2BC8BEF7 /* UISwipeGestureRecognizer+RxGesture.swift */,\n\t\t\t\t589D959893A1EF698394AAC806F18758 /* UITapGestureRecognizer+RxGesture.swift */,\n\t\t\t\t0F46744125C99B20BDE8928C9D91767D /* View+RxGesture.swift */,\n\t\t\t\tDEDDC2BCC376C172337F9B2E2B10E662 /* Support Files */,\n\t\t\t);\n\t\t\tpath = RxGesture;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB56A5B65D45C38D24EB740EBAD49DC83 /* TYCyclePagerView */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4FC00E6B5EA00A0D7CA1DC61742ABA25 /* TYCyclePagerTransformLayout.h */,\n\t\t\t\tC47049CF48166B10EF910F23995AEC84 /* TYCyclePagerTransformLayout.m */,\n\t\t\t\t01974B7A9277DCB1555881FFD8B7A8E1 /* TYCyclePagerView.h */,\n\t\t\t\tE1D44E21411F23F3505F31B444A1A104 /* TYCyclePagerView.m */,\n\t\t\t\tA93A51F7564EC64C94864C9A11DF7A0D /* TYPageControl.h */,\n\t\t\t\tE99B4913C9AF498445CF9BB785FFBFFF /* TYPageControl.m */,\n\t\t\t\t0065A8C3C82D11C680574000E0D0A173 /* Support Files */,\n\t\t\t);\n\t\t\tpath = TYCyclePagerView;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB5FA546B46ADE3CF57779910E708C19D /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8503DD41469B8F78519D7D0B98DBEE66 /* Info.plist */,\n\t\t\t\t1CB7A49991CF5D7E632585BCFD130C56 /* RxDataSources.modulemap */,\n\t\t\t\tA222328DE93D544E711805351EB49909 /* RxDataSources.xcconfig */,\n\t\t\t\tE031F5913ADD2E4B2FE376BDDB99068C /* RxDataSources-dummy.m */,\n\t\t\t\t3BEF595F5CDFC591D3F78073BECD08C6 /* RxDataSources-prefix.pch */,\n\t\t\t\tB9B6B63EED3B0A8A6802499D6992A2CE /* RxDataSources-umbrella.h */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/RxDataSources\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB6F2514C869FD45712CBC40F05EEAC6C /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t62DDFD5098F37CBDB331E2282F8DEB42 /* Info.plist */,\n\t\t\t\tDE2A6BA18853C4598D21FDBBD902BD32 /* IQKeyboardManagerSwift.modulemap */,\n\t\t\t\t8D9FE6C7F2AC2C3319C58D4272FD52C1 /* IQKeyboardManagerSwift.xcconfig */,\n\t\t\t\t51312E298DD4FE8C24D45F0F9149E1EB /* IQKeyboardManagerSwift-dummy.m */,\n\t\t\t\t95E7A514BFE979A1185DE2AD4CF665AB /* IQKeyboardManagerSwift-prefix.pch */,\n\t\t\t\t973B74E176AD01454BE984AC4A7136A0 /* IQKeyboardManagerSwift-umbrella.h */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/IQKeyboardManagerSwift\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB77159DF4E517929A1AF172DBA71E823 /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t16A6BD5743A5A18E98F1E4D0B05E9282 /* Info.plist */,\n\t\t\t\t712CA70976070E14072608793D09319A /* SwiftyJSON.modulemap */,\n\t\t\t\t4E295D0CB7D2F465413AC6086CBF8C49 /* SwiftyJSON.xcconfig */,\n\t\t\t\t4DD33D08EA36F2C8861A36D8E15B3610 /* SwiftyJSON-dummy.m */,\n\t\t\t\t8F3B9C1AE8FD54707F43CF28561D8FF7 /* SwiftyJSON-prefix.pch */,\n\t\t\t\tC8B8D267B8E5E2A789EBA75CCFF121F2 /* SwiftyJSON-umbrella.h */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/SwiftyJSON\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tC26864CA1ECB3E70EBF7A7DC22D08C02 /* NSObject+Rx */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4896403B4FA72B445E17270A138939D3 /* HasDisposeBag.swift */,\n\t\t\t\t7A8F833CA4526A1FF65CC394962AD92E /* NSObject+Rx.swift */,\n\t\t\t\t487312B5947B5B410F4B2D74B97A64B4 /* Support Files */,\n\t\t\t);\n\t\t\tpath = \"NSObject+Rx\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tC2E4BC97956884C852E7E3676114F4CD /* Core */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t14F1C5DE23CD40C00D675D81FDE24A5E /* RxAlamofire.swift */,\n\t\t\t);\n\t\t\tname = Core;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tC517B73BB29B67C841CF338715E23F63 /* Pods-RxXMLY */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9547423EEA761582EF5FDB90684A1EE8 /* Info.plist */,\n\t\t\t\t36F99765559218EBDA04ED80AEF34EB9 /* Pods-RxXMLY.modulemap */,\n\t\t\t\tAE8EA095AFC8941AABB28F7469B54C94 /* Pods-RxXMLY-acknowledgements.markdown */,\n\t\t\t\t0545D09F28CBBEE994F089B68636507A /* Pods-RxXMLY-acknowledgements.plist */,\n\t\t\t\t85302FAB5FE773C188E3758D45ABFF83 /* Pods-RxXMLY-dummy.m */,\n\t\t\t\t14D38200F2B2C8E328B6E393A63B99D2 /* Pods-RxXMLY-frameworks.sh */,\n\t\t\t\tE8D6DDBD1576F25B98F7059832A190A3 /* Pods-RxXMLY-resources.sh */,\n\t\t\t\t17CB2FA1178A4F2E225AE19BEFEB3B81 /* Pods-RxXMLY-umbrella.h */,\n\t\t\t\t716F007B040C0CDD77F14CF5209FEE01 /* Pods-RxXMLY.debug.xcconfig */,\n\t\t\t\t3F697E60BD60ED1A4604DA7BF8581AB1 /* Pods-RxXMLY.release.xcconfig */,\n\t\t\t);\n\t\t\tname = \"Pods-RxXMLY\";\n\t\t\tpath = \"Target Support Files/Pods-RxXMLY\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tC87EF0D2F5E72ED8D8AE2A78F9590FBF /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t223F91E90B67ADF004A7E4543864C0E4 /* Info.plist */,\n\t\t\t\t3E96DBA0FB443524D03EAA0B1907D6DF /* SnapKit.modulemap */,\n\t\t\t\t82C7B1F1647EBCD9A81E7A2788701631 /* SnapKit.xcconfig */,\n\t\t\t\t5E257A033C34CB083326378E455CBA7C /* SnapKit-dummy.m */,\n\t\t\t\tF01E5E91EC940C05D243E33611C9CA5C /* SnapKit-prefix.pch */,\n\t\t\t\tD2D55E77F429A861A4AEA5872801C81A /* SnapKit-umbrella.h */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/SnapKit\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tCBCC60F9772D804FC0E251BD1EB78034 /* RxDataSources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6E8E6375D3923532919D7663A2689D73 /* AnimationConfiguration.swift */,\n\t\t\t\t0BF26D84DAD5A55C5E5BE6A0660FAEEF /* Array+Extensions.swift */,\n\t\t\t\t85B5D2C3BA32F9BC3AA7C975B97F6A50 /* CollectionViewSectionedDataSource.swift */,\n\t\t\t\t591CADBCCC57E88AE178D78B8606C938 /* DataSources.swift */,\n\t\t\t\tB9CFFF8A56873944159E6B04DBAD45BD /* Deprecated.swift */,\n\t\t\t\t2FF3BD6C6FED1A57B6B88C3F0EFEB6A3 /* FloatingPointType+IdentifiableType.swift */,\n\t\t\t\t63CA5A419783AFF7463EA6144B0C1E36 /* IntegerType+IdentifiableType.swift */,\n\t\t\t\t9F86ADA13F9525995BA4102D3E1950B2 /* RxCollectionViewSectionedAnimatedDataSource.swift */,\n\t\t\t\t7897B0DA6B24D6557C87D44F527163A2 /* RxCollectionViewSectionedReloadDataSource.swift */,\n\t\t\t\t84378AB9BAB98B7273235CFA0707DE2D /* RxPickerViewAdapter.swift */,\n\t\t\t\t1599175E64562E7F65DC8ECDF4F4E69D /* RxTableViewSectionedAnimatedDataSource.swift */,\n\t\t\t\tAA64CC4D23BCB33D713381874C6A93C9 /* RxTableViewSectionedReloadDataSource.swift */,\n\t\t\t\t5E6586D8B7FB36BDE9E96FE450F51E98 /* String+IdentifiableType.swift */,\n\t\t\t\t2F1C6F4433BDCCAB44D788A1B10A5011 /* TableViewSectionedDataSource.swift */,\n\t\t\t\t53647AFE918247CC408B6EF13349D614 /* UI+SectionedViewType.swift */,\n\t\t\t\t42F0AF2A7F102777266AB6FFCA689615 /* ViewTransition.swift */,\n\t\t\t\tB5FA546B46ADE3CF57779910E708C19D /* Support Files */,\n\t\t\t);\n\t\t\tpath = RxDataSources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD14EB94F4E9A069FF4BDEECDA5906685 /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4761B90E528EAB72D76DD1A76777354E /* Alamofire.modulemap */,\n\t\t\t\t9855A9C6CDDA35414C161F75BED8B6F8 /* Alamofire.xcconfig */,\n\t\t\t\tA82133367E269E7AA71B9DB6052EFEEB /* Alamofire-dummy.m */,\n\t\t\t\t08EF34F0793697F59142C4D8F3A0D159 /* Alamofire-prefix.pch */,\n\t\t\t\t21805A4E1E5079259A7A86A6D073E71B /* Alamofire-umbrella.h */,\n\t\t\t\t2D9BD6B28993FCB68120C1EE96813B72 /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/Alamofire\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD2FEDEA5B32B192432554BB4449C46F8 /* Core */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tCEA052CCABE96871EBBAFD7D6C959A06 /* AccessTokenPlugin.swift */,\n\t\t\t\t66B23F5CD12DC047D454DFB36DAF64B7 /* AnyEncodable.swift */,\n\t\t\t\t70459A28397D1E419B4B3394FA8435F3 /* Cancellable.swift */,\n\t\t\t\t4CB47246A17CA14228A79384E13C42EC /* CredentialsPlugin.swift */,\n\t\t\t\t74A0AC039E269E338928C0D25F4ABC01 /* Endpoint.swift */,\n\t\t\t\t298536EB0ACF540DC4DC34F019837D74 /* Image.swift */,\n\t\t\t\tDD71B5E50804962A47932EB53600027A /* Moya+Alamofire.swift */,\n\t\t\t\t2F9BB5EBA26D7BF9CA0C3B21B1AAD9EE /* MoyaError.swift */,\n\t\t\t\t0049E24D8DFDDC0E246DC35576E7DCFB /* MoyaProvider.swift */,\n\t\t\t\t1555063617BFE21D0E44B5255EA230FE /* MoyaProvider+Defaults.swift */,\n\t\t\t\tAB53371318D8626F8F670FACB15EC0F0 /* MoyaProvider+Internal.swift */,\n\t\t\t\tE5D465BD6EB72259B11615DB9761D3DB /* MultipartFormData.swift */,\n\t\t\t\tBDA8654A5097FB77F91981EC742DE882 /* MultiTarget.swift */,\n\t\t\t\t1C02566F282B7374FFE638BE27D65EBC /* NetworkActivityPlugin.swift */,\n\t\t\t\t6E3539D710126BA8CE5B7B6A9EBF994E /* NetworkLoggerPlugin.swift */,\n\t\t\t\t125CF19DCF28A39EC761EA281EBBC44B /* Plugin.swift */,\n\t\t\t\tDB7464D95C191D51D7944010316440FF /* Response.swift */,\n\t\t\t\t08D8E58342C1CDB4D227FD9491D0E369 /* TargetType.swift */,\n\t\t\t\tF4F172EFA622B78B8E948E1F153B1BDD /* Task.swift */,\n\t\t\t\t088517E9B0F7ED44CFEB3E14F7379BF5 /* URL+Moya.swift */,\n\t\t\t\tD85A799653D3BC7BA7BDB6BD691336F8 /* URLRequest+Encoding.swift */,\n\t\t\t);\n\t\t\tname = Core;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tD5050FC1A785C83B3ADD912414E51051 /* iOS */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1C719E3ABA8B6DE4B326AD2FF6313BA2 /* CFNetwork.framework */,\n\t\t\t\t313319FF55255C3736F46998BCDF7F8A /* CoreGraphics.framework */,\n\t\t\t\t6F10EACF1B2D7C5A4C670634756973B3 /* Foundation.framework */,\n\t\t\t\t7481193578343285EC8F430B736D1314 /* QuartzCore.framework */,\n\t\t\t\t0E5F9481F27654B03C1A5A056D8909FB /* UIKit.framework */,\n\t\t\t);\n\t\t\tname = iOS;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tDEA91A40A855CC667C28E90C7BC1131C /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8B3B388CB20702989EAED439666B6E88 /* Info.plist */,\n\t\t\t\tB68C41252797A96DC3101FEF24BD28A4 /* Moya.modulemap */,\n\t\t\t\t28FD4835CF32D5E0B1A2A3753A09DBB0 /* Moya.xcconfig */,\n\t\t\t\t8C6994BF34E50D97EB111CDFB02DA22A /* Moya-dummy.m */,\n\t\t\t\t465C09D0B89915A2BF9E8EE9623D1080 /* Moya-prefix.pch */,\n\t\t\t\t737DA5252745C9E3883929C8A145E22E /* Moya-umbrella.h */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/Moya\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tDEDDC2BCC376C172337F9B2E2B10E662 /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tE75CBFE107A4EA81EDD844CA7F371A0B /* Info.plist */,\n\t\t\t\t8065BEF90C7FDDBD3D7FB5E732D08AD7 /* RxGesture.modulemap */,\n\t\t\t\t41B3ACB613105C496C9AA802C306A439 /* RxGesture.xcconfig */,\n\t\t\t\tBE0C2F5C5C4F8CD822C21482EBE49DD8 /* RxGesture-dummy.m */,\n\t\t\t\tC70DA4143C75E4B49245F0F990AF117E /* RxGesture-prefix.pch */,\n\t\t\t\tE010BA57C8A6D94C6A65D63FA871BFCB /* RxGesture-umbrella.h */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/RxGesture\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tE0846B1B4A46262524A31FD8066ED283 /* TYPagerController */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC0155AA3020891E25233E5B541EF2063 /* TYPagerController.h */,\n\t\t\t\t1F5B9A2F08507775E806FE12ED90BAF6 /* TYPagerController.m */,\n\t\t\t\t0E5085F3C34DD0D51CCDC43343115505 /* TYPagerView.h */,\n\t\t\t\t6C82E28899508F47FDD43F9C7D4722F0 /* TYPagerView.m */,\n\t\t\t\tC5B39EAE40FAC88E85E0EDD5108794F0 /* TYPagerViewLayout.h */,\n\t\t\t\t1BFCDA5713A7916617594A7D5B7BB187 /* TYPagerViewLayout.m */,\n\t\t\t\t0F27A8AA53C280B6DF033E2515D7A2E9 /* TYTabPagerBar.h */,\n\t\t\t\t8E49B1A15261BE86B3137451B245C6BE /* TYTabPagerBar.m */,\n\t\t\t\tD609A4B215C782073049E462F652D85D /* TYTabPagerBarCell.h */,\n\t\t\t\t07A6E49BDE2308DCA0050930CA050850 /* TYTabPagerBarCell.m */,\n\t\t\t\tCD67BEEE3096E3E2BD09DF6158788A6E /* TYTabPagerBarLayout.h */,\n\t\t\t\tFA64F8A7EA7F1D019BA4637FA772850D /* TYTabPagerBarLayout.m */,\n\t\t\t\t88860B4DEDC2F32A5AC3E06DD5F534B0 /* TYTabPagerController.h */,\n\t\t\t\t24B87BC6C657291DEE2644EFCB9CA341 /* TYTabPagerController.m */,\n\t\t\t\t22B5011A39DF5849503132CEE075CC1E /* TYTabPagerView.h */,\n\t\t\t\tBE113770F3941380D55A0F946E7431DE /* TYTabPagerView.m */,\n\t\t\t\t19AF7A80FF7FACF9DA96ECF7C6C84AE6 /* Support Files */,\n\t\t\t);\n\t\t\tpath = TYPagerController;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tE7BA26169D457678D84E11AE5BDBDE6A /* URLNavigator */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t084AF2E51A268DBF8C3B947B137318FC /* Navigator.swift */,\n\t\t\t\t7A4923E32C7795B1406F85C0D769B8F1 /* NavigatorDelegate.swift */,\n\t\t\t\t5A310736267696B70A17786FD9CE22A3 /* NavigatorType.swift */,\n\t\t\t\t2F8F22838BEB780C855A8033AE7ED2A4 /* UIViewController+TopMostViewController.swift */,\n\t\t\t\t2988A2FCCBF291E4BEAC7F8D9AD45A9F /* UIViewControllerType.swift */,\n\t\t\t\t28C85F1DBF1BC0BBAE450D1FBEA54A9F /* URLConvertible.swift */,\n\t\t\t\tDB98DBDF6250E6EDD9D4711CCA72CDE3 /* URLMatcher.swift */,\n\t\t\t\t49DA791DE895721812C9EB83583324F0 /* URLMatchResult.swift */,\n\t\t\t\t2E647F479FFCF502B2E7DF9A363BE038 /* URLPatchComponentMatchResult.swift */,\n\t\t\t\t306015976D0F37EFAC711062A258D8E9 /* URLPathComponent.swift */,\n\t\t\t\t58F2F503951D4229783CFCA7DB8EFEEB /* Support Files */,\n\t\t\t);\n\t\t\tpath = URLNavigator;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tEEBFA1F60BB4035823034A2E49888E19 /* Support Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t89BBA936343137BAF519218BA7905C65 /* Info.plist */,\n\t\t\t\tE8D611801824EEACA86E5FF945882746 /* RxAlamofire.modulemap */,\n\t\t\t\t9D52DB027375B4BF6987825A6BF5751B /* RxAlamofire.xcconfig */,\n\t\t\t\t34903204D85860DD93734C3981A9900D /* RxAlamofire-dummy.m */,\n\t\t\t\tDE17B34AF63AF3BB97075A6D295FDCB3 /* RxAlamofire-prefix.pch */,\n\t\t\t\tA93AB57B4326570AC0951E305DD04B1F /* RxAlamofire-umbrella.h */,\n\t\t\t);\n\t\t\tname = \"Support Files\";\n\t\t\tpath = \"../Target Support Files/RxAlamofire\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tFE7BFC8454D904E1F9A200B5AA47553D /* Differentiator */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA7F1EA6B598A844B871DB54C2C1C197D /* AnimatableSectionModel.swift */,\n\t\t\t\t83BF88F0362AAB340061528783A19B27 /* AnimatableSectionModelType.swift */,\n\t\t\t\tA32996D04BF42DF4610DB92306B85695 /* AnimatableSectionModelType+ItemPath.swift */,\n\t\t\t\tC0764078D276516AEF879D67E95D225E /* Changeset.swift */,\n\t\t\t\t47C651CFF068171CF1C1237A69E7D99A /* Diff.swift */,\n\t\t\t\tD3869DF0902D254BD40D6B02E11A8B52 /* IdentifiableType.swift */,\n\t\t\t\tDA8C0C17C65F493BBDD9F7C413C2C378 /* IdentifiableValue.swift */,\n\t\t\t\t459BCD44D36BC348042325F44BD78250 /* ItemPath.swift */,\n\t\t\t\tC60A46D85400354A02A72584F53237D8 /* Optional+Extensions.swift */,\n\t\t\t\t923B40C1B730134DE3FB93D56434F359 /* SectionModel.swift */,\n\t\t\t\t2056BF365D2D7CC0FD46ED19EDBEE823 /* SectionModelType.swift */,\n\t\t\t\t3D11C85C7F13C6D98A3A465BC90BAD5C /* Utilities.swift */,\n\t\t\t\t488B1D880370242DA6DAA1BC23EE213D /* Support Files */,\n\t\t\t);\n\t\t\tpath = Differentiator;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t17C76A71E1AF9F09E4C42030A2627968 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF91B75BFF4738F36668933C397A9FCA8 /* _RX.h in Headers */,\n\t\t\t\t3FF87BDA510674F117F6EA54871A33F5 /* _RXDelegateProxy.h in Headers */,\n\t\t\t\t91C5F7C7350D7C7BAF11F0FFB2152C0C /* _RXKVOObserver.h in Headers */,\n\t\t\t\t38F166338687E3EDD813EC86634B915F /* _RXObjCRuntime.h in Headers */,\n\t\t\t\t9DE7A712CF1B72EBDF688D729F09EB2E /* RxCocoa-umbrella.h in Headers */,\n\t\t\t\tB8756B693A52F59BA955595B93A8AFE4 /* RxCocoa.h in Headers */,\n\t\t\t\t9D12124A0A7424D36B46A29F495E4394 /* RxCocoaRuntime.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t1C39EE49D85220A1F1F2EBF8D4A95BAE /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t3F911616F29C285D5A4D7F534F4412FC /* Then-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t1D0B0A5525CB3F57F2D64B587D880D88 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD820DE54D6E9E5C85E0F9BF8A399E5EF /* MJRefresh-umbrella.h in Headers */,\n\t\t\t\t35D685CF7C6F73A65AD3DD99674CA78F /* MJRefresh.h in Headers */,\n\t\t\t\tD9F2BA4D713DAC2A85CB4A453240EA3E /* MJRefreshAutoFooter.h in Headers */,\n\t\t\t\tD0E7D5B865722A25EC7D91B0FAD8A6CD /* MJRefreshAutoGifFooter.h in Headers */,\n\t\t\t\tA5382D3EA98D2EB1AD9EDA5F2138F00D /* MJRefreshAutoNormalFooter.h in Headers */,\n\t\t\t\tBA0711638621C2A47AABFF9E03546893 /* MJRefreshAutoStateFooter.h in Headers */,\n\t\t\t\tB02D91E02099D3C6A2F988C766032176 /* MJRefreshBackFooter.h in Headers */,\n\t\t\t\t2CEA12D52F3F7AC0669C99A157E19F62 /* MJRefreshBackGifFooter.h in Headers */,\n\t\t\t\t17F033046E658F3BFD0011DCB768CF54 /* MJRefreshBackNormalFooter.h in Headers */,\n\t\t\t\t1ED505CC385A149F4DF8F4B94BA4FC0B /* MJRefreshBackStateFooter.h in Headers */,\n\t\t\t\tA72D242BEF61E27D6C29092DF4666A4A /* MJRefreshComponent.h in Headers */,\n\t\t\t\tEBEB72F80DCD10DEB82BF5F856D467FD /* MJRefreshConst.h in Headers */,\n\t\t\t\tAA4959949A290D4B8BE1E31A890D0C80 /* MJRefreshFooter.h in Headers */,\n\t\t\t\t6A0B1A0FA7A75C861B9D401D0E8CC95E /* MJRefreshGifHeader.h in Headers */,\n\t\t\t\t71F6D96E3AEAA07389F37E2C4B63C4F6 /* MJRefreshHeader.h in Headers */,\n\t\t\t\t7942D242D079A5710A72B659A54D7E26 /* MJRefreshNormalHeader.h in Headers */,\n\t\t\t\tBDB33C3708110C6D755175D1F0A2A70B /* MJRefreshStateHeader.h in Headers */,\n\t\t\t\t58E6E68D10EF3D64522BD267CC1761A6 /* NSBundle+MJRefresh.h in Headers */,\n\t\t\t\tD02DEBC241C24DEEFDA13C355197A2FB /* UIScrollView+MJExtension.h in Headers */,\n\t\t\t\t0EFB524EFDF2F8712A2F5067817A672E /* UIScrollView+MJRefresh.h in Headers */,\n\t\t\t\tDE17E4C2C6EADE5D2D531268B1695405 /* UIView+MJExtension.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t1E0A822016AA6CF232BB4F6126F81008 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t9FEDD419BBF24CFC1354161636496389 /* ReusableKit-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t26DA2FB42087A700B13CACAD4C243527 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2C33DAACDC03995C3FEC4FA750B506CE /* SnapKit-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t2BF0A2F53314CF5EB4D294D79B51E354 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tA325A1B4D4D686789B291144FB283D47 /* TYCyclePagerTransformLayout.h in Headers */,\n\t\t\t\tCA8174FE073791F18FB8C74BB2C4FF57 /* TYCyclePagerView-umbrella.h in Headers */,\n\t\t\t\t40092E84B6E1A2354BEDE901662715E1 /* TYCyclePagerView.h in Headers */,\n\t\t\t\t017B5B39D7D0CCD88DEAB2F1F5D0D274 /* TYPageControl.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t308BF610A5FF6340C2E8EEDF96409AF2 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1A84FB9D49D5E5E8EC11B4BFA93CD7FE /* Pods-RxXMLY-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t30A3523FB43B8D358EF8AEAD51B489A7 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t273AF2009B201DC6C16AEF4030FFDFE6 /* ReactorKit-umbrella.h in Headers */,\n\t\t\t\tD500BAC2F56A14AA3226D7087700D426 /* ReactorKitRuntime.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t36F057C44DEF91262D41374313982B4F /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t6E67DFDCD807369FC97F5F093ADCEB94 /* Differentiator-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t3BF3E42635E5BE1A480B8821B6E82E84 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD20061C845E39003EB86AB1292B4577D /* TTRangeSlider-umbrella.h in Headers */,\n\t\t\t\tA9DCAB1B8D538519A3E04A656155C163 /* TTRangeSlider.h in Headers */,\n\t\t\t\t29560D9109C9140F67F3105A1DE0A5F8 /* TTRangeSliderDelegate.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t44C7AC23726DE4E6D35D8A1D17730BA9 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t555AABD226E4FCBD91442DE5AED8483A /* Moya-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t4BF45E5E0A4403672C04711914CE660B /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t25B9DC627989966BCF1DCECDABD78D23 /* RxGesture-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t84676F7D46FF521291CDEB2AB04A454C /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2F288ED3641B2B4775884C462AE377E6 /* Kingfisher-umbrella.h in Headers */,\n\t\t\t\t5B5D8AE167BD8E304CE474A9B8DBA2B4 /* Kingfisher.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t8986C70AFF55B1DD012A7C84159924F9 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t22B40C80735B7CFAC7106C5FF6EA542F /* URLNavigator-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t899E65E945FC87EA2CEC3E51348F11FE /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tE97BD9D3A62BD8225C79AB2D4C4F16B3 /* RxAlamofire-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t8D2725658BE0A873BBAEB9B56FC7946F /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tDDDF354A21835294F7CFB5ACFA5EA968 /* NSObject+Rx-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t9B99F75C95AED0A71535DFF717EBD5DD /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF3E97A8E1D1ED2B3D24961995923B99A /* SwiftyColor-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tB4002B6E97835FDCCAA5963EFE09A3E0 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1B9EDEDC964E6B08F78920B4F4B9DB84 /* Alamofire-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tBEB4271AF5F1D6B253A061B69AA6AC34 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7C8AABC35DC356D57A0766A331DAC4DF /* RxSwift-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tC82B5F04767CB991E84734A54D0ABA5B /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t87AD9D97F0F94C85720FC018235CD8A9 /* IQKeyboardManagerSwift-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF1E7E834BDE614B36F8B992268E4CADD /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tC543308E999E593FE565FCE053658718 /* TYPagerController-umbrella.h in Headers */,\n\t\t\t\t58523F5544BDE0B82DC6E63014A5638F /* TYPagerController.h in Headers */,\n\t\t\t\tAF2C3FA58842BEF584ABF0D15CD53311 /* TYPagerView.h in Headers */,\n\t\t\t\t5D448725D385F6D5B24C43CC9448F8E5 /* TYPagerViewLayout.h in Headers */,\n\t\t\t\tE0C9EB4ED4DC98789196DD61345ED42A /* TYTabPagerBar.h in Headers */,\n\t\t\t\t87B96B16646AD96D837414B29D2E20C7 /* TYTabPagerBarCell.h in Headers */,\n\t\t\t\tC878E06DF50107B7362F7A9FD824E0A9 /* TYTabPagerBarLayout.h in Headers */,\n\t\t\t\t9F189CCBEDAF20A2F80F80B6F37CD18C /* TYTabPagerController.h in Headers */,\n\t\t\t\t176FE089B6CA019DC6F5B0D2521FDFB7 /* TYTabPagerView.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF4CFBD59DE6B1525E2DAB49E0254EFAC /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8D5D644E475E21E418B2FBCC9423A471 /* RxDataSources-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF57C9456EA5FB7C7D8FC40BACD0F5369 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tA128DBCF691E0F4D2AC3EEA36F7BD562 /* ObjectMapper-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tFAE57A9E7839AD2AA87185DB14179BF9 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tA36633C20A13B727FE2F135FB3261A24 /* Result-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tFE18DAC6ED9820DB2FB1CDB05298C88B /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t15597F37A6D45F2D0F52932109960222 /* SwiftyJSON-umbrella.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t0B620384669DABB34C3C5B96EA60F12A /* TYCyclePagerView */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7CEE893A728FE595E38B19DA5C14A481 /* Build configuration list for PBXNativeTarget \"TYCyclePagerView\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t45FC86A2567F803014F88F621D22C796 /* Sources */,\n\t\t\t\tAABC11B0DB149687903FAC188E5420A1 /* Frameworks */,\n\t\t\t\t2BF0A2F53314CF5EB4D294D79B51E354 /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = TYCyclePagerView;\n\t\t\tproductName = TYCyclePagerView;\n\t\t\tproductReference = 91F4320128E8926FF21C0A92F70CFBBD /* TYCyclePagerView.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t0F6A8E28D6C2CC2BCA0477C6AF7137F2 /* ReactorKit */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 90DBC69F7407A38678F533AF966E180A /* Build configuration list for PBXNativeTarget \"ReactorKit\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t4159A27673E02C6B0AA68F17C1DEC27C /* Sources */,\n\t\t\t\tE14E1AD13C72905A9744DCFC4CB6754B /* Frameworks */,\n\t\t\t\t30A3523FB43B8D358EF8AEAD51B489A7 /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t74F8F17B6FC071183EB1EC5D2ED0880E /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = ReactorKit;\n\t\t\tproductName = ReactorKit;\n\t\t\tproductReference = 195D6043A1C7C9E2F93F03BF5A6C765E /* ReactorKit.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t1C61647CEE01897368F5D0D2CC181DB4 /* Result */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 554EA923463767BCA4352E1E6C624685 /* Build configuration list for PBXNativeTarget \"Result\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t48F5E24EE7C37D644CA2EC2A3A332CFD /* Sources */,\n\t\t\t\t4B7C72EFD055B004BD8D36238863B2D5 /* Frameworks */,\n\t\t\t\tFAE57A9E7839AD2AA87185DB14179BF9 /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Result;\n\t\t\tproductName = Result;\n\t\t\tproductReference = BC645F028499DF5A3CB986DD6D4358F1 /* Result.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t1F5BFD2D8E3672CE19EA16B5208A4066 /* RxCocoa */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 52DD4DD837C8F96EF786BB17F1227792 /* Build configuration list for PBXNativeTarget \"RxCocoa\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tE29D37D323EFBAB92ED4EB9E402A34FF /* Sources */,\n\t\t\t\t69C6F60DD2457704809BD1D3D4543AD9 /* Frameworks */,\n\t\t\t\t17C76A71E1AF9F09E4C42030A2627968 /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t262BA16A4ED2BE76F6D01B3E3A3ECD1B /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = RxCocoa;\n\t\t\tproductName = RxCocoa;\n\t\t\tproductReference = E9246ADE8730ABD21F1BBC59333EA31E /* RxCocoa.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t2166B105EDC9D2499513E6D6BCD586C2 /* RxAlamofire */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 63A8CDD2A9A34DC6C67006A603063404 /* Build configuration list for PBXNativeTarget \"RxAlamofire\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t84F38B93AFAA7B8E0B03B786034FA5E9 /* Sources */,\n\t\t\t\t73BF36D607B79591CC85E897840E2802 /* Frameworks */,\n\t\t\t\t899E65E945FC87EA2CEC3E51348F11FE /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t91360C912E71D51EA842B318BAEBA511 /* PBXTargetDependency */,\n\t\t\t\tC04FA726205A1D05F027F1208191E76E /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = RxAlamofire;\n\t\t\tproductName = RxAlamofire;\n\t\t\tproductReference = E02E53CE029ADA867E576C62B9054390 /* RxAlamofire.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t2D5C20681FC0A1E18576D4673D0EFE65 /* Then */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 55B1DC46A281606C5A8A2F5953589206 /* Build configuration list for PBXNativeTarget \"Then\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF68621466263ABC9C173B16DCEA5238C /* Sources */,\n\t\t\t\t674E18361DBF81F73164E63E79DDC140 /* Frameworks */,\n\t\t\t\t1C39EE49D85220A1F1F2EBF8D4A95BAE /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Then;\n\t\t\tproductName = Then;\n\t\t\tproductReference = FB6BED57753CCBC597942DFD41588338 /* Then.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t371551DFD98A9103D43168E4BD0479F0 /* RxSwift */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 860035FE08E0668CFA26227D241C13AC /* Build configuration list for PBXNativeTarget \"RxSwift\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tD705382C7BFF2D2C2EC37FEA0F8EEB4B /* Sources */,\n\t\t\t\t23AD706635149AE5F75579590BA4B09C /* Frameworks */,\n\t\t\t\tBEB4271AF5F1D6B253A061B69AA6AC34 /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = RxSwift;\n\t\t\tproductName = RxSwift;\n\t\t\tproductReference = 0971AB82F462A7C2F67101AD9407905F /* RxSwift.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t524DC20BC58D4BDA1F0C77763DFA70BE /* ReusableKit */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 0D42361BF39A06A081758B64C4D8FB8D /* Build configuration list for PBXNativeTarget \"ReusableKit\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tCAEF755B2AF170481A5749470818E9D9 /* Sources */,\n\t\t\t\tC9E038B57740EF2F804D34B1C9393F02 /* Frameworks */,\n\t\t\t\t1E0A822016AA6CF232BB4F6126F81008 /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tA5495B347F8F13816C9E988F7ED6E887 /* PBXTargetDependency */,\n\t\t\t\t49EE20815EBE4FABDDC3320C6B5B116C /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = ReusableKit;\n\t\t\tproductName = ReusableKit;\n\t\t\tproductReference = 68668B40B5E550006A59D5621EFB0561 /* ReusableKit.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t64CC9E274EBD6C16C53FC82EAA6FE9E7 /* NSObject+Rx */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 6252E31AF78FAB4E0F676126FABEADB5 /* Build configuration list for PBXNativeTarget \"NSObject+Rx\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t1EA02C2D8C30224ACAEE185D7B4EBBB9 /* Sources */,\n\t\t\t\t1E430C90A89892CE9179EEDDCBFED27E /* Frameworks */,\n\t\t\t\t8D2725658BE0A873BBAEB9B56FC7946F /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tD957D03022753D4ACA9E09D332D8EEA5 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"NSObject+Rx\";\n\t\t\tproductName = \"NSObject+Rx\";\n\t\t\tproductReference = 84E9E4B67AD852A6167EFE006AD2043F /* NSObject_Rx.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t6F712943B3C5592E82604940D11CE08A /* Kingfisher */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 8C1E4CEFB2390CBE75E70BAC20F44BBF /* Build configuration list for PBXNativeTarget \"Kingfisher\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tFD12B015E1FDA3498428EF09C91D1F17 /* Sources */,\n\t\t\t\tC0B9722E352CF90C920286E6F029D3C0 /* Frameworks */,\n\t\t\t\t84676F7D46FF521291CDEB2AB04A454C /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Kingfisher;\n\t\t\tproductName = Kingfisher;\n\t\t\tproductReference = 1E1DF457C00960360E254419271FA76F /* Kingfisher.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t844C9B244CEFA2F26288789C423101B4 /* Differentiator */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 697E3CDF0A55702AF195B90A1000CA13 /* Build configuration list for PBXNativeTarget \"Differentiator\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tBA8BA23DC65E6F3033B570067BCF4E49 /* Sources */,\n\t\t\t\t2CCEFAA691F3229A3313687F2CC6981E /* Frameworks */,\n\t\t\t\t36F057C44DEF91262D41374313982B4F /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Differentiator;\n\t\t\tproductName = Differentiator;\n\t\t\tproductReference = EFD5B31121E42968628607F4CA11A4BC /* Differentiator.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t88E9EC28B8B46C3631E6B242B50F4442 /* Alamofire */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 419E5D95491847CD79841B971A8A3277 /* Build configuration list for PBXNativeTarget \"Alamofire\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t32B9974868188C4803318E36329C87FE /* Sources */,\n\t\t\t\t99195E4207764744AEC07ECCBCD550EB /* Frameworks */,\n\t\t\t\tB4002B6E97835FDCCAA5963EFE09A3E0 /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Alamofire;\n\t\t\tproductName = Alamofire;\n\t\t\tproductReference = A6BE7CE8E3CF10B0BE4713CA7CD3FDC9 /* Alamofire.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t8CB60D59ADD2D72FCB9566114EE33B9A /* Pods-RxXMLY */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 3371F7E9117E31C177556E75F3A0EBB0 /* Build configuration list for PBXNativeTarget \"Pods-RxXMLY\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF7E49EE33EA82533063B0336FC00338E /* Sources */,\n\t\t\t\tE6817D3D95D3783EE1F540DE3EA42D19 /* Frameworks */,\n\t\t\t\t308BF610A5FF6340C2E8EEDF96409AF2 /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t82A7E8FA790BFD2EEAA4CBBFC398A3AD /* PBXTargetDependency */,\n\t\t\t\t7E2C13AE966FB76B2736F2F745A55A84 /* PBXTargetDependency */,\n\t\t\t\t7A1A38F35129D8939DA93941E5566EFE /* PBXTargetDependency */,\n\t\t\t\tAE2A28A9913F488DA60A2AE400C7C39C /* PBXTargetDependency */,\n\t\t\t\tAFCAAA9C845955F183FAC004DE305241 /* PBXTargetDependency */,\n\t\t\t\tFD527F145232A0C224EE6A40F67AB20C /* PBXTargetDependency */,\n\t\t\t\t994AD4F34D30D7AD6C8E508F85E720FC /* PBXTargetDependency */,\n\t\t\t\tC0DCC3CCC842C93357AEFDB929B5A252 /* PBXTargetDependency */,\n\t\t\t\tC2A6A892DEAC32783AE9D267A1E58534 /* PBXTargetDependency */,\n\t\t\t\t7F53856AB469B6C0D0227D2098D36F1A /* PBXTargetDependency */,\n\t\t\t\t4C8BC7A07FCDEC22BAC47D2EA5B8DB58 /* PBXTargetDependency */,\n\t\t\t\tDABB17D04DB056ACFEE47ED47B21D92E /* PBXTargetDependency */,\n\t\t\t\t564A6BC33E46BA3758AE193165BD2546 /* PBXTargetDependency */,\n\t\t\t\tB9039DCFEEA782D86F9244953C22F447 /* PBXTargetDependency */,\n\t\t\t\t7DF9738D2EB15BE150084534280EEDBC /* PBXTargetDependency */,\n\t\t\t\tA9111896C809CC9110D085304115B040 /* PBXTargetDependency */,\n\t\t\t\t08BBAECE794424C6A743B64C09DB1F15 /* PBXTargetDependency */,\n\t\t\t\t1D6CC51BC907D8D84EC14CFC3A935BF9 /* PBXTargetDependency */,\n\t\t\t\tDAB919EDAE0C8E3D7232AFB62120664E /* PBXTargetDependency */,\n\t\t\t\tEEF9A4EC5A5005C3AED3CBD2E4BF7DD3 /* PBXTargetDependency */,\n\t\t\t\t10AED09D93D2CD014F7BA195EFC2A01D /* PBXTargetDependency */,\n\t\t\t\t4A1836A5702E2F2BF9536F435BCC4E92 /* PBXTargetDependency */,\n\t\t\t\tD56703EF22DD8F7706F17918A2D0AB7F /* PBXTargetDependency */,\n\t\t\t\tF5E4336F7DB15BFD3731353A54108BFC /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"Pods-RxXMLY\";\n\t\t\tproductName = \"Pods-RxXMLY\";\n\t\t\tproductReference = B2C6C61F18ADC817A64446B3F214A416 /* Pods_RxXMLY.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t8E38AFA40EB24AAD3998F3F9CFB12CA3 /* SnapKit */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = AD3D5B9E24ECB0D75B3E0294644E66D1 /* Build configuration list for PBXNativeTarget \"SnapKit\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t36851BD36F2908D027308937D3628C99 /* Sources */,\n\t\t\t\t5642B75CBC2CCDA7E44A7707DD089AF1 /* Frameworks */,\n\t\t\t\t26DA2FB42087A700B13CACAD4C243527 /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = SnapKit;\n\t\t\tproductName = SnapKit;\n\t\t\tproductReference = 4F5B061DB45E3912FBD1E11E6F1A842E /* SnapKit.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t93FD28A3DC61A9094248D0D96CAD9FD4 /* SwiftyColor */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 512FD626A7E3FC83C9CC8A24144BC92B /* Build configuration list for PBXNativeTarget \"SwiftyColor\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tCFD0F4D99C3A2A82253E9498985556F9 /* Sources */,\n\t\t\t\t2E911FDC90F1E7ACD11F0B68CC7B1FCA /* Frameworks */,\n\t\t\t\t9B99F75C95AED0A71535DFF717EBD5DD /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = SwiftyColor;\n\t\t\tproductName = SwiftyColor;\n\t\t\tproductReference = A95B5537CC319932AD399F0660CB16D8 /* SwiftyColor.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\tB496A58A7B812A10E0039E15EDF0E8EE /* RxGesture */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = C5214E85BC32F855BB77F4FD74672338 /* Build configuration list for PBXNativeTarget \"RxGesture\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t6DD8944A25965DD079BE0CA7B844B0C4 /* Sources */,\n\t\t\t\t31195B5F7226702168F8D241576F56D5 /* Frameworks */,\n\t\t\t\t4BF45E5E0A4403672C04711914CE660B /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t41F1B2694597D80C8C88DD1E191C2DA0 /* PBXTargetDependency */,\n\t\t\t\t1305CEBDCD0AA3A968FBB90778AC74B5 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = RxGesture;\n\t\t\tproductName = RxGesture;\n\t\t\tproductReference = D5B52B71645C13D27A3C4B3A58EA2440 /* RxGesture.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\tC235F77E101E742652CCF98FFDFA5182 /* IQKeyboardManagerSwift */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = E8C5CE05A712EF50BB123A41D8EFC0CB /* Build configuration list for PBXNativeTarget \"IQKeyboardManagerSwift\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tB0CAA73D50E134E589B648ABF6682839 /* Sources */,\n\t\t\t\t81A5C814ACEB86CB06CD6C51383982FE /* Frameworks */,\n\t\t\t\t918D58E08AC7FD6CC66B75FF048005F7 /* Resources */,\n\t\t\t\tC82B5F04767CB991E84734A54D0ABA5B /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = IQKeyboardManagerSwift;\n\t\t\tproductName = IQKeyboardManagerSwift;\n\t\t\tproductReference = 924F8DE96A22311CC14038BB62C8997D /* IQKeyboardManagerSwift.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\tC76585AF9502709B32A11133189DDA23 /* URLNavigator */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 5A05DD5251EAD538258DF17673557953 /* Build configuration list for PBXNativeTarget \"URLNavigator\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t5CC50015B125E128985DBB061F47C834 /* Sources */,\n\t\t\t\t0342A957F1A5702D324BDF4037D7D6B3 /* Frameworks */,\n\t\t\t\t8986C70AFF55B1DD012A7C84159924F9 /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = URLNavigator;\n\t\t\tproductName = URLNavigator;\n\t\t\tproductReference = 430B138602CD2D328367A37FEE11E65F /* URLNavigator.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\tCCEEA2E517C9CB166C75BAF4A263A7CF /* TYPagerController */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 6B1519F70E09D2830A7F592841F05038 /* Build configuration list for PBXNativeTarget \"TYPagerController\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF81A606714EAF37F04ADC51B6B6FD751 /* Sources */,\n\t\t\t\t748266AA260D6CE008E3FF2C76A52D04 /* Frameworks */,\n\t\t\t\tF1E7E834BDE614B36F8B992268E4CADD /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = TYPagerController;\n\t\t\tproductName = TYPagerController;\n\t\t\tproductReference = B228A61D64CA44B4648977930AEEBF5F /* TYPagerController.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\tCD6C9FB6B052E1CF663F8A56041EA163 /* ObjectMapper */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 23CFD86DE455F2B998EC09D589DA285D /* Build configuration list for PBXNativeTarget \"ObjectMapper\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF35FEC988ECD73463D93176BC71A43B1 /* Sources */,\n\t\t\t\tC4F4068871A73EB6FBE8042AF2063595 /* Frameworks */,\n\t\t\t\tF57C9456EA5FB7C7D8FC40BACD0F5369 /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = ObjectMapper;\n\t\t\tproductName = ObjectMapper;\n\t\t\tproductReference = 68051FD77C0407C9B24515E31E177222 /* ObjectMapper.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\tD382A7B90B59D72908CC21054785B020 /* Moya */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 8E2F09332A7598018177CF140EEDFC0E /* Build configuration list for PBXNativeTarget \"Moya\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t147471AB17CA6878A911AE963B2EEF4A /* Sources */,\n\t\t\t\t23D3B010AD4A853FE7ED1D97A480065F /* Frameworks */,\n\t\t\t\t44C7AC23726DE4E6D35D8A1D17730BA9 /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t2217DC3041FFBBE5E80AAB2A9DC3C930 /* PBXTargetDependency */,\n\t\t\t\t4EB5F10F6AC0963099F3FC814DF14415 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = Moya;\n\t\t\tproductName = Moya;\n\t\t\tproductReference = 3E00F875EA38811C01C6F56B33214C42 /* Moya.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\tDE874A99677D06A11E5FCC43C238A7D5 /* SwiftyJSON */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 704D48507B0C8F42CE3629D21F48652A /* Build configuration list for PBXNativeTarget \"SwiftyJSON\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t1F428611303CFF0C51F5907C2B17CA73 /* Sources */,\n\t\t\t\t2E345FD99987A0C2F53C3EB5089F2023 /* Frameworks */,\n\t\t\t\tFE18DAC6ED9820DB2FB1CDB05298C88B /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = SwiftyJSON;\n\t\t\tproductName = SwiftyJSON;\n\t\t\tproductReference = E915131DA668033B6756FDE94DD6C130 /* SwiftyJSON.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\tE14A62900910444707A5504D25EC98DC /* MJRefresh */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 1EFADDC2BB6831ED43B76E0241CCDB75 /* Build configuration list for PBXNativeTarget \"MJRefresh\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t6D4ECE0A60E69F261AA10FE2CB90A0AC /* Sources */,\n\t\t\t\t1AAD91176E5F5F9AD062AD678F6746E4 /* Frameworks */,\n\t\t\t\t1D0B0A5525CB3F57F2D64B587D880D88 /* Headers */,\n\t\t\t\t8E06EE42A2928B5842D11E8A0A68E87D /* 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 = MJRefresh;\n\t\t\tproductName = MJRefresh;\n\t\t\tproductReference = B7B99FDB86B839402402CF4B9085F867 /* MJRefresh.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\tE86A9F4C831EEE122A82C7CE19D4011B /* TTRangeSlider */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 0C3A2D1670AC6E68C80F257B426F3A29 /* Build configuration list for PBXNativeTarget \"TTRangeSlider\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t69FF2F529D4562CE5A861E242277E2C7 /* Sources */,\n\t\t\t\t7981EDCD0900235B2B3D12DBC172DB34 /* Frameworks */,\n\t\t\t\t3BF3E42635E5BE1A480B8821B6E82E84 /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = TTRangeSlider;\n\t\t\tproductName = TTRangeSlider;\n\t\t\tproductReference = 2135AEA738411503ADADD4D2497AA4E6 /* TTRangeSlider.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\tF05F33A12963EC1A726FEE15D9000AE2 /* RxDataSources */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = BD5CCA9B364C93A19C3C8B5200B7D56A /* Build configuration list for PBXNativeTarget \"RxDataSources\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t39A6D6BBB532752CC361197B9D264862 /* Sources */,\n\t\t\t\t943D1D0C588FD46C297C76EB927A6963 /* Frameworks */,\n\t\t\t\tF4CFBD59DE6B1525E2DAB49E0254EFAC /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t4979E917B04F9F132A2DEC8E47979A28 /* PBXTargetDependency */,\n\t\t\t\t1F022C3FAE5D080B47B2C4EB5A4B7A31 /* PBXTargetDependency */,\n\t\t\t\t5444B96DBCDAD467604CD8796C2A3AE2 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = RxDataSources;\n\t\t\tproductName = RxDataSources;\n\t\t\tproductReference = 97B60E643384171A74CED9D708E98F3D /* RxDataSources.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tD41D8CD98F00B204E9800998ECF8427E /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0830;\n\t\t\t\tLastUpgradeCheck = 0900;\n\t\t\t};\n\t\t\tbuildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject \"Pods\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = 7DB346D0F39D3F0E887471402A8071AB;\n\t\t\tproductRefGroup = 712E1C09C3CA54FA0B661841A1FB2F97 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t88E9EC28B8B46C3631E6B242B50F4442 /* Alamofire */,\n\t\t\t\t844C9B244CEFA2F26288789C423101B4 /* Differentiator */,\n\t\t\t\tC235F77E101E742652CCF98FFDFA5182 /* IQKeyboardManagerSwift */,\n\t\t\t\t6F712943B3C5592E82604940D11CE08A /* Kingfisher */,\n\t\t\t\tE14A62900910444707A5504D25EC98DC /* MJRefresh */,\n\t\t\t\tD382A7B90B59D72908CC21054785B020 /* Moya */,\n\t\t\t\t64CC9E274EBD6C16C53FC82EAA6FE9E7 /* NSObject+Rx */,\n\t\t\t\tCD6C9FB6B052E1CF663F8A56041EA163 /* ObjectMapper */,\n\t\t\t\t8CB60D59ADD2D72FCB9566114EE33B9A /* Pods-RxXMLY */,\n\t\t\t\t0F6A8E28D6C2CC2BCA0477C6AF7137F2 /* ReactorKit */,\n\t\t\t\t1C61647CEE01897368F5D0D2CC181DB4 /* Result */,\n\t\t\t\t524DC20BC58D4BDA1F0C77763DFA70BE /* ReusableKit */,\n\t\t\t\t2166B105EDC9D2499513E6D6BCD586C2 /* RxAlamofire */,\n\t\t\t\t1F5BFD2D8E3672CE19EA16B5208A4066 /* RxCocoa */,\n\t\t\t\tF05F33A12963EC1A726FEE15D9000AE2 /* RxDataSources */,\n\t\t\t\tB496A58A7B812A10E0039E15EDF0E8EE /* RxGesture */,\n\t\t\t\t371551DFD98A9103D43168E4BD0479F0 /* RxSwift */,\n\t\t\t\t8E38AFA40EB24AAD3998F3F9CFB12CA3 /* SnapKit */,\n\t\t\t\t93FD28A3DC61A9094248D0D96CAD9FD4 /* SwiftyColor */,\n\t\t\t\tDE874A99677D06A11E5FCC43C238A7D5 /* SwiftyJSON */,\n\t\t\t\t2D5C20681FC0A1E18576D4673D0EFE65 /* Then */,\n\t\t\t\tE86A9F4C831EEE122A82C7CE19D4011B /* TTRangeSlider */,\n\t\t\t\t0B620384669DABB34C3C5B96EA60F12A /* TYCyclePagerView */,\n\t\t\t\tCCEEA2E517C9CB166C75BAF4A263A7CF /* TYPagerController */,\n\t\t\t\tC76585AF9502709B32A11133189DDA23 /* URLNavigator */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t8E06EE42A2928B5842D11E8A0A68E87D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t6298B1C2234864DA5ED3B5E6398B95AC /* MJRefresh.bundle in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t918D58E08AC7FD6CC66B75FF048005F7 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2A2FE216328BFC23AF9D30EAEFAA2303 /* IQKeyboardManager.bundle 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\t147471AB17CA6878A911AE963B2EEF4A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t839A55AD3279D154DC55C93BE714B93E /* AccessTokenPlugin.swift in Sources */,\n\t\t\t\t5BB8EA4A2E5BEAB53FD3C34496F3CEDB /* AnyEncodable.swift in Sources */,\n\t\t\t\t6BAE5A1DC9D8A6DED87FF11DEA68C04D /* Cancellable.swift in Sources */,\n\t\t\t\tD947452217EE9CF7F39D5F25C226DACC /* CredentialsPlugin.swift in Sources */,\n\t\t\t\t068EE77B364B309A5973AA63DCE763D0 /* Endpoint.swift in Sources */,\n\t\t\t\t7B0FACE97300F45175045FD090F70CE2 /* Image.swift in Sources */,\n\t\t\t\tB3D2B497C3F6721D93B9D8C6E459B763 /* Moya+Alamofire.swift in Sources */,\n\t\t\t\tB9AB0B01A8F7F6D3C83AEE614C9304C2 /* Moya-dummy.m in Sources */,\n\t\t\t\t2641C5F2AF734454E8A6DF94E606EE71 /* MoyaError.swift in Sources */,\n\t\t\t\tA4A7E0E7713372CEF2409C4B6E564837 /* MoyaProvider+Defaults.swift in Sources */,\n\t\t\t\tA03ADFA996990D2DA836E6FFCEE37F36 /* MoyaProvider+Internal.swift in Sources */,\n\t\t\t\tED4CDFA145F591A93A57DC1B7CE1C12E /* MoyaProvider.swift in Sources */,\n\t\t\t\t3433BF7613AB168C91A7310C0B5CE6A9 /* MultipartFormData.swift in Sources */,\n\t\t\t\t4A54582B320910433D1A82740A41FAF1 /* MultiTarget.swift in Sources */,\n\t\t\t\t03905D0FD58E772457B809C9443B9633 /* NetworkActivityPlugin.swift in Sources */,\n\t\t\t\t36C33EC0952D217038E06134251A4267 /* NetworkLoggerPlugin.swift in Sources */,\n\t\t\t\tEC0418D76D4ADA0C663EE5E8D2D9B57C /* Plugin.swift in Sources */,\n\t\t\t\t2968F27F99F394EABFF42645167C47A7 /* Response.swift in Sources */,\n\t\t\t\tA9CA258A1B6D95AA156B0601E9473EF5 /* TargetType.swift in Sources */,\n\t\t\t\tCEA192A80E93599EFC5BEC6EE1F97BB5 /* Task.swift in Sources */,\n\t\t\t\tA46ECAD1FE903ECD9E035F9DB92CCEFE /* URL+Moya.swift in Sources */,\n\t\t\t\t79B3581182D487C5DBEF24D7E8B263BE /* URLRequest+Encoding.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t1EA02C2D8C30224ACAEE185D7B4EBBB9 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t29188F71B40A3F6A817C5369E3DBA7FF /* HasDisposeBag.swift in Sources */,\n\t\t\t\t5BAEAF4DF2226C38891357D17E315D91 /* NSObject+Rx-dummy.m in Sources */,\n\t\t\t\t6F5E2DD4FF386EBB8EB55967964C5BE3 /* NSObject+Rx.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t1F428611303CFF0C51F5907C2B17CA73 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tEF3D53302381F94241804E5CD95AA64F /* SwiftyJSON-dummy.m in Sources */,\n\t\t\t\t03CE3310204ECD17C80FA496A818DA47 /* SwiftyJSON.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t32B9974868188C4803318E36329C87FE /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t9ED2BB2981896E0A39EFA365503F58CE /* AFError.swift in Sources */,\n\t\t\t\tA9EEEA7477981DEEBC72432DE9990A4B /* Alamofire-dummy.m in Sources */,\n\t\t\t\tF8B3D3092ED0417E8CDF32033F6122F5 /* Alamofire.swift in Sources */,\n\t\t\t\t61200D01A1855D7920CEF835C8BE00B0 /* DispatchQueue+Alamofire.swift in Sources */,\n\t\t\t\tB65FCF589DA398C3EFE0128064E510EC /* MultipartFormData.swift in Sources */,\n\t\t\t\tA2A6F71B727312BD45CC7A4AAD7B0AB7 /* NetworkReachabilityManager.swift in Sources */,\n\t\t\t\tEFD264FC408EBF3BA2528E70B08DDD94 /* Notifications.swift in Sources */,\n\t\t\t\tBE5C67A07E289FE1F9BE27335B159997 /* ParameterEncoding.swift in Sources */,\n\t\t\t\t5387216E723A3C68E851CA15573CDD71 /* Request.swift in Sources */,\n\t\t\t\tCB6D60925223897FFA2662667DF83E8A /* Response.swift in Sources */,\n\t\t\t\tF6BECD98B97CBFEBE2C96F0E9E72A6C0 /* ResponseSerialization.swift in Sources */,\n\t\t\t\t7D8CC01E8C9EFFF9F4D65406CDE0AB66 /* Result.swift in Sources */,\n\t\t\t\t62F65AD8DC4F0F9610F4B8B4738EC094 /* ServerTrustPolicy.swift in Sources */,\n\t\t\t\t7B5FE28C7EA4122B0598738E54DBEBD8 /* SessionDelegate.swift in Sources */,\n\t\t\t\tAE1EF48399533730D0066E04B22CA2D6 /* SessionManager.swift in Sources */,\n\t\t\t\t3626B94094672CB1C9DEA32B9F9502E1 /* TaskDelegate.swift in Sources */,\n\t\t\t\t10EB23E9ECC4B33E16933BB1EA560B6A /* Timeline.swift in Sources */,\n\t\t\t\tBBEFE2F9CEB73DC7BD97FFA66A0D9D4F /* Validation.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t36851BD36F2908D027308937D3628C99 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t0EEBFA3280A544CB4F48B94672825C03 /* Constraint.swift in Sources */,\n\t\t\t\t0DD634DCA2EE6C8DA4C13EEC73849EFD /* ConstraintAttributes.swift in Sources */,\n\t\t\t\tB83AC06EC6750F396E898A09BE4BC42B /* ConstraintConfig.swift in Sources */,\n\t\t\t\t8D6FC3FD5C6F9AB903E885369D8C437F /* ConstraintConstantTarget.swift in Sources */,\n\t\t\t\t157E33FBE3B7D1D7996ADD2848628BC2 /* ConstraintDescription.swift in Sources */,\n\t\t\t\t507559646F241781DF5F959957D54C98 /* ConstraintDSL.swift in Sources */,\n\t\t\t\t95DC0825394C10B2BCA74208761E16E6 /* ConstraintInsets.swift in Sources */,\n\t\t\t\t65CDABE73636295123CD8259D16ACFC1 /* ConstraintInsetTarget.swift in Sources */,\n\t\t\t\t1F34D539C0D864807B558FC80839C15A /* ConstraintItem.swift in Sources */,\n\t\t\t\t866B48826FBBC43E96593CF27485FFC1 /* ConstraintLayoutGuide+Extensions.swift in Sources */,\n\t\t\t\t8BF6B3A9B39B75AA591626B7B26175DE /* ConstraintLayoutGuide.swift in Sources */,\n\t\t\t\tBCEF70E63A638C19CEE89A53D7FFE523 /* ConstraintLayoutGuideDSL.swift in Sources */,\n\t\t\t\t79F5CE53E58BED49036519F4E1197395 /* ConstraintLayoutSupport.swift in Sources */,\n\t\t\t\t66407236B5F3BF75ECBAE79FB585EC78 /* ConstraintLayoutSupportDSL.swift in Sources */,\n\t\t\t\t4F486A2A1239E02C62E27B6DB5EBF025 /* ConstraintMaker.swift in Sources */,\n\t\t\t\tF4988BB5862C381854506C82E43136A3 /* ConstraintMakerEditable.swift in Sources */,\n\t\t\t\tE9E28E9BEA02135CFBF9E598CC1885D2 /* ConstraintMakerExtendable.swift in Sources */,\n\t\t\t\t9A8BECF84F3F50D260FB7132B311E932 /* ConstraintMakerFinalizable.swift in Sources */,\n\t\t\t\tABB86D5B62EC96B6997FBE8361498297 /* ConstraintMakerPriortizable.swift in Sources */,\n\t\t\t\t9980108FD8F8C2F7FF71BD9DCAEAD6DF /* ConstraintMakerRelatable.swift in Sources */,\n\t\t\t\t0DC7585DE4582FFC698D5CA7F7987868 /* ConstraintMultiplierTarget.swift in Sources */,\n\t\t\t\tCEDBD76A18EEEDCA4EBAC563A97D2C51 /* ConstraintOffsetTarget.swift in Sources */,\n\t\t\t\t54B5B7D9E6EFC9C2C7B051BF214B9069 /* ConstraintPriority.swift in Sources */,\n\t\t\t\t671B54E4AAC34ADFF8D1C372330E98FB /* ConstraintPriorityTarget.swift in Sources */,\n\t\t\t\tBAFB96EEF09DA050757292A2F5EA6404 /* ConstraintRelatableTarget.swift in Sources */,\n\t\t\t\t15A0DC01842AFC68403331D8324AC790 /* ConstraintRelation.swift in Sources */,\n\t\t\t\t3185243C5F5AD72D5DF9D3D7CEAD5237 /* ConstraintView+Extensions.swift in Sources */,\n\t\t\t\tC3CFEB87CAB11F928DAD084B87C7F26C /* ConstraintView.swift in Sources */,\n\t\t\t\tB46EEAED7469BDA363E075F37016248A /* ConstraintViewDSL.swift in Sources */,\n\t\t\t\t4257A939388AC78D0B3466520A06879B /* Debugging.swift in Sources */,\n\t\t\t\t32995C9F464270A5E2D36056E9B5190B /* LayoutConstraint.swift in Sources */,\n\t\t\t\tA006A7EEF7652FE9322878C39A36CED3 /* LayoutConstraintItem.swift in Sources */,\n\t\t\t\t1500C42EA85F1F32A0DFA87FE8320E24 /* SnapKit-dummy.m in Sources */,\n\t\t\t\t8C8833BAF8EEDBF0491FC6CFEAF001E0 /* Typealiases.swift in Sources */,\n\t\t\t\t538546EBA321B92342C272F36B39C23B /* UILayoutSupport+Extensions.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t39A6D6BBB532752CC361197B9D264862 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2615F7FE9AF4BF4955E9CB747E98FC21 /* AnimationConfiguration.swift in Sources */,\n\t\t\t\tEA326BB6A8ACA0EE3C0B44849198ADE6 /* Array+Extensions.swift in Sources */,\n\t\t\t\t71BA33FC95D59E6C0FA6DEEF747351B7 /* CollectionViewSectionedDataSource.swift in Sources */,\n\t\t\t\tA5FF3C7A501FACB556E67C86C1990F7D /* DataSources.swift in Sources */,\n\t\t\t\t51390FB969CB66F4D75C47503E00A1D2 /* Deprecated.swift in Sources */,\n\t\t\t\t647C9A69799E80C9EFB477D0ED6D2406 /* FloatingPointType+IdentifiableType.swift in Sources */,\n\t\t\t\tE36C37C4AC1FFD475C4490193C66FF22 /* IntegerType+IdentifiableType.swift in Sources */,\n\t\t\t\t96EED7813D6F11E4A799B9B76F391500 /* RxCollectionViewSectionedAnimatedDataSource.swift in Sources */,\n\t\t\t\t283410C5EE7D346795416AC105C37733 /* RxCollectionViewSectionedReloadDataSource.swift in Sources */,\n\t\t\t\t674EB63D9FF75C7AB07BA9DA46D8AE09 /* RxDataSources-dummy.m in Sources */,\n\t\t\t\t2F711ADC9F8930796D22855B9DD7AE42 /* RxPickerViewAdapter.swift in Sources */,\n\t\t\t\t4AD94A043ECE1C2D0B98F467E75D40C2 /* RxTableViewSectionedAnimatedDataSource.swift in Sources */,\n\t\t\t\t476CAF0EE5F9011302EF906E33A10687 /* RxTableViewSectionedReloadDataSource.swift in Sources */,\n\t\t\t\tCDB48F0785D88989F4C7EB6C419AB6B0 /* String+IdentifiableType.swift in Sources */,\n\t\t\t\tE027FBCDAF65778317E634F4A92512B9 /* TableViewSectionedDataSource.swift in Sources */,\n\t\t\t\t891A61A41441BA89E0055C960A4664ED /* UI+SectionedViewType.swift in Sources */,\n\t\t\t\tC100B07C3830CD742E8C9D9E427B1E3B /* ViewTransition.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t4159A27673E02C6B0AA68F17C1DEC27C /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF39A3624015D4234E6FE35761F53BC93 /* ActionSubject.swift in Sources */,\n\t\t\t\t3AF8D0984A8BD088E7135F79FCA0AD78 /* AssociatedObjectStore.swift in Sources */,\n\t\t\t\tAC09A4779981FD4CD0F95DC2054E4C99 /* Reactor.swift in Sources */,\n\t\t\t\t6DB8DA4031D9691E8E809A385F4A5846 /* ReactorKit-dummy.m in Sources */,\n\t\t\t\tDDDB37E35D9BC501950FB4909B609F2E /* ReactorKitRuntime.m in Sources */,\n\t\t\t\tFE782FADB39D1A5F08B981F6F7D27726 /* StoryboardView.swift in Sources */,\n\t\t\t\tC3A7EF039070A3D3EE385B130DB94EEB /* Stub.swift in Sources */,\n\t\t\t\tB948B6BD2A647A1DCC1401170B5D09FA /* View.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t45FC86A2567F803014F88F621D22C796 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t82443926248B0468C2318B68ABB2FE14 /* TYCyclePagerTransformLayout.m in Sources */,\n\t\t\t\tCED1FC24A094EABAF628E86E2BCBB656 /* TYCyclePagerView-dummy.m in Sources */,\n\t\t\t\tF8DB73FCAA437CAC5D12AFBA1DD3D205 /* TYCyclePagerView.m in Sources */,\n\t\t\t\t69D61F970DB381B6094C0E8085CB1E00 /* TYPageControl.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t48F5E24EE7C37D644CA2EC2A3A332CFD /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t795ED1A351690C7143540C8CB7AA6CD0 /* Result-dummy.m in Sources */,\n\t\t\t\tEFCDB86F2D87E50B9B3EAA6827FF4012 /* Result.swift in Sources */,\n\t\t\t\t71DD71770F915F1621F0155CFD6CCEDD /* ResultProtocol.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t5CC50015B125E128985DBB061F47C834 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tDF1BF64A08EBF0DE6CD67ED0D49CB07B /* Navigator.swift in Sources */,\n\t\t\t\t8B5BA7E0D60BA533FA43EF493F4D5D83 /* NavigatorDelegate.swift in Sources */,\n\t\t\t\tAA52CCA36AE2BBAA57E7DB6D3B437F6F /* NavigatorType.swift in Sources */,\n\t\t\t\tC2210016F369741901DB640E70B60688 /* UIViewController+TopMostViewController.swift in Sources */,\n\t\t\t\t98F5BB1FF23CDD9DDAE74AE7DF766672 /* UIViewControllerType.swift in Sources */,\n\t\t\t\t0A9C9898D2B1246BFC5F26FC2E44F312 /* URLConvertible.swift in Sources */,\n\t\t\t\tE898E416B77BB93F9D6E37227C723D81 /* URLMatcher.swift in Sources */,\n\t\t\t\t955203B31E419BFF9E9DC5EC02787D6B /* URLMatchResult.swift in Sources */,\n\t\t\t\t3666B742397E794ED820CC7AF304560C /* URLNavigator-dummy.m in Sources */,\n\t\t\t\tBCF96CF7173DBD9B80B2DA5EDB3A9119 /* URLPatchComponentMatchResult.swift in Sources */,\n\t\t\t\tB81E85BB5B30F34AAED56494D329A74D /* URLPathComponent.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t69FF2F529D4562CE5A861E242277E2C7 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tA6FD129851497CE8AB256289C1BD6463 /* TTRangeSlider-dummy.m in Sources */,\n\t\t\t\tFD1D0607A2C283A73BF4568A7076EA30 /* TTRangeSlider.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t6D4ECE0A60E69F261AA10FE2CB90A0AC /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t621B413DAEFE75991251ED378822527C /* MJRefresh-dummy.m in Sources */,\n\t\t\t\tD46545D206874E3A223372C84F1EA73E /* MJRefreshAutoFooter.m in Sources */,\n\t\t\t\t7EFDAA1642FA83DE777CFD086182D5A4 /* MJRefreshAutoGifFooter.m in Sources */,\n\t\t\t\t344DB99F8332029C0391F08B6D0E425C /* MJRefreshAutoNormalFooter.m in Sources */,\n\t\t\t\t1843E6DF520A5EFE9C83C38E18578E42 /* MJRefreshAutoStateFooter.m in Sources */,\n\t\t\t\tE80DB5D9B2D35085282DF057BB540AFE /* MJRefreshBackFooter.m in Sources */,\n\t\t\t\tD66E78D63935A98894E702D922AA8B91 /* MJRefreshBackGifFooter.m in Sources */,\n\t\t\t\t101F836F887C01B45F4DCF351EBC28D1 /* MJRefreshBackNormalFooter.m in Sources */,\n\t\t\t\t2524EC4EF024A6C067A0FA082084CFB5 /* MJRefreshBackStateFooter.m in Sources */,\n\t\t\t\tF68EA720B0ED1BF96CEBF07977A1C0A2 /* MJRefreshComponent.m in Sources */,\n\t\t\t\t8069223DDD6D0F2E1A87D8E66966709B /* MJRefreshConst.m in Sources */,\n\t\t\t\t3829CBCC3598DB13C2AD3B7383D1F24A /* MJRefreshFooter.m in Sources */,\n\t\t\t\tFD31283E2A43955C5BA6FA9008EE8D7C /* MJRefreshGifHeader.m in Sources */,\n\t\t\t\t8DC3FC2342EC2E944B3A3E83E2683130 /* MJRefreshHeader.m in Sources */,\n\t\t\t\tE57312010AFB591EE37870F65E651EA6 /* MJRefreshNormalHeader.m in Sources */,\n\t\t\t\t07159A933B3C47A02FE2B2744ABAAC89 /* MJRefreshStateHeader.m in Sources */,\n\t\t\t\tF4A57F7C1F8184A6DDEABB07FA6D7083 /* NSBundle+MJRefresh.m in Sources */,\n\t\t\t\tFB9C6242B11049E2F1062D04565E568D /* UIScrollView+MJExtension.m in Sources */,\n\t\t\t\t8B855A73B75155FB2C0CB05B54FDDE0D /* UIScrollView+MJRefresh.m in Sources */,\n\t\t\t\t0A1E34B4A27DCD62A914F3B028A07E6C /* UIView+MJExtension.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t6DD8944A25965DD079BE0CA7B844B0C4 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t306C95EBAA55143914CC0AAA88E769D1 /* GestureFactory.swift in Sources */,\n\t\t\t\t3B1C65D9BB266645228E3FF013A67A62 /* RxGesture-dummy.m in Sources */,\n\t\t\t\tFA632862F1071D6B51FC158FA50367D8 /* RxGestureRecognizerDelegate.swift in Sources */,\n\t\t\t\tD6139FB200F1DB52CB02F86050D2C555 /* SharedTypes.swift in Sources */,\n\t\t\t\t4CF6C6317C8C75CCE3E05761E0A923AC /* TransformGestureRecognizers.swift in Sources */,\n\t\t\t\t8CD28DDD291AB1B9D0F6DE817CE995FE /* UIGestureRecognizer+RxGesture.swift in Sources */,\n\t\t\t\tA28F98C3C629B57C326A9FE9A51CE133 /* UILongPressGestureRecognizer+RxGesture.swift in Sources */,\n\t\t\t\tEF12BF89DE7448AEE5CE6F0F8DCA3F9A /* UIPanGestureRecognizer+RxGesture.swift in Sources */,\n\t\t\t\tDD311E4BCAE7DD4AA5C938968D72AAAF /* UIPinchGestureRecognizer+RxGesture.swift in Sources */,\n\t\t\t\tF43A145ECD909D880FDC70E638AB8C13 /* UIRotationGestureRecognizer+RxGesture.swift in Sources */,\n\t\t\t\tD5CAE5F9ED6C5FFE2911D544A442B8DF /* UIScreenEdgePanGestureRecognizer+RxGesture.swift in Sources */,\n\t\t\t\t8EC3A1FE52FACEFF6171B96607440D7C /* UISwipeGestureRecognizer+RxGesture.swift in Sources */,\n\t\t\t\t2950762546DE22AB539CDBD87B000951 /* UITapGestureRecognizer+RxGesture.swift in Sources */,\n\t\t\t\tEF412419B6C1CD59B3BBC3836BD43767 /* View+RxGesture.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t84F38B93AFAA7B8E0B03B786034FA5E9 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8FBA14759D5686E201066D8DD81D2794 /* RxAlamofire-dummy.m in Sources */,\n\t\t\t\tCDAD14D7F2DC3BF192411C56B374C172 /* RxAlamofire.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tB0CAA73D50E134E589B648ABF6682839 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF48DD4AF7C254B7A2F67A690AF8EF143 /* IQBarButtonItem.swift in Sources */,\n\t\t\t\t4882783C5576C5D43CE79C03DE33C3DD /* IQKeyboardManager.swift in Sources */,\n\t\t\t\t9B9C1A095D68E3B91BD38F910C6F2E7F /* IQKeyboardManagerConstants.swift in Sources */,\n\t\t\t\tEC2CCB07B8CCEF669FAF345D29691030 /* IQKeyboardManagerConstantsInternal.swift in Sources */,\n\t\t\t\tB0EF72D8E2CB6594FEE4DB2600B32650 /* IQKeyboardManagerSwift-dummy.m in Sources */,\n\t\t\t\tC40F6D2FE20755C045864C23F73260C8 /* IQKeyboardReturnKeyHandler.swift in Sources */,\n\t\t\t\tCC93854C66A808596F5A3B58FDB49BF8 /* IQNSArray+Sort.swift in Sources */,\n\t\t\t\tCB29E86F679E9DDC5C5A1C89482701CA /* IQPreviousNextView.swift in Sources */,\n\t\t\t\t88A25F661A4435D57041D21700515CC6 /* IQTextView.swift in Sources */,\n\t\t\t\t1F0F49D029C4471F2AE3712D1FCB1D8A /* IQTitleBarButtonItem.swift in Sources */,\n\t\t\t\t02A8CD406255AE081E99A62241BAC587 /* IQToolbar.swift in Sources */,\n\t\t\t\t2384AC373E752D55842F37DE4F2CE2A7 /* IQUIScrollView+Additions.swift in Sources */,\n\t\t\t\tB1A7ADAE2CAEDA5D703CE5C6A6DA405B /* IQUITextFieldView+Additions.swift in Sources */,\n\t\t\t\t3077B4186B916A8DB980BBB72DF7FFB9 /* IQUIView+Hierarchy.swift in Sources */,\n\t\t\t\t9C178A996A6A0F14CF4B1F1D1BA4B2EB /* IQUIView+IQKeyboardToolbar.swift in Sources */,\n\t\t\t\t866952184CCB9236E8D567A97A7C3224 /* IQUIViewController+Additions.swift in Sources */,\n\t\t\t\t64FFC1F647245F61C405AE7AC1DA9D31 /* IQUIWindow+Hierarchy.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tBA8BA23DC65E6F3033B570067BCF4E49 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7718718BA955BC1ADF13A14CF2FAEC0D /* AnimatableSectionModel.swift in Sources */,\n\t\t\t\tAF5F7A48DB63AB10243894FA9BA673A0 /* AnimatableSectionModelType+ItemPath.swift in Sources */,\n\t\t\t\tFD99B1C2C751D10EFC95B148A9028316 /* AnimatableSectionModelType.swift in Sources */,\n\t\t\t\t51B625C8BDBF7B247899FF64794370B8 /* Changeset.swift in Sources */,\n\t\t\t\t609E700D79249C49A9EF7D6F72440F34 /* Diff.swift in Sources */,\n\t\t\t\t8253C04716B2C6BE88755512C4BB2D27 /* Differentiator-dummy.m in Sources */,\n\t\t\t\tDE8B3FC90EA6A88A4B44039572481C86 /* IdentifiableType.swift in Sources */,\n\t\t\t\tF64167E53EFA6CC3537752E4C2442990 /* IdentifiableValue.swift in Sources */,\n\t\t\t\tF363D1083A5EFBE7CE56067520330A9D /* ItemPath.swift in Sources */,\n\t\t\t\tF4ECE99FE56932FCA2EB2B238C8EA43E /* Optional+Extensions.swift in Sources */,\n\t\t\t\tEA4F7446E804B5FD266D16B9E9AE5374 /* SectionModel.swift in Sources */,\n\t\t\t\t6FA0019746BB30AF58E427FD0CBCEE3C /* SectionModelType.swift in Sources */,\n\t\t\t\tD371307D7540D73B2DC187E81186B097 /* Utilities.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCAEF755B2AF170481A5749470818E9D9 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD0121BBC81F4FA5DEF3D0A4F405BC605 /* ReusableKit-dummy.m in Sources */,\n\t\t\t\t78393A7387E5886A01E30F08172D3963 /* ReusableKit.swift in Sources */,\n\t\t\t\t6CC98E6987E27D6CCDDFAE2F012A013C /* UICollectionView+ReusableKit.swift in Sources */,\n\t\t\t\tA345A8C3AD50AA10257D9C7F63F7D5EA /* UICollectionView+RxReusableKit.swift in Sources */,\n\t\t\t\t97D88C924A7F6C1481FAECCC3E5E56E0 /* UITableView+ReusableKit.swift in Sources */,\n\t\t\t\t48700A675D816D1D4D07E26087D0A5C8 /* UITableView+RxReusableKit.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCFD0F4D99C3A2A82253E9498985556F9 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tC1A095D5DB6C70109EE936A914E53709 /* SwiftyColor-dummy.m in Sources */,\n\t\t\t\tAF0CD2BD2A2074BF1A98000D204275A5 /* SwiftyColor.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tD705382C7BFF2D2C2EC37FEA0F8EEB4B /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tEA811EC31868E728B8BE88F94CA53B19 /* AddRef.swift in Sources */,\n\t\t\t\tA2E8853B9D79DAA9B2512F7AF251C587 /* Amb.swift in Sources */,\n\t\t\t\t10B28E1329EC509470D6073426296383 /* AnonymousDisposable.swift in Sources */,\n\t\t\t\tE2F35C82BD4AB36C18F735165A7683EE /* AnonymousObserver.swift in Sources */,\n\t\t\t\t8757DAF954F1D3C28C865BCFE62341D1 /* AnyObserver.swift in Sources */,\n\t\t\t\t022580D7BA3860D083FC817324DDD52D /* AsMaybe.swift in Sources */,\n\t\t\t\tF931EEDE05DA8151D729C5C39F5CBE83 /* AsSingle.swift in Sources */,\n\t\t\t\t4323B40B40C5D9EF55A1E88569EE9C8E /* AsyncLock.swift in Sources */,\n\t\t\t\t9ACC05833323E3CB2FD5DEE095CFBD71 /* AsyncSubject.swift in Sources */,\n\t\t\t\tAEF1257C803A37C026D774C6EB1F5A8B /* Bag+Rx.swift in Sources */,\n\t\t\t\tA6883C52C0D62642960508D2E64CB789 /* Bag.swift in Sources */,\n\t\t\t\t96599CA3482E11E508F3607F678A4075 /* BehaviorSubject.swift in Sources */,\n\t\t\t\t70F84C166016A96F0493CAE9BAA238F2 /* BinaryDisposable.swift in Sources */,\n\t\t\t\tCF3B98E3589779E82B30019BF13739D4 /* BooleanDisposable.swift in Sources */,\n\t\t\t\t340B17F6811B1F4D98C92209B4A68C5A /* Buffer.swift in Sources */,\n\t\t\t\tBD443E89A222B5234FE7167CC470030A /* Cancelable.swift in Sources */,\n\t\t\t\tD989E0CB9CB56EBC807116DB668019AE /* Catch.swift in Sources */,\n\t\t\t\t95C52B5A296DEDDA23804E0EB3441E98 /* CombineLatest+arity.swift in Sources */,\n\t\t\t\tB467718840D63E04D0D3AD556E11E665 /* CombineLatest+Collection.swift in Sources */,\n\t\t\t\tC1CF0A6316B4563F05B117FDABF76AD8 /* CombineLatest.swift in Sources */,\n\t\t\t\t101F0992A8ADA071018179C8A35A2DB6 /* Completable+AndThen.swift in Sources */,\n\t\t\t\t023B9DEF425CEF2B0993CC116B9D7748 /* Completable.swift in Sources */,\n\t\t\t\t6508C244210F686EA369416EA9FA88E9 /* CompositeDisposable.swift in Sources */,\n\t\t\t\t8EAB5DCA47437AE6A858FC683FBA23C6 /* Concat.swift in Sources */,\n\t\t\t\tCC3F2D5828482FEE2984ACA3FDF23349 /* ConcurrentDispatchQueueScheduler.swift in Sources */,\n\t\t\t\t52D0B3F0EA5BCADED39162E5560909F9 /* ConcurrentMainScheduler.swift in Sources */,\n\t\t\t\tEE855D5B4F46A1DB974602210A435D93 /* ConnectableObservableType.swift in Sources */,\n\t\t\t\tDA7EB935B3E95B385300ECE8D38F71B6 /* Create.swift in Sources */,\n\t\t\t\t2A1B0B5AAC6B121823473D167C5B372E /* CurrentThreadScheduler.swift in Sources */,\n\t\t\t\t2D628BD8A654993F779B1C05DC8A4F4C /* Debounce.swift in Sources */,\n\t\t\t\tF1733F37EB2E6EF05781BB4DA571B204 /* Debug.swift in Sources */,\n\t\t\t\t59AA965004671689A9B41955CB6BA511 /* DefaultIfEmpty.swift in Sources */,\n\t\t\t\tA788C5E58CFBB81C97345BAA4C6A292B /* Deferred.swift in Sources */,\n\t\t\t\t3AF4EE85A4140EBA123BA54FBFC1ADF9 /* Delay.swift in Sources */,\n\t\t\t\t09FA411E4CCB0B52628890F610065A66 /* DelaySubscription.swift in Sources */,\n\t\t\t\t1C8AFF6985D76BB339539D41CCC403F6 /* Dematerialize.swift in Sources */,\n\t\t\t\tBABE350B5A22F812D599C5C016EAA1C4 /* Deprecated.swift in Sources */,\n\t\t\t\t186AC9E5D41A13F254AA6A111A659C86 /* DispatchQueue+Extensions.swift in Sources */,\n\t\t\t\t208482EE9B0AF0B0557F8E32F1B7A290 /* DispatchQueueConfiguration.swift in Sources */,\n\t\t\t\tA580F7392F3E5BD4B04688E9FE75B88F /* Disposable.swift in Sources */,\n\t\t\t\t4EA164050B9B1B1344A8984EC924D34E /* Disposables.swift in Sources */,\n\t\t\t\tC273C74217117E95DFB32C153F6DAA84 /* DisposeBag.swift in Sources */,\n\t\t\t\t9A726AE6822AF4B3AE67808BFB9845F9 /* DisposeBase.swift in Sources */,\n\t\t\t\tF95FC708ACF2B7648DFBCD974ACD9B89 /* DistinctUntilChanged.swift in Sources */,\n\t\t\t\tF07FA872B5DE108E5F0B486E7F183E77 /* Do.swift in Sources */,\n\t\t\t\tE90FA56D8781CEEECA7E5AD108103434 /* ElementAt.swift in Sources */,\n\t\t\t\tDDAD3A47F10FBBB697E079CAB38EC31C /* Empty.swift in Sources */,\n\t\t\t\t5AE90602C51230C8DA03B35061E42AA4 /* Enumerated.swift in Sources */,\n\t\t\t\tF71C6DC478982AEAFDE2B7040BC82D67 /* Error.swift in Sources */,\n\t\t\t\t18C27FC3DA935FF02249B00D2410C6D3 /* Errors.swift in Sources */,\n\t\t\t\tDBF869BBD4D1B55C2D5CFE5EAE756F9F /* Event.swift in Sources */,\n\t\t\t\t4AFA156443C8EF0EDABD03E6626DAB5F /* Filter.swift in Sources */,\n\t\t\t\t4CECE91A2400A1389FB240DA09F92D44 /* First.swift in Sources */,\n\t\t\t\t3D68B2DD0D49F92CFE4D07447D4861FA /* Generate.swift in Sources */,\n\t\t\t\tFFE963243CB86C7F5CC3F386683393FA /* GroupBy.swift in Sources */,\n\t\t\t\t41F2693C7BDA9AA4141C2017F724EB92 /* GroupedObservable.swift in Sources */,\n\t\t\t\t988CE455361E53CE47125E2E64F7279C /* HistoricalScheduler.swift in Sources */,\n\t\t\t\tF34B7F0D30A6D72E9FBF2242712BDF9D /* HistoricalSchedulerTimeConverter.swift in Sources */,\n\t\t\t\tE560CBBCB2A8426232A0C237818CB350 /* ImmediateSchedulerType.swift in Sources */,\n\t\t\t\t0638F162B79029D25571C968F00A8721 /* InfiniteSequence.swift in Sources */,\n\t\t\t\tE4C77EA0646C587F18D7AEC063AA13AA /* InvocableScheduledItem.swift in Sources */,\n\t\t\t\t0EEB4473FC528447BEC20C32448BF58E /* InvocableType.swift in Sources */,\n\t\t\t\t068C7761D808018F145A97CA20A231BC /* Just.swift in Sources */,\n\t\t\t\t6D5E66010A47E24AC918B48051FA9B3B /* Lock.swift in Sources */,\n\t\t\t\t1E340BDD912879B4160C43D9982104EC /* LockOwnerType.swift in Sources */,\n\t\t\t\t2E1C908C7B515E06E6ACE5D56B2D0037 /* MainScheduler.swift in Sources */,\n\t\t\t\tFD11E5E7BE23D70131359C06A7C63B94 /* Map.swift in Sources */,\n\t\t\t\t4639BFED317F19A1BA465B22250228A1 /* Materialize.swift in Sources */,\n\t\t\t\t084482D74A1740BF8258EEF9FEC9C93A /* Maybe.swift in Sources */,\n\t\t\t\t0FD6CD7FBCB5EB6CEC1CABC3CAE78B12 /* Merge.swift in Sources */,\n\t\t\t\tC9C7FF8901714AEEF66A96DEC28B4C51 /* Multicast.swift in Sources */,\n\t\t\t\t5160BA1430D2179A43B3A0B558F23E1F /* Never.swift in Sources */,\n\t\t\t\t9732F130B48FC5DDA707612D58A7BEC9 /* NopDisposable.swift in Sources */,\n\t\t\t\tD9AAAFC710311CB167E506163E994A4D /* Observable.swift in Sources */,\n\t\t\t\t5AC44C9876A3D343C63CDE76A4139036 /* ObservableConvertibleType.swift in Sources */,\n\t\t\t\tE402F8791AB3E6BE18F05C1265668896 /* ObservableType+Extensions.swift in Sources */,\n\t\t\t\t5F59C423FBE9B7D79A9CDB48BCE24B3E /* ObservableType+PrimitiveSequence.swift in Sources */,\n\t\t\t\t8BB9815D2C57EA5200DCE170988860DB /* ObservableType.swift in Sources */,\n\t\t\t\t72F8287CD5471AE0376C28EC9AD903CA /* ObserveOn.swift in Sources */,\n\t\t\t\t96E58EA8ACCB671460FB4D4A98113D92 /* ObserverBase.swift in Sources */,\n\t\t\t\t7FEE8F5AEE7AF4879B8911612CF82CCC /* ObserverType.swift in Sources */,\n\t\t\t\t5D97452371AFE3FBC01EF1B84633C34B /* OperationQueueScheduler.swift in Sources */,\n\t\t\t\tB2B98FD2647A3FA41300E78136335B3B /* Optional.swift in Sources */,\n\t\t\t\t3F7E121270CEB5622C8E10DE12E11E40 /* Platform.Darwin.swift in Sources */,\n\t\t\t\t442CB576089010AAA46D4D5977388D87 /* Platform.Linux.swift in Sources */,\n\t\t\t\t5288D9F32C3135D4FEF0A9601C153E7F /* PrimitiveSequence+Zip+arity.swift in Sources */,\n\t\t\t\tCB3BEC3D885EFDE2FE24B5A4F6FC16E7 /* PrimitiveSequence.swift in Sources */,\n\t\t\t\t47CA831BE2229583488AE4A12E320BCD /* PriorityQueue.swift in Sources */,\n\t\t\t\t1784A1AE7CB88EA9BF1A9CF7377C8090 /* Producer.swift in Sources */,\n\t\t\t\t6303CB98027B59C02EA4EFB216E7069B /* PublishSubject.swift in Sources */,\n\t\t\t\t42C4C9573928B869632A7829D9A6BCBE /* Queue.swift in Sources */,\n\t\t\t\t289F681251A15B7EF356F7198CB3A5CE /* Range.swift in Sources */,\n\t\t\t\t6129D5C1F81A4991CEFA556838395C58 /* Reactive.swift in Sources */,\n\t\t\t\t6E116732E3E785C9F5D69045E6371E71 /* RecursiveLock.swift in Sources */,\n\t\t\t\t8A1AF61FB826C9D132ABFC0195471179 /* RecursiveScheduler.swift in Sources */,\n\t\t\t\tB6E2FEDDD91D886E3BA3F1F9D338E672 /* Reduce.swift in Sources */,\n\t\t\t\t051F11606D79C85C63FD6BDEE5C2A6E8 /* RefCountDisposable.swift in Sources */,\n\t\t\t\t4CE7FCD6E10E191F7811CFB81CFDAF6C /* Repeat.swift in Sources */,\n\t\t\t\t8B6ADD6C31B20E3FC60C00F494B59112 /* ReplaySubject.swift in Sources */,\n\t\t\t\tF793B5FB9A2D4726AF9CB4E564BFE650 /* RetryWhen.swift in Sources */,\n\t\t\t\t2616DFB5A134CFB3D2F88848CA6730A6 /* Rx.swift in Sources */,\n\t\t\t\tB33491A4893CF9905D4A8DF6A8BB52A1 /* RxMutableBox.swift in Sources */,\n\t\t\t\t2478D027E97BFE0F71CF21D8B9E8020F /* RxSwift-dummy.m in Sources */,\n\t\t\t\t4303F3EF9822CB9AEB720051B0FD4F6B /* Sample.swift in Sources */,\n\t\t\t\tAA5D493C14AE53D874A31A847787D800 /* Scan.swift in Sources */,\n\t\t\t\t4891FF4C052E475B1712F1251F9E3D9D /* ScheduledDisposable.swift in Sources */,\n\t\t\t\tAC8523DFDA128333C4B596BEE5DDD3BD /* ScheduledItem.swift in Sources */,\n\t\t\t\t60F43A8950189140E8E60155EA3F403F /* ScheduledItemType.swift in Sources */,\n\t\t\t\t5E30EEC06CCBCF67205D284B1FC7496F /* SchedulerServices+Emulation.swift in Sources */,\n\t\t\t\t216DC034D3FF185097D5C162323EA37C /* SchedulerType.swift in Sources */,\n\t\t\t\tCFB93AB1B5504D35D1E6664972D62F19 /* Sequence.swift in Sources */,\n\t\t\t\t770E2F9E0A86F1290A34AD9C5FBA2128 /* SerialDispatchQueueScheduler.swift in Sources */,\n\t\t\t\tC5C6E5A84362150667FF88B6C18C0DAB /* SerialDisposable.swift in Sources */,\n\t\t\t\t3244910D451D0BBF516D27D067C9A5C4 /* ShareReplayScope.swift in Sources */,\n\t\t\t\t74EBBCE7876A5AE3C73D7386EB85D4A4 /* Single.swift in Sources */,\n\t\t\t\tADE879A06835C91322843C21A58C5C40 /* SingleAssignmentDisposable.swift in Sources */,\n\t\t\t\tC059355C2838DB2D4A2796B41543511A /* SingleAsync.swift in Sources */,\n\t\t\t\t9EE9EF9B3B2B22A38445D287017EFC0B /* Sink.swift in Sources */,\n\t\t\t\t49FC00F712C285D51C1C0708521BB01C /* Skip.swift in Sources */,\n\t\t\t\t2396E8B97AED713A2F93792BB324738B /* SkipUntil.swift in Sources */,\n\t\t\t\t07786426A59FC42A5077B8B28EF25834 /* SkipWhile.swift in Sources */,\n\t\t\t\t75D28DC57BA76546CEDC5EFA5453E974 /* StartWith.swift in Sources */,\n\t\t\t\t11F2729CD19FF2CBFE91E3D4A5A3D088 /* String+Rx.swift in Sources */,\n\t\t\t\t579D9C74D7293D142E36B5DB1CF0E320 /* SubjectType.swift in Sources */,\n\t\t\t\t1D16749675E7E62321F1D550ED6CE78F /* SubscribeOn.swift in Sources */,\n\t\t\t\tEB2866D890A7B0D65C8AB7F37614C15F /* SubscriptionDisposable.swift in Sources */,\n\t\t\t\t13575C4CA4D1D8F0DBB6E2164CBFF620 /* SwiftSupport.swift in Sources */,\n\t\t\t\tE92322FB9B976A926D52D12C5ECC5816 /* Switch.swift in Sources */,\n\t\t\t\t1091FE5A37CC5E22263AED304386D408 /* SwitchIfEmpty.swift in Sources */,\n\t\t\t\tB74C2929B76A5841DBF3C73BA3C09FB8 /* SynchronizedDisposeType.swift in Sources */,\n\t\t\t\t43D9EDAE797E70640D7B55EB56DA871E /* SynchronizedOnType.swift in Sources */,\n\t\t\t\tBC3A96095032E81BC2F8E5A479CE906E /* SynchronizedUnsubscribeType.swift in Sources */,\n\t\t\t\t72AFC537FCBE9326BB279F237C9043F6 /* TailRecursiveSink.swift in Sources */,\n\t\t\t\t948045455233BAFB85BDF5F033DA8686 /* Take.swift in Sources */,\n\t\t\t\t5D035B296631F978D172D0AE1EDF319D /* TakeLast.swift in Sources */,\n\t\t\t\tCD8C4C4267E198C30ED82159B3FB2A45 /* TakeUntil.swift in Sources */,\n\t\t\t\tC1446EC49AB387AF0EDF8DD292AB22F3 /* TakeWhile.swift in Sources */,\n\t\t\t\t03E8239071E8786ED0AFD90253814966 /* Throttle.swift in Sources */,\n\t\t\t\tBDB43EE666BB8F17F18E4DDBBE6C2B43 /* Timeout.swift in Sources */,\n\t\t\t\t07CBA63D00073C1C74402986AE9277C3 /* Timer.swift in Sources */,\n\t\t\t\tC26CD78814782F6C4BF7C3B02CA06642 /* ToArray.swift in Sources */,\n\t\t\t\t86C74540C24DEB52302C80CA759169C8 /* Using.swift in Sources */,\n\t\t\t\t8E3D1F07AFD7234A412DAAD8E22A9A09 /* VirtualTimeConverterType.swift in Sources */,\n\t\t\t\t8A25F0A06E679359184DD5C9BE408190 /* VirtualTimeScheduler.swift in Sources */,\n\t\t\t\t608A03F75F4AC580AF9EBFD756AB8DC5 /* Window.swift in Sources */,\n\t\t\t\t8F3F3F3792930B9DEDA544AAEA07A60A /* WithLatestFrom.swift in Sources */,\n\t\t\t\tDD2D9461BFEB9EE414A6D61E3A8CD7A6 /* Zip+arity.swift in Sources */,\n\t\t\t\tF9B8AF86D7F4375E5CDE51D06BE78501 /* Zip+Collection.swift in Sources */,\n\t\t\t\t6B1D5FA190C5943AC83CBDA241C07E27 /* Zip.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tE29D37D323EFBAB92ED4EB9E402A34FF /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tBEE391D17D1ADB32DA7C8825FE827519 /* _RX.m in Sources */,\n\t\t\t\t3DA75181D1B7D20F0CDE54EA97C3072C /* _RXDelegateProxy.m in Sources */,\n\t\t\t\tC1E82097CF7DF3CB4B4063ED08D334D8 /* _RXKVOObserver.m in Sources */,\n\t\t\t\t4F03F93732A1DB9A6C1AD8ED0384DD90 /* _RXObjCRuntime.m in Sources */,\n\t\t\t\t6E953E2A94F99E02F79C4B98004E5396 /* Bag.swift in Sources */,\n\t\t\t\t5C5A43AECB27D48D5C446D3DD12DC1AD /* BehaviorRelay+Driver.swift in Sources */,\n\t\t\t\tFB640D6E1FCD811D905A620B508C33CE /* BehaviorRelay.swift in Sources */,\n\t\t\t\t7A82F7317FDDA0BD35C5E1BD4BE42249 /* Binder.swift in Sources */,\n\t\t\t\t7CD0D1E5ED33F75E019C7D85E040FED2 /* ControlEvent+Driver.swift in Sources */,\n\t\t\t\tF809B2628CA2797393525F37F639FB7C /* ControlEvent.swift in Sources */,\n\t\t\t\t5373AA3C95048D89FB975795EA34E8C7 /* ControlProperty+Driver.swift in Sources */,\n\t\t\t\t6C37C3E9F334B181ADEA8BDBF35751B5 /* ControlProperty.swift in Sources */,\n\t\t\t\tBD2B90D397024A00B586B7A58994F534 /* ControlTarget.swift in Sources */,\n\t\t\t\t67C42ADBD42CE7F614E2893EDA641519 /* DelegateProxy.swift in Sources */,\n\t\t\t\tFC66B4AE1897AF442BDFF005497ECF87 /* DelegateProxyType.swift in Sources */,\n\t\t\t\t9ACE31FCFAD5425ADF5B207722E20E8A /* Deprecated.swift in Sources */,\n\t\t\t\t05E3461942D63CA142876829DF2178B3 /* DispatchQueue+Extensions.swift in Sources */,\n\t\t\t\t643F0A0AEF6B1040E1243E8F065F0268 /* Driver+Subscription.swift in Sources */,\n\t\t\t\t63C400B1C64EC85BCE1ADB5C1C869B95 /* Driver.swift in Sources */,\n\t\t\t\t76407DBA37432054658558614EF3C6D5 /* InfiniteSequence.swift in Sources */,\n\t\t\t\tEAB9A201A0338EEBD326E78E366EEC20 /* ItemEvents.swift in Sources */,\n\t\t\t\tB2CFCC48BC62FB4C35F6096233613F7A /* KVORepresentable+CoreGraphics.swift in Sources */,\n\t\t\t\tC1E5669E219DF70E0E763DD0468795BF /* KVORepresentable+Swift.swift in Sources */,\n\t\t\t\tA8FC34B8104C504687DF452D1469CEC5 /* KVORepresentable.swift in Sources */,\n\t\t\t\t641E1DF7AF5B9C72AAE1242C38A3F684 /* Logging.swift in Sources */,\n\t\t\t\tCE57D6E0880DE871AB922E0017E1472B /* NotificationCenter+Rx.swift in Sources */,\n\t\t\t\t75BD25BF1A16B849D520933C732BEE8D /* NSLayoutConstraint+Rx.swift in Sources */,\n\t\t\t\tD3BECB43898F07D286FCEB33DC197331 /* NSObject+Rx+KVORepresentable.swift in Sources */,\n\t\t\t\t9505BB9F7E1749994974BBD6D0A17CC8 /* NSObject+Rx+RawRepresentable.swift in Sources */,\n\t\t\t\t99EE517D408612C2DD0FF21866BEAA63 /* NSObject+Rx.swift in Sources */,\n\t\t\t\t0F7E94DE4A01E0C2DE3D8FEF7A8DA76B /* NSTextStorage+Rx.swift in Sources */,\n\t\t\t\t84F11AFCD46554A1844889EBF7B915A5 /* Observable+Bind.swift in Sources */,\n\t\t\t\t512C561051AAF62FEAF39708C9E8273C /* ObservableConvertibleType+Driver.swift in Sources */,\n\t\t\t\t2ACB302D10B4EBDD404FE7781B7EB24D /* ObservableConvertibleType+Signal.swift in Sources */,\n\t\t\t\t59B16488BD43F14B60CFEAA70A67150B /* Platform.Darwin.swift in Sources */,\n\t\t\t\t2E024197B07B741D9A5BFB4CC13872FC /* Platform.Linux.swift in Sources */,\n\t\t\t\t2305F81424A8EA4AC22ED71E2EE69AD1 /* PriorityQueue.swift in Sources */,\n\t\t\t\tD7F05F607F7BEE704777650F1F56A17D /* PublishRelay+Signal.swift in Sources */,\n\t\t\t\tCCBED63F97ED12D1D9F2A35E42056C7E /* PublishRelay.swift in Sources */,\n\t\t\t\tB3643AFA39209852E984CD30BB18413A /* Queue.swift in Sources */,\n\t\t\t\tC12639433CE2E21DEF3AA6DED99748FF /* RecursiveLock.swift in Sources */,\n\t\t\t\t99B8666F8DEEAA2D94AF8F74CE63387B /* RxCocoa-dummy.m in Sources */,\n\t\t\t\tBE13FF6639C26FFBFE305F57336AB8E4 /* RxCocoa.swift in Sources */,\n\t\t\t\t356CB228C18677929A9A520E77620B13 /* RxCocoaObjCRuntimeError+Extensions.swift in Sources */,\n\t\t\t\t9E04C84E074D52269B2611658420FD41 /* RxCollectionViewDataSourceProxy.swift in Sources */,\n\t\t\t\t7F61C5C04977D2A2FF71DF6FEC861A94 /* RxCollectionViewDataSourceType.swift in Sources */,\n\t\t\t\tB1C6D346149535E8CA5CD2443BBFCCC3 /* RxCollectionViewDelegateProxy.swift in Sources */,\n\t\t\t\tCDFA17536632AE886DF2DD7FCBFF8F68 /* RxCollectionViewReactiveArrayDataSource.swift in Sources */,\n\t\t\t\t8E6BFD0EC4206F98140D4CA51D60D517 /* RxNavigationControllerDelegateProxy.swift in Sources */,\n\t\t\t\t788910D5C544192C236243BF21CD1E78 /* RxPickerViewAdapter.swift in Sources */,\n\t\t\t\tF98CB7FADDB6FDFD66E71D447444F5C5 /* RxPickerViewDataSourceProxy.swift in Sources */,\n\t\t\t\tD044C46E53776D7072DB89497EC1AC73 /* RxPickerViewDataSourceType.swift in Sources */,\n\t\t\t\tE454C46205FD054E2133897B1CF339D8 /* RxPickerViewDelegateProxy.swift in Sources */,\n\t\t\t\tBE7C78E3DD8046E3CB4BC5A28C057853 /* RxScrollViewDelegateProxy.swift in Sources */,\n\t\t\t\t25729D655583EBF1BDE99FF6BEAC272C /* RxSearchBarDelegateProxy.swift in Sources */,\n\t\t\t\t8D0EC20E5A152C52E877A0FD42A1D612 /* RxSearchControllerDelegateProxy.swift in Sources */,\n\t\t\t\t377636521A7593EE0D162CA57DD21C2A /* RxTabBarControllerDelegateProxy.swift in Sources */,\n\t\t\t\tEDA4B2824B12E7A3579F99909744E23C /* RxTabBarDelegateProxy.swift in Sources */,\n\t\t\t\t111388F3289E572B7FF90312D3C23DD1 /* RxTableViewDataSourceProxy.swift in Sources */,\n\t\t\t\t8014530DA6E561B4CA4905F2F68FF87C /* RxTableViewDataSourceType.swift in Sources */,\n\t\t\t\t6AE889190D5DE14192E8E0D26E0EA3B9 /* RxTableViewDelegateProxy.swift in Sources */,\n\t\t\t\t35CE9431B032341D2B6C4FF4384C84AB /* RxTableViewReactiveArrayDataSource.swift in Sources */,\n\t\t\t\tAF5D443F3631C6B95B4E8F831DCFDA79 /* RxTarget.swift in Sources */,\n\t\t\t\t93A094FED3649B43022FAD6174FBF11F /* RxTextStorageDelegateProxy.swift in Sources */,\n\t\t\t\t23BE46034D9F742CFFED1D6B7A25A2E1 /* RxTextViewDelegateProxy.swift in Sources */,\n\t\t\t\t7C98D625AAB36D8F2A92D5FAF28FCCF1 /* RxWebViewDelegateProxy.swift in Sources */,\n\t\t\t\t7B50A3CE4086B03F60DCAFD8090DF164 /* SchedulerType+SharedSequence.swift in Sources */,\n\t\t\t\t7DF2FFD108A489BAE76957B27C0815F2 /* SectionedViewDataSourceType.swift in Sources */,\n\t\t\t\t608E9ABBC7B02657C21A181EC25DED65 /* SharedSequence+Operators+arity.swift in Sources */,\n\t\t\t\t5759B5BC5FA1E2C7B5FF69B511DF68DA /* SharedSequence+Operators.swift in Sources */,\n\t\t\t\t43B97E40D05359125AA9EB9A928D53C7 /* SharedSequence.swift in Sources */,\n\t\t\t\tDB2D2DBE410D12B4A8EC0DEFACF3DF32 /* Signal+Subscription.swift in Sources */,\n\t\t\t\t9983C08AB4621CB25D31ED64E3005A86 /* Signal.swift in Sources */,\n\t\t\t\t06CCF3314F269406C8705B30D86CFD7C /* TextInput.swift in Sources */,\n\t\t\t\tF71155830BCEEE6D69E12F14089ED538 /* UIActivityIndicatorView+Rx.swift in Sources */,\n\t\t\t\tFB27B9C1DE7B9384AB45D8BBDECD8034 /* UIAlertAction+Rx.swift in Sources */,\n\t\t\t\t339CF382B95EBAEAC534A4DB86412D49 /* UIApplication+Rx.swift in Sources */,\n\t\t\t\tD7B62E5B90F5CC105525D4E4A710A1F3 /* UIBarButtonItem+Rx.swift in Sources */,\n\t\t\t\tCE7953BA2996D7B543684441E7BF2579 /* UIButton+Rx.swift in Sources */,\n\t\t\t\t0DF6F077A01F83D2296F474A6657D3DA /* UICollectionView+Rx.swift in Sources */,\n\t\t\t\t94E7616A9A6BBA3C0C59BE9F694AD549 /* UIControl+Rx.swift in Sources */,\n\t\t\t\t8EA1993902CC8DE0A3E5F00E00976C4D /* UIDatePicker+Rx.swift in Sources */,\n\t\t\t\tE678304A73835950C93570CD42BF160F /* UIGestureRecognizer+Rx.swift in Sources */,\n\t\t\t\t267F1D36C8E6ED6B5CBD0DACA0FB38C3 /* UIImageView+Rx.swift in Sources */,\n\t\t\t\t80B0A06B1530CD62C0E818A58D30BCF8 /* UILabel+Rx.swift in Sources */,\n\t\t\t\t677CCFAA3FB253A30288AF00D9C792AF /* UINavigationController+Rx.swift in Sources */,\n\t\t\t\t1248CDC903C16DF981D48B43CC8CFDC5 /* UINavigationItem+Rx.swift in Sources */,\n\t\t\t\t2C5FA28BC6344178AFF753F9BEEC172F /* UIPageControl+Rx.swift in Sources */,\n\t\t\t\tA32920098427AC9AA08B59797AAB0AA0 /* UIPickerView+Rx.swift in Sources */,\n\t\t\t\t2738EFBB546EAD1A60E9426A13D68CEB /* UIProgressView+Rx.swift in Sources */,\n\t\t\t\t0A936243CBB929114D3405F0AC7C234F /* UIRefreshControl+Rx.swift in Sources */,\n\t\t\t\tEF298B1BEAB1956FCF7E1E8EA3911780 /* UIScrollView+Rx.swift in Sources */,\n\t\t\t\t1F242D91138AD1C8F49DCDA41B71461F /* UISearchBar+Rx.swift in Sources */,\n\t\t\t\tB3BC5178332C6FA8017CB00559E2AD92 /* UISearchController+Rx.swift in Sources */,\n\t\t\t\tE47F2B7C9621969D29330632BF46DFE3 /* UISegmentedControl+Rx.swift in Sources */,\n\t\t\t\tC1F06F8B94A566ABE591F84CEAC03C14 /* UISlider+Rx.swift in Sources */,\n\t\t\t\t2A194A7EBF3AF8D602791B5686534941 /* UIStepper+Rx.swift in Sources */,\n\t\t\t\tC7298FEC2DD0BCFDF12F89121CA036A7 /* UISwitch+Rx.swift in Sources */,\n\t\t\t\t7C1AFD71632F9548563C3B224B6BFAF1 /* UITabBar+Rx.swift in Sources */,\n\t\t\t\t902C28D80B247A6737276BF247BE1D1A /* UITabBarController+Rx.swift in Sources */,\n\t\t\t\t59BC49B15C7B4BD0AA38436D3567F9BD /* UITabBarItem+Rx.swift in Sources */,\n\t\t\t\tF66F21FCAD37F04AF3CE0B9ADDFACCC3 /* UITableView+Rx.swift in Sources */,\n\t\t\t\t1991BB121497AC9447A5DC6445464176 /* UITextField+Rx.swift in Sources */,\n\t\t\t\t5C6EBB68141BE6FE8A58CDAA7456BB67 /* UITextView+Rx.swift in Sources */,\n\t\t\t\t1ED1D03FFEB9595492A4F8783D35F81C /* UIView+Rx.swift in Sources */,\n\t\t\t\t8DE01434EBF2D9040CF7BA7CBE33DD6C /* UIViewController+Rx.swift in Sources */,\n\t\t\t\t8151252BABBE1D0CF4828711B003BCE6 /* UIWebView+Rx.swift in Sources */,\n\t\t\t\t8FB1637E28C8213F6A57DFBFC5390CAC /* URLSession+Rx.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF35FEC988ECD73463D93176BC71A43B1 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t0F981C56836FE34E921BC7253826A170 /* CustomDateFormatTransform.swift in Sources */,\n\t\t\t\tEC1A896625476730D64BF9645624BBAD /* DataTransform.swift in Sources */,\n\t\t\t\t4215D7313CE6E738AAD80E9FEC6C60CC /* DateFormatterTransform.swift in Sources */,\n\t\t\t\tF9B63BDA169DB048D41DA8395261AEBA /* DateTransform.swift in Sources */,\n\t\t\t\tB2EFEFFB34D517F8E9A203B674AEBD13 /* DictionaryTransform.swift in Sources */,\n\t\t\t\t706840688BA7E9BDE5F4DD2C0E558835 /* EnumOperators.swift in Sources */,\n\t\t\t\tFCE734BD83FB03D3DC9F8AA843ECD73B /* EnumTransform.swift in Sources */,\n\t\t\t\tDB87FF0D3B17ABB5452FDD4D70C9A84D /* FromJSON.swift in Sources */,\n\t\t\t\t551FB4DF0E5072BB849BB4FCE74F7361 /* HexColorTransform.swift in Sources */,\n\t\t\t\tB9C39C539A810D1958AEEF1AEC0FD75C /* ImmutableMappable.swift in Sources */,\n\t\t\t\t1894026C296B8A77711607C98ED40C86 /* IntegerOperators.swift in Sources */,\n\t\t\t\t255C4ADB2BD82FEEF86A3D4D43F31C63 /* ISO8601DateTransform.swift in Sources */,\n\t\t\t\tA5BFC49ED41BC416BEBF4772517AB741 /* Map.swift in Sources */,\n\t\t\t\t2D89AB26203628C04B3E87D045525701 /* MapError.swift in Sources */,\n\t\t\t\t67A4D8A24085ADC44A65404E73461B43 /* Mappable.swift in Sources */,\n\t\t\t\t77CA4CD47748C0B69982A6D82C2799D5 /* Mapper.swift in Sources */,\n\t\t\t\t6C2FE27FDBD6621AAB57E4082419C347 /* NSDecimalNumberTransform.swift in Sources */,\n\t\t\t\t59109302859941E04E87DC7044DFEE89 /* ObjectMapper-dummy.m in Sources */,\n\t\t\t\tEA67527CAF7ED571C8A84B66DDD70FBE /* Operators.swift in Sources */,\n\t\t\t\t134859C42E05396F62489E4329ECF6EA /* ToJSON.swift in Sources */,\n\t\t\t\t194858D10B9B1DD9FFEFBE4EAA0700F3 /* TransformOf.swift in Sources */,\n\t\t\t\t18E9B5E96557418567FCB7DCC559299F /* TransformOperators.swift in Sources */,\n\t\t\t\t27156C9092B7A82E24CF96312A941150 /* TransformType.swift in Sources */,\n\t\t\t\tF527B0A072DFD754B471E4C1F6B16C48 /* URLTransform.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF68621466263ABC9C173B16DCEA5238C /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t28766FD0E20C59920C9235FF0BCB22A2 /* Then-dummy.m in Sources */,\n\t\t\t\t4A79D8BBA62B2581089376DCF16AFD95 /* Then.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF7E49EE33EA82533063B0336FC00338E /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tB8567C825865356AF4137382CE6C007F /* Pods-RxXMLY-dummy.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF81A606714EAF37F04ADC51B6B6FD751 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t481AB919527D0B7F4C6DBC8F84DBCDE0 /* TYPagerController-dummy.m in Sources */,\n\t\t\t\t0A10103215004C9822201FB9572B2C00 /* TYPagerController.m in Sources */,\n\t\t\t\tB5A770DCA3CD54A8B48F6166F9D440E2 /* TYPagerView.m in Sources */,\n\t\t\t\tAACE8D1BD32A4820B7BEB0EE91FB0795 /* TYPagerViewLayout.m in Sources */,\n\t\t\t\t9F75265E3A28C06EA75E5FEF00087551 /* TYTabPagerBar.m in Sources */,\n\t\t\t\tACCE7F2F7E9C3F68256E49D4654E6076 /* TYTabPagerBarCell.m in Sources */,\n\t\t\t\tE1ED57DFDC84B588DCFF41921D9BED15 /* TYTabPagerBarLayout.m in Sources */,\n\t\t\t\t1314F3F62B92768E16CBFF1490AF29DE /* TYTabPagerController.m in Sources */,\n\t\t\t\tB0B357445D024E50F897E2DE8F2D58AF /* TYTabPagerView.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tFD12B015E1FDA3498428EF09C91D1F17 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tA7EC09EC6EFAB3778E0A0341E7DC9CE3 /* AnimatedImageView.swift in Sources */,\n\t\t\t\tB0033530A0EAABBB31CD46CA2899F3BD /* Box.swift in Sources */,\n\t\t\t\t5D83206A9A4656F11D511158EC8E0784 /* CacheSerializer.swift in Sources */,\n\t\t\t\t1DAF3BB88351664576507F774FEB051C /* Filter.swift in Sources */,\n\t\t\t\t40765AAA791D6DFC0022639E348F0E6A /* FormatIndicatedCacheSerializer.swift in Sources */,\n\t\t\t\t950D8E334E011B13CC5786595E6AE615 /* Image.swift in Sources */,\n\t\t\t\t8D7D42C25F9430F572E14200C399D57B /* ImageCache.swift in Sources */,\n\t\t\t\t413C2A3759ABEC870AAE61F28C258C31 /* ImageDownloader.swift in Sources */,\n\t\t\t\tF99792883819ADBD16123F91F6A9F3F8 /* ImagePrefetcher.swift in Sources */,\n\t\t\t\t93D444FC9D79520E14FB8EF178F0B76E /* ImageProcessor.swift in Sources */,\n\t\t\t\t07432E8DEA8B25795C7C545AA67A0187 /* ImageTransition.swift in Sources */,\n\t\t\t\tCB8DF027448816C623E9B02A3685A59F /* ImageView+Kingfisher.swift in Sources */,\n\t\t\t\t2082EB4AA16440FFD5479FAFC0181066 /* Indicator.swift in Sources */,\n\t\t\t\tCB4222BC34D92C2E06A5BCF730FEFE71 /* Kingfisher-dummy.m in Sources */,\n\t\t\t\t873BA68C2E24D634D38E4A8BCB74B08D /* Kingfisher.swift in Sources */,\n\t\t\t\t383C9A8DB84B83233633C3A00A2C1608 /* KingfisherManager.swift in Sources */,\n\t\t\t\t1827E7D94F3A12CA0C58EF33AE4B026D /* KingfisherOptionsInfo.swift in Sources */,\n\t\t\t\tE710FF1F4EB4B125F9C5DBDFE3B9320F /* Placeholder.swift in Sources */,\n\t\t\t\t282E6F0E67F3799B0ABCB9ED96B666A9 /* RequestModifier.swift in Sources */,\n\t\t\t\t1FCC0970C8435F10768CA84C2025A177 /* Resource.swift in Sources */,\n\t\t\t\t10AD5E70FDD53228153032C58FBF4D52 /* String+MD5.swift in Sources */,\n\t\t\t\t48EC78A50C61424D4DFDC33A325CAA72 /* ThreadHelper.swift in Sources */,\n\t\t\t\tFAC3C67720C7E6EF51CCAE58F62645BC /* UIButton+Kingfisher.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t08BBAECE794424C6A743B64C09DB1F15 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = SnapKit;\n\t\t\ttarget = 8E38AFA40EB24AAD3998F3F9CFB12CA3 /* SnapKit */;\n\t\t\ttargetProxy = 2ACD2B5E0B881C8AE65F933BD84DB2BB /* PBXContainerItemProxy */;\n\t\t};\n\t\t10AED09D93D2CD014F7BA195EFC2A01D /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = TYCyclePagerView;\n\t\t\ttarget = 0B620384669DABB34C3C5B96EA60F12A /* TYCyclePagerView */;\n\t\t\ttargetProxy = FC9E7142C6CF7EE64F13E5BEE4B234E1 /* PBXContainerItemProxy */;\n\t\t};\n\t\t1305CEBDCD0AA3A968FBB90778AC74B5 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = RxSwift;\n\t\t\ttarget = 371551DFD98A9103D43168E4BD0479F0 /* RxSwift */;\n\t\t\ttargetProxy = 1B9585FC3126D0BD21B2221D625803E7 /* PBXContainerItemProxy */;\n\t\t};\n\t\t1D6CC51BC907D8D84EC14CFC3A935BF9 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = SwiftyColor;\n\t\t\ttarget = 93FD28A3DC61A9094248D0D96CAD9FD4 /* SwiftyColor */;\n\t\t\ttargetProxy = 6CEBF919355CD7B687C5D986511A3630 /* PBXContainerItemProxy */;\n\t\t};\n\t\t1F022C3FAE5D080B47B2C4EB5A4B7A31 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = RxCocoa;\n\t\t\ttarget = 1F5BFD2D8E3672CE19EA16B5208A4066 /* RxCocoa */;\n\t\t\ttargetProxy = 8DE395CD515C5D9F68A4FBEC6D9E49FB /* PBXContainerItemProxy */;\n\t\t};\n\t\t2217DC3041FFBBE5E80AAB2A9DC3C930 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = Alamofire;\n\t\t\ttarget = 88E9EC28B8B46C3631E6B242B50F4442 /* Alamofire */;\n\t\t\ttargetProxy = C291EBE2993E897C362199B1BAEEC035 /* PBXContainerItemProxy */;\n\t\t};\n\t\t262BA16A4ED2BE76F6D01B3E3A3ECD1B /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = RxSwift;\n\t\t\ttarget = 371551DFD98A9103D43168E4BD0479F0 /* RxSwift */;\n\t\t\ttargetProxy = FEA62B82099C97A42F3968BAAD232850 /* PBXContainerItemProxy */;\n\t\t};\n\t\t41F1B2694597D80C8C88DD1E191C2DA0 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = RxCocoa;\n\t\t\ttarget = 1F5BFD2D8E3672CE19EA16B5208A4066 /* RxCocoa */;\n\t\t\ttargetProxy = A344436CFCCEA3FD967A5C394C074F4A /* PBXContainerItemProxy */;\n\t\t};\n\t\t4979E917B04F9F132A2DEC8E47979A28 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = Differentiator;\n\t\t\ttarget = 844C9B244CEFA2F26288789C423101B4 /* Differentiator */;\n\t\t\ttargetProxy = 15F1D0A9F74EAF7D407DC563D31027A7 /* PBXContainerItemProxy */;\n\t\t};\n\t\t49EE20815EBE4FABDDC3320C6B5B116C /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = RxSwift;\n\t\t\ttarget = 371551DFD98A9103D43168E4BD0479F0 /* RxSwift */;\n\t\t\ttargetProxy = 3AEB60BF032C5F152E4CCAEF2273CF19 /* PBXContainerItemProxy */;\n\t\t};\n\t\t4A1836A5702E2F2BF9536F435BCC4E92 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = TYPagerController;\n\t\t\ttarget = CCEEA2E517C9CB166C75BAF4A263A7CF /* TYPagerController */;\n\t\t\ttargetProxy = B5DD30A0B9289F764F95945D2D1F8C8B /* PBXContainerItemProxy */;\n\t\t};\n\t\t4C8BC7A07FCDEC22BAC47D2EA5B8DB58 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = ReusableKit;\n\t\t\ttarget = 524DC20BC58D4BDA1F0C77763DFA70BE /* ReusableKit */;\n\t\t\ttargetProxy = A7230AE231CD9B06EE4CDAE3A1068E9D /* PBXContainerItemProxy */;\n\t\t};\n\t\t4EB5F10F6AC0963099F3FC814DF14415 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = Result;\n\t\t\ttarget = 1C61647CEE01897368F5D0D2CC181DB4 /* Result */;\n\t\t\ttargetProxy = F78D05F575692EA731781B820137FCAC /* PBXContainerItemProxy */;\n\t\t};\n\t\t5444B96DBCDAD467604CD8796C2A3AE2 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = RxSwift;\n\t\t\ttarget = 371551DFD98A9103D43168E4BD0479F0 /* RxSwift */;\n\t\t\ttargetProxy = A7D03FCA25AACE15F81E2A98FE9DC3D8 /* PBXContainerItemProxy */;\n\t\t};\n\t\t564A6BC33E46BA3758AE193165BD2546 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = RxCocoa;\n\t\t\ttarget = 1F5BFD2D8E3672CE19EA16B5208A4066 /* RxCocoa */;\n\t\t\ttargetProxy = 5421BFF2151DBD1E4557434A332B44FF /* PBXContainerItemProxy */;\n\t\t};\n\t\t74F8F17B6FC071183EB1EC5D2ED0880E /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = RxSwift;\n\t\t\ttarget = 371551DFD98A9103D43168E4BD0479F0 /* RxSwift */;\n\t\t\ttargetProxy = 23784648AAF575118683F20D78A60594 /* PBXContainerItemProxy */;\n\t\t};\n\t\t7A1A38F35129D8939DA93941E5566EFE /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = IQKeyboardManagerSwift;\n\t\t\ttarget = C235F77E101E742652CCF98FFDFA5182 /* IQKeyboardManagerSwift */;\n\t\t\ttargetProxy = A2D41E2E3A703CF7EC447F13B1D2D28D /* PBXContainerItemProxy */;\n\t\t};\n\t\t7DF9738D2EB15BE150084534280EEDBC /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = RxGesture;\n\t\t\ttarget = B496A58A7B812A10E0039E15EDF0E8EE /* RxGesture */;\n\t\t\ttargetProxy = D7D399EDABE3916260C38946E0F4CCDD /* PBXContainerItemProxy */;\n\t\t};\n\t\t7E2C13AE966FB76B2736F2F745A55A84 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = Differentiator;\n\t\t\ttarget = 844C9B244CEFA2F26288789C423101B4 /* Differentiator */;\n\t\t\ttargetProxy = 6261BDDB54F9C51D2C747DE59337227D /* PBXContainerItemProxy */;\n\t\t};\n\t\t7F53856AB469B6C0D0227D2098D36F1A /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = Result;\n\t\t\ttarget = 1C61647CEE01897368F5D0D2CC181DB4 /* Result */;\n\t\t\ttargetProxy = 9A4961597B182A9A8365503B12A4CC49 /* PBXContainerItemProxy */;\n\t\t};\n\t\t82A7E8FA790BFD2EEAA4CBBFC398A3AD /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = Alamofire;\n\t\t\ttarget = 88E9EC28B8B46C3631E6B242B50F4442 /* Alamofire */;\n\t\t\ttargetProxy = 9264E39D9FF475826031CA00737738D8 /* PBXContainerItemProxy */;\n\t\t};\n\t\t91360C912E71D51EA842B318BAEBA511 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = Alamofire;\n\t\t\ttarget = 88E9EC28B8B46C3631E6B242B50F4442 /* Alamofire */;\n\t\t\ttargetProxy = 80D52ABA9C03D8C4E466A3C2ECC923CF /* PBXContainerItemProxy */;\n\t\t};\n\t\t994AD4F34D30D7AD6C8E508F85E720FC /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = \"NSObject+Rx\";\n\t\t\ttarget = 64CC9E274EBD6C16C53FC82EAA6FE9E7 /* NSObject+Rx */;\n\t\t\ttargetProxy = 1A8E520D805AA6588B14DC77528D8B0F /* PBXContainerItemProxy */;\n\t\t};\n\t\tA5495B347F8F13816C9E988F7ED6E887 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = RxCocoa;\n\t\t\ttarget = 1F5BFD2D8E3672CE19EA16B5208A4066 /* RxCocoa */;\n\t\t\ttargetProxy = B40C0E974B9564F38F538252683B1ABC /* PBXContainerItemProxy */;\n\t\t};\n\t\tA9111896C809CC9110D085304115B040 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = RxSwift;\n\t\t\ttarget = 371551DFD98A9103D43168E4BD0479F0 /* RxSwift */;\n\t\t\ttargetProxy = C1809C26AE9AE581B69F3EBF3020386B /* PBXContainerItemProxy */;\n\t\t};\n\t\tAE2A28A9913F488DA60A2AE400C7C39C /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = Kingfisher;\n\t\t\ttarget = 6F712943B3C5592E82604940D11CE08A /* Kingfisher */;\n\t\t\ttargetProxy = 6BF334AD50FD77D652D687BCC4AEE011 /* PBXContainerItemProxy */;\n\t\t};\n\t\tAFCAAA9C845955F183FAC004DE305241 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = MJRefresh;\n\t\t\ttarget = E14A62900910444707A5504D25EC98DC /* MJRefresh */;\n\t\t\ttargetProxy = 2BA940D9885781F490DE5D7E8AF779C7 /* PBXContainerItemProxy */;\n\t\t};\n\t\tB9039DCFEEA782D86F9244953C22F447 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = RxDataSources;\n\t\t\ttarget = F05F33A12963EC1A726FEE15D9000AE2 /* RxDataSources */;\n\t\t\ttargetProxy = B6AEA89E672C6C293F8A451E760DC0B9 /* PBXContainerItemProxy */;\n\t\t};\n\t\tC04FA726205A1D05F027F1208191E76E /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = RxSwift;\n\t\t\ttarget = 371551DFD98A9103D43168E4BD0479F0 /* RxSwift */;\n\t\t\ttargetProxy = 51642FCC15CB2105630B74B65E122C2C /* PBXContainerItemProxy */;\n\t\t};\n\t\tC0DCC3CCC842C93357AEFDB929B5A252 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = ObjectMapper;\n\t\t\ttarget = CD6C9FB6B052E1CF663F8A56041EA163 /* ObjectMapper */;\n\t\t\ttargetProxy = AEB2857C08385E6AA8DBB9F8736DAF9F /* PBXContainerItemProxy */;\n\t\t};\n\t\tC2A6A892DEAC32783AE9D267A1E58534 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = ReactorKit;\n\t\t\ttarget = 0F6A8E28D6C2CC2BCA0477C6AF7137F2 /* ReactorKit */;\n\t\t\ttargetProxy = 338578A6E2DF40FE81DEC3B1372FB4AC /* PBXContainerItemProxy */;\n\t\t};\n\t\tD56703EF22DD8F7706F17918A2D0AB7F /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = Then;\n\t\t\ttarget = 2D5C20681FC0A1E18576D4673D0EFE65 /* Then */;\n\t\t\ttargetProxy = DCDD2C4EA666E90B5DDFEEBBA1DC5C8F /* PBXContainerItemProxy */;\n\t\t};\n\t\tD957D03022753D4ACA9E09D332D8EEA5 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = RxSwift;\n\t\t\ttarget = 371551DFD98A9103D43168E4BD0479F0 /* RxSwift */;\n\t\t\ttargetProxy = FF663F02F48AB40164A87D8914B81DF4 /* PBXContainerItemProxy */;\n\t\t};\n\t\tDAB919EDAE0C8E3D7232AFB62120664E /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = SwiftyJSON;\n\t\t\ttarget = DE874A99677D06A11E5FCC43C238A7D5 /* SwiftyJSON */;\n\t\t\ttargetProxy = E6C01306761AF7F0DB6473C9C03ECFBD /* PBXContainerItemProxy */;\n\t\t};\n\t\tDABB17D04DB056ACFEE47ED47B21D92E /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = RxAlamofire;\n\t\t\ttarget = 2166B105EDC9D2499513E6D6BCD586C2 /* RxAlamofire */;\n\t\t\ttargetProxy = E09A273BEF2F739232571736BCC24375 /* PBXContainerItemProxy */;\n\t\t};\n\t\tEEF9A4EC5A5005C3AED3CBD2E4BF7DD3 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = TTRangeSlider;\n\t\t\ttarget = E86A9F4C831EEE122A82C7CE19D4011B /* TTRangeSlider */;\n\t\t\ttargetProxy = 9B2B284C2F27B08C57FFC9EE798CE2AB /* PBXContainerItemProxy */;\n\t\t};\n\t\tF5E4336F7DB15BFD3731353A54108BFC /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = URLNavigator;\n\t\t\ttarget = C76585AF9502709B32A11133189DDA23 /* URLNavigator */;\n\t\t\ttargetProxy = 9FCB8BF28633D811B92390B57E58E0F8 /* PBXContainerItemProxy */;\n\t\t};\n\t\tFD527F145232A0C224EE6A40F67AB20C /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = Moya;\n\t\t\ttarget = D382A7B90B59D72908CC21054785B020 /* Moya */;\n\t\t\ttargetProxy = C8D1C0BFABDA878088C177C8EE78FF8A /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\t0042C2BDBEB9CD6E7C180ACEDF7F3230 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = DB2A4AE8B923CFBB0D0531CB91C712CE /* MJRefresh.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/MJRefresh/MJRefresh-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/MJRefresh/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/MJRefresh/MJRefresh.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_NAME = MJRefresh;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t0149886A2ED9ED38B90DCC0CB07F5228 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 319F0938C83A11D7010E8A6B1A8BC27E /* ReactorKit.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/ReactorKit/ReactorKit-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/ReactorKit/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/ReactorKit/ReactorKit.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_NAME = ReactorKit;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t0667D7072671234E32C33BAE8737DA70 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 268594CEB578B4D18F4F1B30652F617B /* URLNavigator.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/URLNavigator/URLNavigator-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/URLNavigator/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/URLNavigator/URLNavigator.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_NAME = URLNavigator;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t07E925C481DDD32B742C8B0D765D951D /* 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;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES;\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_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGNING_REQUIRED = NO;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"POD_CONFIGURATION_RELEASE=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;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\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 = 9.1;\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSYMROOT = \"${SRCROOT}/../build\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t086A5FDC58C99AFB20FA815843EE41DE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 41B3ACB613105C496C9AA802C306A439 /* RxGesture.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/RxGesture/RxGesture-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/RxGesture/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/RxGesture/RxGesture.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_NAME = RxGesture;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t0A523BF1DE09BDF5626D574CC59B658E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9CEA02DF9281493AB02811A381B532ED /* TYCyclePagerView.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/TYCyclePagerView/TYCyclePagerView-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/TYCyclePagerView/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/TYCyclePagerView/TYCyclePagerView.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_NAME = TYCyclePagerView;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t10081673734687833D9A3EE73A4C28AA /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 41B3ACB613105C496C9AA802C306A439 /* RxGesture.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/RxGesture/RxGesture-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/RxGesture/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/RxGesture/RxGesture.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_NAME = RxGesture;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t165696DD5DC4E8A99EB8459726B5F42E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 4E295D0CB7D2F465413AC6086CBF8C49 /* SwiftyJSON.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/SwiftyJSON/SwiftyJSON-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/SwiftyJSON/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/SwiftyJSON/SwiftyJSON.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_NAME = SwiftyJSON;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t211EA9C8BE0D10435468E86A282A9AD9 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 8D3F2B09E35E2D2EFA58CB9D9261E7D0 /* NSObject+Rx.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/NSObject+Rx/NSObject+Rx-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/NSObject+Rx/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/NSObject+Rx/NSObject+Rx.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_NAME = NSObject_Rx;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t23E8F2106453B25411BBD59AD634697F /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = E168570235239A51FCD669B5E01BD944 /* TTRangeSlider.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/TTRangeSlider/TTRangeSlider-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/TTRangeSlider/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/TTRangeSlider/TTRangeSlider.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_NAME = TTRangeSlider;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t2529F6EDCBF2615DE21E47D137D4283B /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 50A9B85F6C0935020B51702CEF26AC84 /* TYPagerController.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/TYPagerController/TYPagerController-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/TYPagerController/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/TYPagerController/TYPagerController.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_NAME = TYPagerController;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t29804FEF0B8246EFF6ED65D0F799AEA3 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9D52DB027375B4BF6987825A6BF5751B /* RxAlamofire.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/RxAlamofire/RxAlamofire-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/RxAlamofire/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/RxAlamofire/RxAlamofire.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_NAME = RxAlamofire;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t2E15E9C97438ACF0A953E95909C87920 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 8D9FE6C7F2AC2C3319C58D4272FD52C1 /* IQKeyboardManagerSwift.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/IQKeyboardManagerSwift/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_NAME = IQKeyboardManagerSwift;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t33E464B02591D1161D80223BA28CA6F7 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 82C7B1F1647EBCD9A81E7A2788701631 /* SnapKit.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/SnapKit/SnapKit-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/SnapKit/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/SnapKit/SnapKit.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_NAME = SnapKit;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t34DFB997862DE04F29457821E6B6FD62 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 4E295D0CB7D2F465413AC6086CBF8C49 /* SwiftyJSON.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/SwiftyJSON/SwiftyJSON-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/SwiftyJSON/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/SwiftyJSON/SwiftyJSON.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_NAME = SwiftyJSON;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t34F671C601072D988FC80B795FE6B097 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = A222328DE93D544E711805351EB49909 /* RxDataSources.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/RxDataSources/RxDataSources-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/RxDataSources/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/RxDataSources/RxDataSources.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_NAME = RxDataSources;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t3D87FE564C17E455688A363472861A61 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 28FD4835CF32D5E0B1A2A3753A09DBB0 /* Moya.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/Moya/Moya-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Moya/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Moya/Moya.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_NAME = Moya;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t441300C5FC4B5A08DA02C97A98A9AC30 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9855A9C6CDDA35414C161F75BED8B6F8 /* Alamofire.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/Alamofire/Alamofire-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Alamofire/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Alamofire/Alamofire.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_NAME = Alamofire;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t45A8AEE01E68294DAB97CD528C053793 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 40C89EACDC9DB733AEDA2C1858349B05 /* ObjectMapper.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/ObjectMapper/ObjectMapper-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/ObjectMapper/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/ObjectMapper/ObjectMapper.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_NAME = ObjectMapper;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t4C06BA85D970A101C292FA1B42B916A0 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 716F007B040C0CDD77F14CF5209FEE01 /* Pods-RxXMLY.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Pods-RxXMLY/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.1;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACH_O_TYPE = staticlib;\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Pods-RxXMLY/Pods-RxXMLY.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPODS_ROOT = \"$(SRCROOT)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tPRODUCT_NAME = Pods_RxXMLY;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t4C8DEDD19177C04E0FAFD07889C79A77 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = E168570235239A51FCD669B5E01BD944 /* TTRangeSlider.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/TTRangeSlider/TTRangeSlider-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/TTRangeSlider/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/TTRangeSlider/TTRangeSlider.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_NAME = TTRangeSlider;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t536A4065D0055B28FCC2536BA827FBC6 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 50A9B85F6C0935020B51702CEF26AC84 /* TYPagerController.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/TYPagerController/TYPagerController-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/TYPagerController/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/TYPagerController/TYPagerController.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_NAME = TYPagerController;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t57A92DFDF0A03B32F5C887C772B20A22 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = EC5D50260AEE66CC8FD97C3CF9E10E7F /* Then.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/Then/Then-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Then/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Then/Then.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_NAME = Then;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t5E7A444B4E19CE3ABF2C4097953E4C54 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = DB2A4AE8B923CFBB0D0531CB91C712CE /* MJRefresh.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/MJRefresh/MJRefresh-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/MJRefresh/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/MJRefresh/MJRefresh.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_NAME = MJRefresh;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t6292F718E229B9D83E841718720DD31B /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 0A8EF0EB23267E967663F5FA5A8E7686 /* RxSwift.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/RxSwift/RxSwift-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/RxSwift/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/RxSwift/RxSwift.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_NAME = RxSwift;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t65AEE624D7D47405E3498E228DB2FDAA /* 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;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES;\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_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGNING_REQUIRED = NO;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"POD_CONFIGURATION_DEBUG=1\",\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_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\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 = 9.1;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/;\n\t\t\t\tSTRIP_INSTALLED_PRODUCT = NO;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSYMROOT = \"${SRCROOT}/../build\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t68875726E361E4D5EE55450A0565AE5E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 28FD4835CF32D5E0B1A2A3753A09DBB0 /* Moya.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/Moya/Moya-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Moya/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Moya/Moya.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_NAME = Moya;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t694AA0C88B645D5A0D978E74AA494B72 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 02242206E1BBE2B18A7CA031B7102D98 /* Differentiator.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/Differentiator/Differentiator-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Differentiator/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Differentiator/Differentiator.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_NAME = Differentiator;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t6BBACD06F1E5984EAC3428F9093A8573 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = B013E2FF6D44578E3E483B417504DD8F /* ReusableKit.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/ReusableKit/ReusableKit-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/ReusableKit/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/ReusableKit/ReusableKit.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_NAME = ReusableKit;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t78F2DC967C87777534BEEC714E8BD1E0 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9D52DB027375B4BF6987825A6BF5751B /* RxAlamofire.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/RxAlamofire/RxAlamofire-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/RxAlamofire/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/RxAlamofire/RxAlamofire.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_NAME = RxAlamofire;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B4DBB05E401008022849E9B6A9AF714 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AA6F3E86B6FCC86A1E5A52F243EE56D /* SwiftyColor.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/SwiftyColor/SwiftyColor-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/SwiftyColor/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/SwiftyColor/SwiftyColor.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_NAME = SwiftyColor;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t81E3EC0CBC30A01E8D29789CFAE9F399 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 3F697E60BD60ED1A4604DA7BF8581AB1 /* Pods-RxXMLY.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Pods-RxXMLY/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.1;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMACH_O_TYPE = staticlib;\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Pods-RxXMLY/Pods-RxXMLY.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tOTHER_LDFLAGS = \"\";\n\t\t\t\tOTHER_LIBTOOLFLAGS = \"\";\n\t\t\t\tPODS_ROOT = \"$(SRCROOT)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\";\n\t\t\t\tPRODUCT_NAME = Pods_RxXMLY;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t8B75AF8EE7468D85BDC95BF5356A6B48 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 0A8EF0EB23267E967663F5FA5A8E7686 /* RxSwift.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/RxSwift/RxSwift-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/RxSwift/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/RxSwift/RxSwift.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_NAME = RxSwift;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t93374469E11255902CAA7DD4CB27A692 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 40C89EACDC9DB733AEDA2C1858349B05 /* ObjectMapper.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/ObjectMapper/ObjectMapper-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/ObjectMapper/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/ObjectMapper/ObjectMapper.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_NAME = ObjectMapper;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t9359037A8F209948A0C05BE187F3F89F /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 8A5ABA18A2D1A61A185ED12DF70B8F30 /* Result.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/Result/Result-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Result/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Result/Result.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_NAME = Result;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t93D684927DE728E6F82AB56702FC59F2 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = B6DD7C62D3975725987453F154E89E03 /* Kingfisher.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/Kingfisher/Kingfisher-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Kingfisher/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Kingfisher/Kingfisher.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_NAME = Kingfisher;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t9DDE49D82AFCF60FECAA422AA55ED0E6 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 7AA6F3E86B6FCC86A1E5A52F243EE56D /* SwiftyColor.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/SwiftyColor/SwiftyColor-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/SwiftyColor/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/SwiftyColor/SwiftyColor.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_NAME = SwiftyColor;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tA46F53241451B8AA7DF21F81C4C1EE1B /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = A222328DE93D544E711805351EB49909 /* RxDataSources.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/RxDataSources/RxDataSources-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/RxDataSources/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/RxDataSources/RxDataSources.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_NAME = RxDataSources;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tA516FB1A3CF0C0E38E6E12023BE62772 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9855A9C6CDDA35414C161F75BED8B6F8 /* Alamofire.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/Alamofire/Alamofire-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Alamofire/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Alamofire/Alamofire.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_NAME = Alamofire;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tA9B73D0C39ADC5559CCF5B20A1CE4053 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 8D3F2B09E35E2D2EFA58CB9D9261E7D0 /* NSObject+Rx.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/NSObject+Rx/NSObject+Rx-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/NSObject+Rx/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/NSObject+Rx/NSObject+Rx.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_NAME = NSObject_Rx;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tBAF9A20A5B0B25A6F56D6CF4C427B72F /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 319F0938C83A11D7010E8A6B1A8BC27E /* ReactorKit.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/ReactorKit/ReactorKit-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/ReactorKit/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/ReactorKit/ReactorKit.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_NAME = ReactorKit;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tBB895A8B8C5E6F6144E3E40F6BDE4051 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 02242206E1BBE2B18A7CA031B7102D98 /* Differentiator.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/Differentiator/Differentiator-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Differentiator/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Differentiator/Differentiator.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_NAME = Differentiator;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tC4DDADE7FC0CC645D75299F75A9ACF65 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 9CEA02DF9281493AB02811A381B532ED /* TYCyclePagerView.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/TYCyclePagerView/TYCyclePagerView-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/TYCyclePagerView/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/TYCyclePagerView/TYCyclePagerView.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_NAME = TYCyclePagerView;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tCB6CE1072EC77BB7ADBBC0F4F6A24078 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 351B9B4056B3818966E04C76590FC3B7 /* RxCocoa.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/RxCocoa/RxCocoa-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/RxCocoa/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/RxCocoa/RxCocoa.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_NAME = RxCocoa;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD142C161ECF4956E8ADB991690FCAD39 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 351B9B4056B3818966E04C76590FC3B7 /* RxCocoa.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/RxCocoa/RxCocoa-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/RxCocoa/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/RxCocoa/RxCocoa.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_NAME = RxCocoa;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tD88A3909EE1F5CD04C59F0E32C9B8592 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 8D9FE6C7F2AC2C3319C58D4272FD52C1 /* IQKeyboardManagerSwift.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/IQKeyboardManagerSwift/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_NAME = IQKeyboardManagerSwift;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD8EA526A6238854CEBFF0440AE6D0BEF /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = EC5D50260AEE66CC8FD97C3CF9E10E7F /* Then.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/Then/Then-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Then/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Then/Then.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_NAME = Then;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tE32C7F392C5CF839D49F222FB81B23A0 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = B013E2FF6D44578E3E483B417504DD8F /* ReusableKit.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/ReusableKit/ReusableKit-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/ReusableKit/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/ReusableKit/ReusableKit.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_NAME = ReusableKit;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tEB18C0ABDA9FBD6260148AE14861F47D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 8A5ABA18A2D1A61A185ED12DF70B8F30 /* Result.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/Result/Result-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Result/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Result/Result.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_NAME = Result;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tEFD3CA7A881278528426A95F79CD1C07 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 82C7B1F1647EBCD9A81E7A2788701631 /* SnapKit.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/SnapKit/SnapKit-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/SnapKit/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/SnapKit/SnapKit.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tPRODUCT_NAME = SnapKit;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tF277A68C2ED70936C636EC5B204AB50E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 268594CEB578B4D18F4F1B30652F617B /* URLNavigator.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/URLNavigator/URLNavigator-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/URLNavigator/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/URLNavigator/URLNavigator.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_NAME = URLNavigator;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tF65473631C6DA6653F95FF57B7FCB48C /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = B6DD7C62D3975725987453F154E89E03 /* Kingfisher.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=watchos*]\" = \"\";\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_PREFIX_HEADER = \"Target Support Files/Kingfisher/Kingfisher-prefix.pch\";\n\t\t\t\tINFOPLIST_FILE = \"Target Support Files/Kingfisher/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tMODULEMAP_FILE = \"Target Support Files/Kingfisher/Kingfisher.modulemap\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_NAME = Kingfisher;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) \";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t0C3A2D1670AC6E68C80F257B426F3A29 /* Build configuration list for PBXNativeTarget \"TTRangeSlider\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t23E8F2106453B25411BBD59AD634697F /* Debug */,\n\t\t\t\t4C8DEDD19177C04E0FAFD07889C79A77 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t0D42361BF39A06A081758B64C4D8FB8D /* Build configuration list for PBXNativeTarget \"ReusableKit\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t6BBACD06F1E5984EAC3428F9093A8573 /* Debug */,\n\t\t\t\tE32C7F392C5CF839D49F222FB81B23A0 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t1EFADDC2BB6831ED43B76E0241CCDB75 /* Build configuration list for PBXNativeTarget \"MJRefresh\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t5E7A444B4E19CE3ABF2C4097953E4C54 /* Debug */,\n\t\t\t\t0042C2BDBEB9CD6E7C180ACEDF7F3230 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t23CFD86DE455F2B998EC09D589DA285D /* Build configuration list for PBXNativeTarget \"ObjectMapper\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t45A8AEE01E68294DAB97CD528C053793 /* Debug */,\n\t\t\t\t93374469E11255902CAA7DD4CB27A692 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject \"Pods\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t65AEE624D7D47405E3498E228DB2FDAA /* Debug */,\n\t\t\t\t07E925C481DDD32B742C8B0D765D951D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t3371F7E9117E31C177556E75F3A0EBB0 /* Build configuration list for PBXNativeTarget \"Pods-RxXMLY\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t4C06BA85D970A101C292FA1B42B916A0 /* Debug */,\n\t\t\t\t81E3EC0CBC30A01E8D29789CFAE9F399 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t419E5D95491847CD79841B971A8A3277 /* Build configuration list for PBXNativeTarget \"Alamofire\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tA516FB1A3CF0C0E38E6E12023BE62772 /* Debug */,\n\t\t\t\t441300C5FC4B5A08DA02C97A98A9AC30 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t512FD626A7E3FC83C9CC8A24144BC92B /* Build configuration list for PBXNativeTarget \"SwiftyColor\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t9DDE49D82AFCF60FECAA422AA55ED0E6 /* Debug */,\n\t\t\t\t7B4DBB05E401008022849E9B6A9AF714 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t52DD4DD837C8F96EF786BB17F1227792 /* Build configuration list for PBXNativeTarget \"RxCocoa\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tCB6CE1072EC77BB7ADBBC0F4F6A24078 /* Debug */,\n\t\t\t\tD142C161ECF4956E8ADB991690FCAD39 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t554EA923463767BCA4352E1E6C624685 /* Build configuration list for PBXNativeTarget \"Result\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t9359037A8F209948A0C05BE187F3F89F /* Debug */,\n\t\t\t\tEB18C0ABDA9FBD6260148AE14861F47D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t55B1DC46A281606C5A8A2F5953589206 /* Build configuration list for PBXNativeTarget \"Then\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t57A92DFDF0A03B32F5C887C772B20A22 /* Debug */,\n\t\t\t\tD8EA526A6238854CEBFF0440AE6D0BEF /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t5A05DD5251EAD538258DF17673557953 /* Build configuration list for PBXNativeTarget \"URLNavigator\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t0667D7072671234E32C33BAE8737DA70 /* Debug */,\n\t\t\t\tF277A68C2ED70936C636EC5B204AB50E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t6252E31AF78FAB4E0F676126FABEADB5 /* Build configuration list for PBXNativeTarget \"NSObject+Rx\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t211EA9C8BE0D10435468E86A282A9AD9 /* Debug */,\n\t\t\t\tA9B73D0C39ADC5559CCF5B20A1CE4053 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t63A8CDD2A9A34DC6C67006A603063404 /* Build configuration list for PBXNativeTarget \"RxAlamofire\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t29804FEF0B8246EFF6ED65D0F799AEA3 /* Debug */,\n\t\t\t\t78F2DC967C87777534BEEC714E8BD1E0 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t697E3CDF0A55702AF195B90A1000CA13 /* Build configuration list for PBXNativeTarget \"Differentiator\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tBB895A8B8C5E6F6144E3E40F6BDE4051 /* Debug */,\n\t\t\t\t694AA0C88B645D5A0D978E74AA494B72 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t6B1519F70E09D2830A7F592841F05038 /* Build configuration list for PBXNativeTarget \"TYPagerController\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t2529F6EDCBF2615DE21E47D137D4283B /* Debug */,\n\t\t\t\t536A4065D0055B28FCC2536BA827FBC6 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t704D48507B0C8F42CE3629D21F48652A /* Build configuration list for PBXNativeTarget \"SwiftyJSON\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t34DFB997862DE04F29457821E6B6FD62 /* Debug */,\n\t\t\t\t165696DD5DC4E8A99EB8459726B5F42E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7CEE893A728FE595E38B19DA5C14A481 /* Build configuration list for PBXNativeTarget \"TYCyclePagerView\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t0A523BF1DE09BDF5626D574CC59B658E /* Debug */,\n\t\t\t\tC4DDADE7FC0CC645D75299F75A9ACF65 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t860035FE08E0668CFA26227D241C13AC /* Build configuration list for PBXNativeTarget \"RxSwift\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t8B75AF8EE7468D85BDC95BF5356A6B48 /* Debug */,\n\t\t\t\t6292F718E229B9D83E841718720DD31B /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t8C1E4CEFB2390CBE75E70BAC20F44BBF /* Build configuration list for PBXNativeTarget \"Kingfisher\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t93D684927DE728E6F82AB56702FC59F2 /* Debug */,\n\t\t\t\tF65473631C6DA6653F95FF57B7FCB48C /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t8E2F09332A7598018177CF140EEDFC0E /* Build configuration list for PBXNativeTarget \"Moya\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t3D87FE564C17E455688A363472861A61 /* Debug */,\n\t\t\t\t68875726E361E4D5EE55450A0565AE5E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t90DBC69F7407A38678F533AF966E180A /* Build configuration list for PBXNativeTarget \"ReactorKit\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tBAF9A20A5B0B25A6F56D6CF4C427B72F /* Debug */,\n\t\t\t\t0149886A2ED9ED38B90DCC0CB07F5228 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tAD3D5B9E24ECB0D75B3E0294644E66D1 /* Build configuration list for PBXNativeTarget \"SnapKit\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tEFD3CA7A881278528426A95F79CD1C07 /* Debug */,\n\t\t\t\t33E464B02591D1161D80223BA28CA6F7 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tBD5CCA9B364C93A19C3C8B5200B7D56A /* Build configuration list for PBXNativeTarget \"RxDataSources\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tA46F53241451B8AA7DF21F81C4C1EE1B /* Debug */,\n\t\t\t\t34F671C601072D988FC80B795FE6B097 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tC5214E85BC32F855BB77F4FD74672338 /* Build configuration list for PBXNativeTarget \"RxGesture\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t10081673734687833D9A3EE73A4C28AA /* Debug */,\n\t\t\t\t086A5FDC58C99AFB20FA815843EE41DE /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tE8C5CE05A712EF50BB123A41D8EFC0CB /* Build configuration list for PBXNativeTarget \"IQKeyboardManagerSwift\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD88A3909EE1F5CD04C59F0E32C9B8592 /* Debug */,\n\t\t\t\t2E15E9C97438ACF0A953E95909C87920 /* 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 = D41D8CD98F00B204E9800998ECF8427E /* Project object */;\n}\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/xcuserdata/sessionCh.xcuserdatad/xcschemes/Alamofire.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"88E9EC28B8B46C3631E6B242B50F4442\"\n               BuildableName = \"Alamofire.framework\"\n               BlueprintName = \"Alamofire\"\n               ReferencedContainer = \"container:Pods.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"88E9EC28B8B46C3631E6B242B50F4442\"\n            BuildableName = \"Alamofire.framework\"\n            BlueprintName = \"Alamofire\"\n            ReferencedContainer = \"container:Pods.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/xcuserdata/sessionCh.xcuserdatad/xcschemes/Differentiator.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"844C9B244CEFA2F26288789C423101B4\"\n               BuildableName = \"Differentiator.framework\"\n               BlueprintName = \"Differentiator\"\n               ReferencedContainer = \"container:Pods.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"844C9B244CEFA2F26288789C423101B4\"\n            BuildableName = \"Differentiator.framework\"\n            BlueprintName = \"Differentiator\"\n            ReferencedContainer = \"container:Pods.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/xcuserdata/sessionCh.xcuserdatad/xcschemes/IQKeyboardManagerSwift.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"C235F77E101E742652CCF98FFDFA5182\"\n               BuildableName = \"IQKeyboardManagerSwift.framework\"\n               BlueprintName = \"IQKeyboardManagerSwift\"\n               ReferencedContainer = \"container:Pods.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"C235F77E101E742652CCF98FFDFA5182\"\n            BuildableName = \"IQKeyboardManagerSwift.framework\"\n            BlueprintName = \"IQKeyboardManagerSwift\"\n            ReferencedContainer = \"container:Pods.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/xcuserdata/sessionCh.xcuserdatad/xcschemes/Kingfisher.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"6F712943B3C5592E82604940D11CE08A\"\n               BuildableName = \"Kingfisher.framework\"\n               BlueprintName = \"Kingfisher\"\n               ReferencedContainer = \"container:Pods.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"6F712943B3C5592E82604940D11CE08A\"\n            BuildableName = \"Kingfisher.framework\"\n            BlueprintName = \"Kingfisher\"\n            ReferencedContainer = \"container:Pods.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/xcuserdata/sessionCh.xcuserdatad/xcschemes/MJRefresh.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"E14A62900910444707A5504D25EC98DC\"\n               BuildableName = \"MJRefresh.framework\"\n               BlueprintName = \"MJRefresh\"\n               ReferencedContainer = \"container:Pods.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"E14A62900910444707A5504D25EC98DC\"\n            BuildableName = \"MJRefresh.framework\"\n            BlueprintName = \"MJRefresh\"\n            ReferencedContainer = \"container:Pods.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/xcuserdata/sessionCh.xcuserdatad/xcschemes/Moya.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"D382A7B90B59D72908CC21054785B020\"\n               BuildableName = \"Moya.framework\"\n               BlueprintName = \"Moya\"\n               ReferencedContainer = \"container:Pods.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"D382A7B90B59D72908CC21054785B020\"\n            BuildableName = \"Moya.framework\"\n            BlueprintName = \"Moya\"\n            ReferencedContainer = \"container:Pods.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/xcuserdata/sessionCh.xcuserdatad/xcschemes/NSObject+Rx.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"64CC9E274EBD6C16C53FC82EAA6FE9E7\"\n               BuildableName = \"NSObject_Rx.framework\"\n               BlueprintName = \"NSObject+Rx\"\n               ReferencedContainer = \"container:Pods.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"64CC9E274EBD6C16C53FC82EAA6FE9E7\"\n            BuildableName = \"NSObject_Rx.framework\"\n            BlueprintName = \"NSObject+Rx\"\n            ReferencedContainer = \"container:Pods.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/xcuserdata/sessionCh.xcuserdatad/xcschemes/ObjectMapper.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"CD6C9FB6B052E1CF663F8A56041EA163\"\n               BuildableName = \"ObjectMapper.framework\"\n               BlueprintName = \"ObjectMapper\"\n               ReferencedContainer = \"container:Pods.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"CD6C9FB6B052E1CF663F8A56041EA163\"\n            BuildableName = \"ObjectMapper.framework\"\n            BlueprintName = \"ObjectMapper\"\n            ReferencedContainer = \"container:Pods.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/xcuserdata/sessionCh.xcuserdatad/xcschemes/Pods-RxXMLY.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"8CB60D59ADD2D72FCB9566114EE33B9A\"\n               BuildableName = \"Pods_RxXMLY.framework\"\n               BlueprintName = \"Pods-RxXMLY\"\n               ReferencedContainer = \"container:Pods.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"8CB60D59ADD2D72FCB9566114EE33B9A\"\n            BuildableName = \"Pods_RxXMLY.framework\"\n            BlueprintName = \"Pods-RxXMLY\"\n            ReferencedContainer = \"container:Pods.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/xcuserdata/sessionCh.xcuserdatad/xcschemes/ReactorKit.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"0F6A8E28D6C2CC2BCA0477C6AF7137F2\"\n               BuildableName = \"ReactorKit.framework\"\n               BlueprintName = \"ReactorKit\"\n               ReferencedContainer = \"container:Pods.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"0F6A8E28D6C2CC2BCA0477C6AF7137F2\"\n            BuildableName = \"ReactorKit.framework\"\n            BlueprintName = \"ReactorKit\"\n            ReferencedContainer = \"container:Pods.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/xcuserdata/sessionCh.xcuserdatad/xcschemes/Result.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"1C61647CEE01897368F5D0D2CC181DB4\"\n               BuildableName = \"Result.framework\"\n               BlueprintName = \"Result\"\n               ReferencedContainer = \"container:Pods.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"1C61647CEE01897368F5D0D2CC181DB4\"\n            BuildableName = \"Result.framework\"\n            BlueprintName = \"Result\"\n            ReferencedContainer = \"container:Pods.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/xcuserdata/sessionCh.xcuserdatad/xcschemes/ReusableKit.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"524DC20BC58D4BDA1F0C77763DFA70BE\"\n               BuildableName = \"ReusableKit.framework\"\n               BlueprintName = \"ReusableKit\"\n               ReferencedContainer = \"container:Pods.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"524DC20BC58D4BDA1F0C77763DFA70BE\"\n            BuildableName = \"ReusableKit.framework\"\n            BlueprintName = \"ReusableKit\"\n            ReferencedContainer = \"container:Pods.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/xcuserdata/sessionCh.xcuserdatad/xcschemes/RxAlamofire.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"2166B105EDC9D2499513E6D6BCD586C2\"\n               BuildableName = \"RxAlamofire.framework\"\n               BlueprintName = \"RxAlamofire\"\n               ReferencedContainer = \"container:Pods.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"2166B105EDC9D2499513E6D6BCD586C2\"\n            BuildableName = \"RxAlamofire.framework\"\n            BlueprintName = \"RxAlamofire\"\n            ReferencedContainer = \"container:Pods.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/xcuserdata/sessionCh.xcuserdatad/xcschemes/RxCocoa.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"1F5BFD2D8E3672CE19EA16B5208A4066\"\n               BuildableName = \"RxCocoa.framework\"\n               BlueprintName = \"RxCocoa\"\n               ReferencedContainer = \"container:Pods.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"1F5BFD2D8E3672CE19EA16B5208A4066\"\n            BuildableName = \"RxCocoa.framework\"\n            BlueprintName = \"RxCocoa\"\n            ReferencedContainer = \"container:Pods.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/xcuserdata/sessionCh.xcuserdatad/xcschemes/RxDataSources.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"F05F33A12963EC1A726FEE15D9000AE2\"\n               BuildableName = \"RxDataSources.framework\"\n               BlueprintName = \"RxDataSources\"\n               ReferencedContainer = \"container:Pods.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"F05F33A12963EC1A726FEE15D9000AE2\"\n            BuildableName = \"RxDataSources.framework\"\n            BlueprintName = \"RxDataSources\"\n            ReferencedContainer = \"container:Pods.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/xcuserdata/sessionCh.xcuserdatad/xcschemes/RxGesture.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"B496A58A7B812A10E0039E15EDF0E8EE\"\n               BuildableName = \"RxGesture.framework\"\n               BlueprintName = \"RxGesture\"\n               ReferencedContainer = \"container:Pods.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"B496A58A7B812A10E0039E15EDF0E8EE\"\n            BuildableName = \"RxGesture.framework\"\n            BlueprintName = \"RxGesture\"\n            ReferencedContainer = \"container:Pods.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/xcuserdata/sessionCh.xcuserdatad/xcschemes/RxSwift.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"371551DFD98A9103D43168E4BD0479F0\"\n               BuildableName = \"RxSwift.framework\"\n               BlueprintName = \"RxSwift\"\n               ReferencedContainer = \"container:Pods.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"371551DFD98A9103D43168E4BD0479F0\"\n            BuildableName = \"RxSwift.framework\"\n            BlueprintName = \"RxSwift\"\n            ReferencedContainer = \"container:Pods.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/xcuserdata/sessionCh.xcuserdatad/xcschemes/SnapKit.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"8E38AFA40EB24AAD3998F3F9CFB12CA3\"\n               BuildableName = \"SnapKit.framework\"\n               BlueprintName = \"SnapKit\"\n               ReferencedContainer = \"container:Pods.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"8E38AFA40EB24AAD3998F3F9CFB12CA3\"\n            BuildableName = \"SnapKit.framework\"\n            BlueprintName = \"SnapKit\"\n            ReferencedContainer = \"container:Pods.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/xcuserdata/sessionCh.xcuserdatad/xcschemes/SwiftyColor.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"93FD28A3DC61A9094248D0D96CAD9FD4\"\n               BuildableName = \"SwiftyColor.framework\"\n               BlueprintName = \"SwiftyColor\"\n               ReferencedContainer = \"container:Pods.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"93FD28A3DC61A9094248D0D96CAD9FD4\"\n            BuildableName = \"SwiftyColor.framework\"\n            BlueprintName = \"SwiftyColor\"\n            ReferencedContainer = \"container:Pods.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/xcuserdata/sessionCh.xcuserdatad/xcschemes/SwiftyJSON.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"DE874A99677D06A11E5FCC43C238A7D5\"\n               BuildableName = \"SwiftyJSON.framework\"\n               BlueprintName = \"SwiftyJSON\"\n               ReferencedContainer = \"container:Pods.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"DE874A99677D06A11E5FCC43C238A7D5\"\n            BuildableName = \"SwiftyJSON.framework\"\n            BlueprintName = \"SwiftyJSON\"\n            ReferencedContainer = \"container:Pods.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/xcuserdata/sessionCh.xcuserdatad/xcschemes/TTRangeSlider.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"E86A9F4C831EEE122A82C7CE19D4011B\"\n               BuildableName = \"TTRangeSlider.framework\"\n               BlueprintName = \"TTRangeSlider\"\n               ReferencedContainer = \"container:Pods.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"E86A9F4C831EEE122A82C7CE19D4011B\"\n            BuildableName = \"TTRangeSlider.framework\"\n            BlueprintName = \"TTRangeSlider\"\n            ReferencedContainer = \"container:Pods.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/xcuserdata/sessionCh.xcuserdatad/xcschemes/TYCyclePagerView.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"0B620384669DABB34C3C5B96EA60F12A\"\n               BuildableName = \"TYCyclePagerView.framework\"\n               BlueprintName = \"TYCyclePagerView\"\n               ReferencedContainer = \"container:Pods.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"0B620384669DABB34C3C5B96EA60F12A\"\n            BuildableName = \"TYCyclePagerView.framework\"\n            BlueprintName = \"TYCyclePagerView\"\n            ReferencedContainer = \"container:Pods.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/xcuserdata/sessionCh.xcuserdatad/xcschemes/TYPagerController.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"CCEEA2E517C9CB166C75BAF4A263A7CF\"\n               BuildableName = \"TYPagerController.framework\"\n               BlueprintName = \"TYPagerController\"\n               ReferencedContainer = \"container:Pods.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"CCEEA2E517C9CB166C75BAF4A263A7CF\"\n            BuildableName = \"TYPagerController.framework\"\n            BlueprintName = \"TYPagerController\"\n            ReferencedContainer = \"container:Pods.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/xcuserdata/sessionCh.xcuserdatad/xcschemes/Then.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"2D5C20681FC0A1E18576D4673D0EFE65\"\n               BuildableName = \"Then.framework\"\n               BlueprintName = \"Then\"\n               ReferencedContainer = \"container:Pods.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"2D5C20681FC0A1E18576D4673D0EFE65\"\n            BuildableName = \"Then.framework\"\n            BlueprintName = \"Then\"\n            ReferencedContainer = \"container:Pods.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/xcuserdata/sessionCh.xcuserdatad/xcschemes/URLNavigator.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"C76585AF9502709B32A11133189DDA23\"\n               BuildableName = \"URLNavigator.framework\"\n               BlueprintName = \"URLNavigator\"\n               ReferencedContainer = \"container:Pods.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"C76585AF9502709B32A11133189DDA23\"\n            BuildableName = \"URLNavigator.framework\"\n            BlueprintName = \"URLNavigator\"\n            ReferencedContainer = \"container:Pods.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Pods/Pods.xcodeproj/xcuserdata/sessionCh.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>Alamofire.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>isShown</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<key>Differentiator.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>isShown</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<key>IQKeyboardManagerSwift.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>isShown</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<key>Kingfisher.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>isShown</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<key>MJRefresh.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>isShown</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<key>Moya.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>isShown</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<key>NSObject+Rx.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>isShown</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<key>ObjectMapper.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>isShown</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<key>Pods-RxXMLY.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>isShown</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<key>ReactorKit.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>isShown</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<key>Result.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>isShown</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<key>ReusableKit.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>isShown</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<key>RxAlamofire.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>isShown</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<key>RxCocoa.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>isShown</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<key>RxDataSources.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>isShown</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<key>RxGesture.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>isShown</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<key>RxSwift.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>isShown</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<key>SnapKit.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>isShown</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<key>SwiftyColor.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>isShown</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<key>SwiftyJSON.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>isShown</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<key>TTRangeSlider.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>isShown</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<key>TYCyclePagerView.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>isShown</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<key>TYPagerController.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>isShown</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<key>Then.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>isShown</key>\n\t\t\t<false/>\n\t\t</dict>\n\t\t<key>URLNavigator.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>isShown</key>\n\t\t\t<false/>\n\t\t</dict>\n\t</dict>\n\t<key>SuppressBuildableAutocreation</key>\n\t<dict/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/ReactorKit/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2017 Suyeol Jeon (xoul.kr)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Pods/ReactorKit/README.md",
    "content": "<img alt=\"ReactorKit\" src=\"https://cloud.githubusercontent.com/assets/931655/25277625/6aa05998-26da-11e7-9b85-e48bec938a6e.png\" style=\"max-width: 100%\">\n\n<p align=\"center\">\n  <img alt=\"Swift\" src=\"https://img.shields.io/badge/Swift-4.0-orange.svg\">\n  <a href=\"https://cocoapods.org/pods/ReactorKit\" target=\"_blank\">\n    <img alt=\"CocoaPods\" src=\"http://img.shields.io/cocoapods/v/ReactorKit.svg\">\n  </a>\n  <a href=\"https://github.com/ReactorKit/ReactorKit\" target=\"_blank\">\n    <img alt=\"Platform\" src=\"https://img.shields.io/cocoapods/p/ReactorKit.svg?style=flat\">\n  </a>\n  <a href=\"https://travis-ci.org/ReactorKit/ReactorKit\" target=\"_blank\">\n    <img alt=\"Build Status\" src=\"https://travis-ci.org/ReactorKit/ReactorKit.svg?branch=master\">\n  </a>\n  <a href=\"https://codecov.io/gh/ReactorKit/ReactorKit/\" target=\"_blank\">\n    <img alt=\"Codecov\" src=\"https://img.shields.io/codecov/c/github/ReactorKit/ReactorKit.svg\">\n  </a>\n  <a href=\"http://reactorkit.io/docs/latest/\" target=\"_blank\">\n    <img alt=\"CocoaDocs\" src=\"http://reactorkit.io/docs/latest/badge.svg\">\n  </a>\n</p>\n\nReactorKit is a framework for a reactive and unidirectional Swift application architecture. This repository introduces the basic concept of ReactorKit and describes how to build an application using ReactorKit.\n\nYou may want to see the [Examples](#examples) section first if you'd like to see the actual code. Visit the [API Reference](http://reactorkit.io/docs/latest/) for code-level documentation.\n\n## Table of Contents\n\n* [Basic Concept](#basic-concept)\n    * [Design Goal](#design-goal)\n    * [View](#view)\n    * [Reactor](#reactor)\n* [Advanced](#advanced)\n    * [Service](#service)\n    * [Global States](#global-states)\n    * [View Communication](#view-communication)\n    * [Testing](#testing)\n* [Conventions](#conventions)\n* [Examples](#examples)\n* [Dependencies](#dependencies)\n* [Requirements](#requirements)\n* [Installation](#installation)\n* [Contributing](#contribution)\n* [Community](#community)\n* [Who's using ReactorKit](#whos-using-reactorkit)\n* [Changelog](#changelog)\n* [License](#license)\n\n## Basic Concept\n\nReactorKit is a combination of [Flux](https://facebook.github.io/flux/) and [Reactive Programming](https://en.wikipedia.org/wiki/Reactive_programming). The user actions and the view states are delivered to each layer via observable streams. These streams are unidirectional: the view can only emit actions and the reactor can only emit states.\n\n<p align=\"center\">\n  <img alt=\"flow\" src=\"https://cloud.githubusercontent.com/assets/931655/25073432/a91c1688-2321-11e7-8f04-bf91031a09dd.png\" width=\"600\">\n</p>\n\n### Design Goal\n\n* **Testability**: The first purpose of ReactorKit is to separate the business logic from a view. This can make the code testable. A reactor doesn't have any dependency to a view. Just test reactors and test view bindings. See [Testing](#testing) section for details.\n* **Start Small**: ReactorKit doesn't require the whole application to follow a single architecture. ReactorKit can be adopted partially, for one or more specific views. You don't need to rewrite everything to use ReactorKit on your existing project.\n* **Less Typing**: ReactorKit focuses on avoiding complicated code for a simple thing. ReactorKit requires less code compared to other architectures. Start simple and scale up.\n\n### View\n\nA *View* displays data. A view controller and a cell are treated as a view. The view binds user inputs to the action stream and binds the view states to each UI component. There's no business logic in a view layer. A view just defines how to map the action stream and the state stream.\n\nTo define a view, just have an existing class conform a protocol named `View`. Then your class will have a property named `reactor` automatically. This property is typically set outside of the view.\n\n```swift\nclass ProfileViewController: UIViewController, View {\n  var disposeBag = DisposeBag()\n}\n\nprofileViewController.reactor = UserViewReactor() // inject reactor\n```\n\nWhen the `reactor` property has changed, `bind(reactor:)` gets called. Implement this method to define the bindings of an action stream and a state stream.\n\n```swift\nfunc bind(reactor: ProfileViewReactor) {\n  // action (View -> Reactor)\n  refreshButton.rx.tap.map { Reactor.Action.refresh }\n    .bind(to: reactor.action)\n    .disposed(by: self.disposeBag)\n\n  // state (Reactor -> View)\n  reactor.state.map { $0.isFollowing }\n    .bind(to: followButton.rx.isSelected)\n    .disposed(by: self.disposeBag)\n}\n```\n\n#### Storyboard Support\n\nUse `StoryboardView` protocol if you're using a storyboard to initialize view controllers. Everything is same but the only difference is that the `StoryboardView` performs a binding after the view is loaded.\n\n```swift\nlet viewController = MyViewController()\nviewController.reactor = MyViewReactor() // will not executes `bind(reactor:)` immediately\n\nclass MyViewController: UIViewController, StoryboardView {\n  func bind(reactor: MyViewReactor) {\n    // this is called after the view is loaded (viewDidLoad)\n  }\n}\n```\n\n### Reactor\n\nA *Reactor* is an UI-independent layer which manages the state of a view. The foremost role of a reactor is to separate control flow from a view. Every view has its corresponding reactor and delegates all logic to its reactor. A reactor has no dependency to a view, so it can be easily tested.\n\nConform to the `Reactor` protocol to define a reactor. This protocol requires three types to be defined: `Action`, `Mutation` and `State`. It also requires a property named `initialState`.\n\n```swift\nclass ProfileViewReactor: Reactor {\n  // represent user actions\n  enum Action {\n    case refreshFollowingStatus(Int)\n    case follow(Int)\n  }\n\n  // represent state changes\n  enum Mutation {\n    case setFollowing(Bool)\n  }\n\n  // represents the current view state\n  struct State {\n    var isFollowing: Bool = false\n  }\n\n  let initialState: State = State()\n}\n```\n\nAn `Action` represents a user interaction and `State` represents a view state. `Mutation` is a bridge between `Action` and `State`. A reactor converts the action stream to the state stream in two steps: `mutate()` and `reduce()`.\n\n<p align=\"center\">\n  <img alt=\"flow-reactor\" src=\"https://cloud.githubusercontent.com/assets/931655/25098066/2de21a28-23e2-11e7-8a41-d33d199dd951.png\" width=\"800\">\n</p>\n\n#### `mutate()`\n\n`mutate()` receives an `Action` and generates an `Observable<Mutation>`.\n\n```swift\nfunc mutate(action: Action) -> Observable<Mutation>\n```\n\nEvery side effect, such as an async operation or API call, is performed in this method.\n\n```swift\nfunc mutate(action: Action) -> Observable<Mutation> {\n  switch action {\n  case let .refreshFollowingStatus(userID): // receive an action\n    return UserAPI.isFollowing(userID) // create an API stream\n      .map { (isFollowing: Bool) -> Mutation in\n        return Mutation.setFollowing(isFollowing) // convert to Mutation stream\n      }\n\n  case let .follow(userID):\n    return UserAPI.follow()\n      .map { _ -> Mutation in\n        return Mutation.setFollowing(true)\n      }\n  }\n}\n```\n\n#### `reduce()`\n\n`reduce()` generates a new `State` from a previous `State` and a `Mutation`. \n\n```swift\nfunc reduce(state: State, mutation: Mutation) -> State\n```\n\nThis method is a pure function. It should just return a new `State` synchronously. Don't perform any side effects in this function.\n\n```swift\nfunc reduce(state: State, mutation: Mutation) -> State {\n  var state = state // create a copy of the old state\n  switch mutation {\n  case let .setFollowing(isFollowing):\n    state.isFollowing = isFollowing // manipulate the state, creating a new state\n    return state // return the new state\n  }\n}\n```\n\n#### `transform()`\n\n`transform()` transforms each stream. There are three `transform()` functions:\n\n```swift\nfunc transform(action: Observable<Action>) -> Observable<Action>\nfunc transform(mutation: Observable<Mutation>) -> Observable<Mutation>\nfunc transform(state: Observable<State>) -> Observable<State>\n```\n\nImplement these methods to transform and combine with other observable streams. For example, `transform(mutation:)` is the best place for combining a global event stream to a mutation stream. See the [Global States](#global-states) section for details.\n\nThese methods can be also used for debugging purposes:\n\n```swift\nfunc transform(action: Observable<Action>) -> Observable<Action> {\n  return action.debug(\"action\") // Use RxSwift's debug() operator\n}\n```\n\n## Advanced\n\n### Service\n\nReactorKit has a special layer named *Service*. A service layer does the actual business logic. A reactor is a middle layer between a view and a service which manages event streams. When a reactor receives an user action from a view, the reactor calls the service logic. The service makes a network request and sends the response back to the reactor. Then the reactor create a mutation stream with the service response.\n\nHere is an example of service:\n\n```swift\nprotocol UserServiceType {\n  func user(id: Int) -> Observable<User>\n  func follow(id: Int) -> Observable<Void>\n}\n\nfinal class UserService: Service, UserServiceType {\n  func user(id: Int) -> Observable<User> {\n    return foo()\n  }\n  \n  func follow(id: Int) -> Observable<Void> {\n    return bar()\n  }\n}\n```\n\n### Global States\n\nUnlike Redux, ReactorKit doesn't define a global app state. It means that you can use anything to manage a global state. You can use a `Variable`, a `PublishSubject` or even a reactor. ReactorKit doesn't force to have a global state so you can use ReactorKit in a specific feature in your application.\n\nThere is no global state in the **Action → Mutation → State** flow. You should use `transform(mutation:)` to transform the global state to a mutation. Let's assume that we have a global `Variable` which stores the current authenticated user. If you'd like to emit a `Mutation.setUser(User?)` when the `currentUser` is changed, you can do as following:\n\n\n```swift\nvar currentUser: Variable<User> // global state\n\nfunc transform(mutation: Observable<Mutation>) -> Observable<Mutation> {\n  return Observable.merge(mutation, currentUser.map(Mutation.setUser))\n}\n```\n\nThen the mutation will be emitted each time the view sends an action to a reactor and the `currentUser` is changed.\n\n### View Communication\n\nYou must be familiar with callback closures or delegate patterns for communicating between multiple views. ReactorKit recommends you to use [reactive extensions](https://github.com/ReactiveX/RxSwift/blob/master/RxSwift/Reactive.swift) for it. The most common example of `ControlEvent` is `UIButton.rx.tap`. The key concept is to treat your custom views as UIButton or UILabel.\n\n<p align=\"center\">\n  <img alt=\"view-view\" src=\"https://user-images.githubusercontent.com/931655/27789114-393e2eea-6026-11e7-9b32-bae314e672ee.png\" width=\"600\">\n</p>\n\nLet's assume that we have a `ChatViewController` which displays messages. The `ChatViewController` owns a `MessageInputView`. When an user taps the send button on the `MessageInputView`, the text will be sent to the `ChatViewController` and `ChatViewController` will bind in to the reactor's action. This is an example `MessageInputView`'s reactive extension:\n\n```swift\nextension Reactive where Base: MessageInputView {\n  var sendButtonTap: ControlEvent<String> {\n    let source = base.sendButton.rx.tap.withLatestFrom(...)\n    return ControlEvent(events: source)\n  }\n}\n```\n\nYou can use that extension in the `ChatViewController`. For example:\n\n```swift\nmessageInputView.rx.sendButtonTap\n  .map(Reactor.Action.send)\n  .bind(to: reactor.action)\n```\n\n### Testing\n\nReactorKit has a built-in functionality for a testing. You'll be able to easily test both a view and a reactor with a following instruction.\n\n#### What to test\n\nFirst of all, you have to decide what to test. There are two things to test: a view and a reactor.\n\n* View\n    * Action: is a proper action sent to a reactor with a given user interaction?\n    * State: is a view property set properly with a following state?\n* Reactor\n    * State: is a state changed properly with an action?\n\n#### View testing\n\nA view can be tested with a *stub* reactor. A reactor has a property `stub` which can log actions and force change states. If a reactor's stub is enabled, both `mutate()` and `reduce()` are not executed. A stub has these properties:\n\n```swift\nvar isEnabled: Bool { get set }\nvar state: Variable<Reactor.State> { get }\nvar action: ActionSubject<Reactor.Action> { get }\nvar actions: [Reactor.Action] { get } // recorded actions\n```\n\nHere are some example test cases:\n\n```swift\nfunc testAction_refresh() {\n  // 1. prepare a stub reactor\n  let reactor = MyReactor()\n  reactor.stub.isEnabled = true\n\n  // 2. prepare a view with a stub reactor\n  let view = MyView()\n  view.reactor = reactor\n\n  // 3. send an user interaction programatically\n  view.refreshControl.sendActions(for: .valueChanged)\n\n  // 4. assert actions\n  XCTAssertEqual(reactor.stub.actions.last, .refresh)\n}\n\nfunc testState_isLoading() {\n  // 1. prepare a stub reactor\n  let reactor = MyReactor()\n  reactor.stub.isEnabled = true\n\n  // 2. prepare a view with a stub reactor\n  let view = MyView()\n  view.reactor = reactor\n\n  // 3. set a stub state\n  reactor.stub.state.value = MyReactor.State(isLoading: true)\n\n  // 4. assert view properties\n  XCTAssertEqual(view.activityIndicator.isAnimating, true)\n}\n```\n\n#### Reactor testing\n\nA reactor can be tested independently.\n\n```swift\nfunc testIsBookmarked() {\n  let reactor = MyReactor()\n  reactor.action.onNext(.toggleBookmarked)\n  XCTAssertEqual(reactor.currentState.isBookmarked, true)\n  reactor.action.onNext(.toggleBookmarked)\n  XCTAssertEqual(reactor.currentState.isBookmarked, false)\n}\n```\n\nSometimes a state is changed more than one time for a single action. For example, a `.refresh` action sets `state.isLoading` to `true` at first and sets to `false` after the refreshing. In this case it's difficult to test `state.isLoading` with `currentState` so you might need to use [RxTest](https://github.com/ReactiveX/RxSwift) or [RxExpect](https://github.com/devxoul/RxExpect). Here is an example test case using RxExpect:\n\n```swift\nfunc testIsLoading() {\n  RxExpect(\"it should change isLoading\") { test in\n    let reactor = test.retain(MyReactor())\n    test.input(reactor.action, [\n      next(100, .refresh) // send .refresh at 100 scheduler time\n    ])\n    test.assert(reactor.state.map { $0.isLoading })\n      .since(100) // values since 100 scheduler time\n      .assert([\n        true,  // just after .refresh\n        false, // after refreshing\n      ])\n  }\n}\n```\n\n## Conventions\n\nReactorKit suggests some conventions to write clean and concise code.\n\n* You must create a reactor outside of the view and pass it to the view's `reactor` property.\n\n    **Good**\n\n    ```swift\n    let view = MyView()\n    view.reactor = MyViewReactor(provider: provider)\n    ```\n\n    **Bad**\n\n    ```swift\n    class MyView: UIView, View {\n      init() {\n        self.reactor = MyViewReactor()\n      }\n    }\n    ```\n\n## Examples\n\n* [Counter](https://github.com/ReactorKit/ReactorKit/tree/master/Examples/Counter): The most simple and basic example of ReactorKit\n* [GitHub Search](https://github.com/ReactorKit/ReactorKit/tree/master/Examples/GitHubSearch): A simple application which provides a GitHub repository search\n* [RxTodo](https://github.com/devxoul/RxTodo): iOS Todo Application using ReactorKit\n* [Cleverbot](https://github.com/devxoul/Cleverbot): iOS Messaging Application using Cleverbot and ReactorKit\n* [Drrrible](https://github.com/devxoul/Drrrible): Dribbble for iOS using ReactorKit ([App Store](https://itunes.apple.com/us/app/drrrible/id1229592223?mt=8))\n* [Passcode](https://github.com/cruisediary/Passcode): Passcode for iOS RxSwift, ReactorKit and IGListKit example\n\n## Dependencies\n\n* [RxSwift](https://github.com/ReactiveX/RxSwift) >= 4.0\n\n## Requirements\n\n* Swift 4\n* iOS 8\n* macOS 10.11\n* tvOS 9.0\n* watchOS 2.0\n\n## Installation\n\n* **Using [CocoaPods](https://cocoapods.org)**:\n\n    ```ruby\n    pod 'ReactorKit'\n    ```\n\n* **Using [Carthage](https://github.com/Carthage/Carthage)**:\n\n    ```\n    github \"ReactorKit/ReactorKit\"\n    ```\n\n## Contribution\n\nAny discussions and pull requests are welcomed 💖 \n\n* To development:\n\n    ```console\n    $ TEST=1 swift package generate-xcodeproj\n    ```\n\n* To test:\n\n    ```console\n    $ swift test\n    ```\n\n## Community\n\nJoin [#reactorkit](https://rxswift.slack.com/messages/C561PETRN/) on [RxSwift Slack](http://rxswift-slack.herokuapp.com/)!\n\n## Who's using ReactorKit\n\n<p align=\"center\">\n  <a href=\"https://www.stylesha.re\" target=\"_blank\"><img height=\"48\" vspace=\"20\" hspace=\"20\" alt=\"StyleShare\" src=\"https://user-images.githubusercontent.com/931655/30255218-e16fedfe-966f-11e7-973d-7d8d1726d7f6.png\"></a>\n  <a href=\"http://www.kakaocorp.com\" target=\"_blank\"><img height=\"36\" vspace=\"32\" hspace=\"20\" alt=\"Kakao\" src=\"https://user-images.githubusercontent.com/931655/30324656-cbea148a-97fc-11e7-9101-ba38d50f08f4.png\"></a>\n  <a href=\"http://getdoctalk.com\" target=\"_blank\"><img height=\"48\" vspace=\"24\" hspace=\"20\" alt=\"DocTalk\" src=\"https://user-images.githubusercontent.com/931655/30633896-503d142c-9e28-11e7-8e67-69c2822efe77.png\"></a>\n</p>\n\n> Are you using ReactorKit? Please [let me know](mailto:devxoul+reactorkit@gmail.com)!\n\n## Changelog\n\n* 2017-04-18\n    * Change the repository name to ReactorKit.\n* 2017-03-17\n    * Change the architecture name from RxMVVM to The Reactive Architecture.\n    * Every ViewModels are renamed to ViewReactors.\n\n## License\n\nReactorKit is under MIT license. See the [LICENSE](https://github.com/ReactorKit/ReactorKit/blob/master/LICENSE) for more info.\n"
  },
  {
    "path": "Pods/ReactorKit/Sources/ReactorKit/ActionSubject.swift",
    "content": "//\n//  ActionSubject.swift\n//  ReactorKit\n//\n//  Created by Suyeol Jeon on 14/05/2017.\n//\n//\n\nimport class Foundation.NSLock.NSRecursiveLock\n\nimport RxSwift\n\n/// A special subject for Reactor's Action. It only emits `.next` event.\npublic final class ActionSubject<Element>: ObservableType, ObserverType, SubjectType {\n  public typealias E = Element\n  typealias Key = UInt\n\n  var lock = NSRecursiveLock()\n\n  var nextKey: Key = 0\n  var observers: [Key: (Event<Element>) -> ()] = [:]\n\n  #if TRACE_RESOURCES\n  init() {\n    _ = Resources.incrementTotal()\n  }\n  #endif\n\n  #if TRACE_RESOURCES\n  deinit {\n    _ = Resources.decrementTotal()\n  }\n  #endif\n\n  public func subscribe<O: ObserverType>(_ observer: O) -> Disposable where O.E == Element {\n    self.lock.lock()\n    let key = self.nextKey\n    self.nextKey += 1\n    self.observers[key] = observer.on\n    self.lock.unlock()\n\n    return Disposables.create { [weak self] in\n      self?.lock.lock()\n      self?.observers.removeValue(forKey: key)\n      self?.lock.unlock()\n    }\n  }\n\n  public func on(_ event: Event<Element>) {\n    self.lock.lock()\n    if case .next = event {\n      self.observers.values.forEach { $0(event) }\n    }\n    self.lock.unlock()\n  }\n}\n"
  },
  {
    "path": "Pods/ReactorKit/Sources/ReactorKit/AssociatedObjectStore.swift",
    "content": "//\n//  AssociatedObjectStore.swift\n//  ReactorKit\n//\n//  Created by Suyeol Jeon on 14/04/2017.\n//  Copyright © 2017 Suyeol Jeon. All rights reserved.\n//\n\nimport ObjectiveC\n\npublic protocol AssociatedObjectStore {\n}\n\nextension AssociatedObjectStore {\n  func associatedObject<T>(forKey key: UnsafeRawPointer) -> T? {\n    return objc_getAssociatedObject(self, key) as? T\n  }\n\n  func associatedObject<T>(forKey key: UnsafeRawPointer, default: @autoclosure () -> T) -> T {\n    if let object: T = self.associatedObject(forKey: key) {\n      return object\n    }\n    let object = `default`()\n    self.setAssociatedObject(object, forKey: key)\n    return object\n  }\n\n  func setAssociatedObject<T>(_ object: T?, forKey key: UnsafeRawPointer) {\n    objc_setAssociatedObject(self, key, object, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n  }\n}\n\n"
  },
  {
    "path": "Pods/ReactorKit/Sources/ReactorKit/Reactor.swift",
    "content": "//\n//  Reactor.swift\n//  ReactorKit\n//\n//  Created by Suyeol Jeon on 06/04/2017.\n//  Copyright © 2017 Suyeol Jeon. All rights reserved.\n//\n\nimport RxSwift\n\npublic struct NoAction {}\npublic struct NoMutation {}\n\npublic typealias _Reactor = Reactor\n\n/// A Reactor is an UI-independent layer which manages the state of a view. The foremost role of a\n/// reactor is to separate control flow from a view. Every view has its corresponding reactor and\n/// delegates all logic to its reactor. A reactor has no dependency to a view, so it can be easily\n/// tested.\npublic protocol Reactor: class, AssociatedObjectStore {\n  /// An action represents user actions.\n  associatedtype Action\n\n  /// A mutation represents state changes.\n  associatedtype Mutation = Action\n\n  /// A State represents the current state of a view.\n  associatedtype State\n\n  /// The action from the view. Bind user inputs to this subject.\n  var action: ActionSubject<Action> { get }\n\n  /// The initial state.\n  var initialState: State { get }\n\n  /// The current state. This value is changed just after the state stream emits a new state.\n  var currentState: State { get }\n\n  /// The state stream. Use this observable to observe the state changes.\n  var state: Observable<State> { get }\n\n  /// Transforms the action. Use this function to combine with other observables. This method is\n  /// called once before the state stream is created.\n  func transform(action: Observable<Action>) -> Observable<Action>\n\n  /// Commits mutation from the action. This is the best place to perform side-effects such as\n  /// async tasks.\n  func mutate(action: Action) -> Observable<Mutation>\n\n  /// Transforms the mutation stream. Implement this method to transform or combine with other\n  /// observables. This method is called once before the state stream is created.\n  func transform(mutation: Observable<Mutation>) -> Observable<Mutation>\n\n  /// Generates a new state with the previous state and the action. It should be purely functional\n  /// so it should not perform any side-effects here. This method is called every time when the\n  /// mutation is committed.\n  func reduce(state: State, mutation: Mutation) -> State\n\n  /// Transforms the state stream. Use this function to perform side-effects such as logging. This\n  /// method is called once after the state stream is created.\n  func transform(state: Observable<State>) -> Observable<State>\n}\n\n\n// MARK: - Associated Object Keys\n\nprivate var actionKey = \"action\"\nprivate var currentStateKey = \"currentState\"\nprivate var stateKey = \"state\"\nprivate var disposeBagKey = \"disposeBag\"\nprivate var stubKey = \"stub\"\n\n\n// MARK: - Default Implementations\n\nextension Reactor {\n  private var _action: ActionSubject<Action> {\n    if self.stub.isEnabled {\n      return self.stub.action\n    } else {\n      return self.associatedObject(forKey: &actionKey, default: .init())\n    }\n  }\n  public var action: ActionSubject<Action> {\n    // Creates a state stream automatically\n    _ = self._state\n\n    // It seems that Swift has a bug in associated object when subclassing a generic class. This is\n    // a temporary solution to bypass the bug. See #30 for details.\n    return self._action\n  }\n\n  public internal(set) var currentState: State {\n    get { return self.associatedObject(forKey: &currentStateKey, default: self.initialState) }\n    set { self.setAssociatedObject(newValue, forKey: &currentStateKey) }\n  }\n\n  private var _state: Observable<State> {\n    if self.stub.isEnabled {\n      return self.stub.state.asObservable()\n    } else {\n      return self.associatedObject(forKey: &stateKey, default: self.createStateStream())\n    }\n  }\n  public var state: Observable<State> {\n    // It seems that Swift has a bug in associated object when subclassing a generic class. This is\n    // a temporary solution to bypass the bug. See #30 for details.\n    return self._state\n  }\n\n  fileprivate var disposeBag: DisposeBag {\n    get { return self.associatedObject(forKey: &disposeBagKey, default: DisposeBag()) }\n  }\n\n  public func createStateStream() -> Observable<State> {\n    let action = self._action.asObservable()\n    let transformedAction = self.transform(action: action)\n    let mutation = transformedAction\n      .flatMap { [weak self] action -> Observable<Mutation> in\n        guard let `self` = self else { return .empty() }\n        return self.mutate(action: action).catchError { _ in .empty() }\n      }\n    let transformedMutation = self.transform(mutation: mutation)\n    let state = transformedMutation\n      .scan(self.initialState) { [weak self] state, mutation -> State in\n        guard let `self` = self else { return state }\n        return self.reduce(state: state, mutation: mutation)\n      }\n      .catchError { _ in .empty() }\n      .startWith(self.initialState)\n      .observeOn(MainScheduler.instance)\n    let transformedState = self.transform(state: state)\n      .do(onNext: { [weak self] state in\n        self?.currentState = state\n      })\n      .replay(1)\n    transformedState.connect().disposed(by: self.disposeBag)\n    return transformedState\n  }\n\n  public func transform(action: Observable<Action>) -> Observable<Action> {\n    return action\n  }\n\n  public func mutate(action: Action) -> Observable<Mutation> {\n    return .empty()\n  }\n\n  public func transform(mutation: Observable<Mutation>) -> Observable<Mutation> {\n    return mutation\n  }\n\n  public func reduce(state: State, mutation: Mutation) -> State {\n    return state\n  }\n\n  public func transform(state: Observable<State>) -> Observable<State> {\n    return state\n  }\n}\n\nextension Reactor where Action == Mutation {\n  public func mutate(action: Action) -> Observable<Mutation> {\n    return .just(action)\n  }\n}\n\n\n// MARK: - Stub\n\nextension Reactor {\n  public var stub: Stub<Self> {\n    return self.associatedObject(\n      forKey: &stubKey,\n      default: .init(reactor: self, disposeBag: self.disposeBag)\n    )\n  }\n}\n"
  },
  {
    "path": "Pods/ReactorKit/Sources/ReactorKit/StoryboardView.swift",
    "content": "import RxSwift\n\n#if !os(Linux)\n#if os(iOS) || os(tvOS)\nimport UIKit\nprivate typealias OSViewController = UIViewController\n#elseif os(OSX)\nimport AppKit\nprivate typealias OSViewController = NSViewController\n#endif\n\npublic protocol _ObjCStoryboardView {\n  func performBinding()\n}\n\npublic protocol StoryboardView: View, _ObjCStoryboardView {\n}\n\nextension StoryboardView {\n  public var reactor: Reactor? {\n    get { return self.associatedObject(forKey: &reactorKey) }\n    set {\n      self.setAssociatedObject(newValue, forKey: &reactorKey)\n      self.isReactorBinded = false\n      self.disposeBag = DisposeBag()\n      self.performBinding()\n    }\n  }\n\n  fileprivate var isReactorBinded: Bool {\n    get { return self.associatedObject(forKey: &isReactorBindedKey, default: false) }\n    set { self.setAssociatedObject(newValue, forKey: &isReactorBindedKey) }\n  }\n\n  public func performBinding() {\n    guard let reactor = self.reactor else { return }\n    guard !self.isReactorBinded else { return }\n    guard !self.shouldDeferBinding(reactor: reactor) else { return }\n    self.bind(reactor: reactor)\n    self.isReactorBinded = true\n  }\n\n  fileprivate func shouldDeferBinding(reactor: Reactor) -> Bool {\n    #if !os(watchOS)\n      return (self as? OSViewController)?.isViewLoaded == false\n    #else\n      return false\n    #endif\n  }\n}\n\n#if !os(watchOS)\nextension OSViewController {\n  @objc func _reactorkit_performBinding() {\n    (self as? _ObjCStoryboardView)?.performBinding()\n  }\n}\n#endif\n#endif\n"
  },
  {
    "path": "Pods/ReactorKit/Sources/ReactorKit/Stub.swift",
    "content": "import RxSwift\n\npublic class Stub<Reactor: _Reactor> {\n  private unowned var reactor: Reactor\n  private let disposeBag: DisposeBag\n\n  public var isEnabled: Bool = false\n\n  public let state: Variable<Reactor.State>\n  public let action: ActionSubject<Reactor.Action>\n  public private(set) var actions: [Reactor.Action] = []\n\n  public init(reactor: Reactor, disposeBag: DisposeBag) {\n    self.reactor = reactor\n    self.disposeBag = disposeBag\n    self.state = .init(reactor.initialState)\n    self.state.asObservable()\n      .subscribe(onNext: { [weak reactor] state in\n        reactor?.currentState = state\n      })\n      .disposed(by: disposeBag)\n    self.action = .init()\n    self.action\n      .subscribe(onNext: { [weak self] action in\n        self?.actions.append(action)\n      })\n      .disposed(by: self.disposeBag)\n  }\n}\n"
  },
  {
    "path": "Pods/ReactorKit/Sources/ReactorKit/View.swift",
    "content": "//\n//  View.swift\n//  ReactorKit\n//\n//  Created by Suyeol Jeon on 13/04/2017.\n//  Copyright © 2017 Suyeol Jeon. All rights reserved.\n//\n\n#if !os(Linux)\nimport RxSwift\n\n/// A View displays data. A view controller and a cell are treated as a view. The view binds user\n/// inputs to the action stream and binds the view states to each UI component. There's no business\n/// logic in a view layer. A view just defines how to map the action stream and the state stream.\npublic protocol View: class, AssociatedObjectStore {\n  associatedtype Reactor: _Reactor\n\n  /// A dispose bag. It is disposed each time the `reactor` is assigned.\n  var disposeBag: DisposeBag { get set }\n\n  /// A view's reactor. `bind(reactor:)` gets called when the new value is assigned to this property.\n  var reactor: Reactor? { get set }\n\n  /// Creates RxSwift bindings. This method is called each time the `reactor` is assigned.\n  ///\n  /// Here is a typical implementation example:\n  ///\n  /// ```\n  /// func bind(reactor: MyReactor) {\n  ///   // Action\n  ///   increaseButton.rx.tap\n  ///     .bind(to: Reactor.Action.increase)\n  ///     .disposed(by: disposeBag)\n  ///\n  ///   // State\n  ///   reactor.state.map { $0.count }\n  ///     .bind(to: countLabel.rx.text)\n  ///     .disposed(by: disposeBag)\n  /// }\n  /// ```\n  ///\n  /// - warning: It's not recommended to call this method directly.\n  func bind(reactor: Reactor)\n}\n\n\n// MARK: - Associated Object Keys\n\nvar reactorKey = \"reactor\"\nvar isReactorBindedKey = \"isReactorBinded\"\n\n\n// MARK: - Default Implementations\n\nextension View {\n  public var reactor: Reactor? {\n    get { return self.associatedObject(forKey: &reactorKey) }\n    set {\n      self.setAssociatedObject(newValue, forKey: &reactorKey)\n      self.disposeBag = DisposeBag()\n      if let reactor = newValue {\n        self.bind(reactor: reactor)\n      }\n    }\n  }\n}\n#endif\n"
  },
  {
    "path": "Pods/ReactorKit/Sources/ReactorKitRuntime/ReactorKitRuntime.m",
    "content": "#import <objc/runtime.h>\n#import \"ReactorKitRuntime.h\"\n\n@implementation NSObject (ReactorKit)\n\n+ (void)load {\n  static dispatch_once_t onceToken;\n  dispatch_once(&onceToken, ^{\n    [self swizzleInitializeOfClassNamed:@\"UIViewController\"];\n    [self swizzleInitializeOfClassNamed:@\"NSViewController\"];\n  });\n}\n\n+ (void)swizzleInitializeOfClassNamed:(NSString *)className {\n  Class class = NSClassFromString(className);\n  if (!class) {\n    return;\n  }\n  method_exchangeImplementations(class_getClassMethod(class, @selector(initialize)),\n                                 class_getClassMethod(self, @selector(_reactorkit_initialize)));\n}\n\n+ (void)_reactorkit_initialize {\n  [self _reactorkit_initialize];\n  BOOL isUIViewController = [self isSubclassOfClassNamed:@\"UIViewController\"];\n  BOOL isNSViewController = [self isSubclassOfClassNamed:@\"NSViewController\"];\n  if (!isUIViewController && !isNSViewController) {\n    return;\n  }\n  [self swizzleViewDidLoad];\n}\n\n+ (void)swizzleViewDidLoad {\n  Class class = self;\n\n  #pragma clang diagnostic push\n  #pragma clang diagnostic ignored \"-Wundeclared-selector\"\n  SEL oldSelector = @selector(viewDidLoad);\n  SEL performBindingSelector = @selector(_reactorkit_performBinding);\n  #pragma clang diagnostic pop\n\n  Method oldMethod = class_getInstanceMethod(class, oldSelector);\n  const char *types = method_getTypeEncoding(oldMethod);\n  void (*oldMethodImp)(id, SEL) = (void (*)(id, SEL))method_getImplementation(oldMethod);\n\n  IMP newMethodImp = imp_implementationWithBlock(^(__unsafe_unretained id self) {\n    oldMethodImp(self, oldSelector);\n    if ([self respondsToSelector:performBindingSelector]) {\n      #pragma clang diagnostic push\n      #pragma clang diagnostic ignored \"-Warc-performSelector-leaks\"\n      [self performSelector:performBindingSelector];\n      #pragma clang diagnostic pop\n    }\n  });\n  class_replaceMethod(class, oldSelector, newMethodImp, types);\n}\n\n+ (BOOL)isSubclassOfClassNamed:(NSString *)className {\n  Class superclass = NSClassFromString(className);\n  if (!superclass) {\n    return NO;\n  }\n  return [self isSubclassOfClass:superclass];\n}\n\n@end\n"
  },
  {
    "path": "Pods/ReactorKit/Sources/ReactorKitRuntime/include/ReactorKitRuntime.h",
    "content": "#import <Foundation/Foundation.h>\n\n//! Project version number for ReactorKit.\nFOUNDATION_EXPORT double ReactorKitVersionNumber;\n\n//! Project version string for ReactorKit.\nFOUNDATION_EXPORT const unsigned char ReactorKitVersionString[];\n"
  },
  {
    "path": "Pods/Result/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 Rob Rix\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "Pods/Result/README.md",
    "content": "# Result\n\n[![Build Status](https://travis-ci.org/antitypical/Result.svg?branch=master)](https://travis-ci.org/antitypical/Result)\n[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)\n[![CocoaPods](https://img.shields.io/cocoapods/v/Result.svg)](https://cocoapods.org/)\n[![Reference Status](https://www.versioneye.com/objective-c/result/reference_badge.svg?style=flat)](https://www.versioneye.com/objective-c/result/references)\n\nThis is a Swift µframework providing `Result<Value, Error>`.\n\n`Result<Value, Error>` values are either successful (wrapping `Value`) or failed (wrapping `Error`). This is similar to Swift’s native `Optional` type: `success` is like `some`, and `failure` is like `none` except with an associated `Error` value. The addition of an associated `Error` allows errors to be passed along for logging or displaying to the user.\n\nUsing this µframework instead of rolling your own `Result` type allows you to easily interface with other frameworks that also use `Result`.\n\n## Use\n\nUse `Result` whenever an operation has the possibility of failure. Consider the following example of a function that tries to extract a `String` for a given key from a JSON `Dictionary`.\n\n```swift\ntypealias JSONObject = [String: Any]\n\nenum JSONError: Error {\n    case noSuchKey(String)\n    case typeMismatch\n}\n\nfunc stringForKey(json: JSONObject, key: String) -> Result<String, JSONError> {\n    guard let value = json[key] else {\n        return .failure(.noSuchKey(key))\n    }\n    \n    if let value = value as? String {\n        return .success(value)\n    }\n    else {\n        return .failure(.typeMismatch)\n    }\n}\n```\n\nThis function provides a more robust wrapper around the default subscripting provided by `Dictionary`. Rather than return `Any?`, it returns a `Result` that either contains the `String` value for the given key, or an `ErrorType` detailing what went wrong.\n\nOne simple way to handle a `Result` is to deconstruct it using a `switch` statement.\n\n```swift\nswitch stringForKey(json, key: \"email\") {\n\ncase let .success(email):\n    print(\"The email is \\(email)\")\n    \ncase let .failure(.noSuchKey(key)):\n    print(\"\\(key) is not a valid key\")\n    \ncase .failure(.typeMismatch):\n    print(\"Didn't have the right type\")\n}\n```\n\nUsing a `switch` statement allows powerful pattern matching, and ensures all possible results are covered. Swift 2.0 offers new ways to deconstruct enums like the `if-case` statement, but be wary as such methods do not ensure errors are handled.\n\nOther methods available for processing `Result` are detailed in the [API documentation](http://cocoadocs.org/docsets/Result/).\n\n## Result vs. Throws\n\nSwift 2.0 introduces error handling via throwing and catching `Error`. `Result` accomplishes the same goal by encapsulating the result instead of hijacking control flow. The `Result` abstraction enables powerful functionality such as `map` and `flatMap`, making `Result` more composable than `throw`.\n\nSince dealing with APIs that throw is common, you can convert such functions into a `Result` by using the `materialize` method. Conversely, a `Result` can be used to throw an error by calling `dematerialize`.\n\n## Higher Order Functions\n\n`map` and `flatMap` operate the same as `Optional.map` and `Optional.flatMap` except they apply to `Result`.\n\n`map` transforms a `Result` into a `Result` of a new type. It does this by taking a function that transforms the `Value` type into a new value. This transformation is only applied in the case of a `success`. In the case of a `failure`, the associated error is re-wrapped in the new `Result`.\n\n```swift\n// transforms a Result<Int, JSONError> to a Result<String, JSONError>\nlet idResult = intForKey(json, key:\"id\").map { id in String(id) }\n```\n\nHere, the final result is either the id as a `String`, or carries over the `failure` from the previous result.\n\n`flatMap` is similar to `map` in that in transforms the `Result` into another `Result`. However, the function passed into `flatMap` must return a `Result`.\n\nAn in depth discussion of `map` and `flatMap` is beyond the scope of this documentation. If you would like a deeper understanding, read about functors and monads. This article is a good place to [start](http://www.javiersoto.me/post/106875422394).\n\n## Integration\n\n### Carthage\n\n1. Add this repository as a submodule and/or [add it to your Cartfile](https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md#cartfile) if you’re using [carthage](https://github.com/Carthage/Carthage/) to manage your dependencies.\n2. Drag `Result.xcodeproj` into your project or workspace.\n3. Link your target against `Result.framework`.\n4. Application targets should ensure that the framework gets copied into their application bundle. (Framework targets should instead require the application linking them to include Result.)\n\n### Cocoapods\n\n```ruby\npod 'Result', '~> 3.0.0'\n```\n\n### Swift Package Manager\n\n```swift\nimport PackageDescription\n\nlet package = Package(\n    name: \"MyProject\",\n    targets: [],\n    dependencies: [\n        .Package(url: \"https://github.com/antitypical/Result.git\",\n                 majorVersion: 3)\n    ]\n)\n```\n"
  },
  {
    "path": "Pods/Result/Result/Result.swift",
    "content": "//  Copyright (c) 2015 Rob Rix. All rights reserved.\n\n/// An enum representing either a failure with an explanatory error, or a success with a result value.\npublic enum Result<T, Error: Swift.Error>: ResultProtocol, CustomStringConvertible, CustomDebugStringConvertible {\n\tcase success(T)\n\tcase failure(Error)\n\n\t// MARK: Constructors\n\n\t/// Constructs a success wrapping a `value`.\n\tpublic init(value: T) {\n\t\tself = .success(value)\n\t}\n\n\t/// Constructs a failure wrapping an `error`.\n\tpublic init(error: Error) {\n\t\tself = .failure(error)\n\t}\n\n\t/// Constructs a result from an `Optional`, failing with `Error` if `nil`.\n\tpublic init(_ value: T?, failWith: @autoclosure () -> Error) {\n\t\tself = value.map(Result.success) ?? .failure(failWith())\n\t}\n\n\t/// Constructs a result from a function that uses `throw`, failing with `Error` if throws.\n\tpublic init(_ f: @autoclosure () throws -> T) {\n\t\tself.init(attempt: f)\n\t}\n\n\t/// Constructs a result from a function that uses `throw`, failing with `Error` if throws.\n\tpublic init(attempt f: () throws -> T) {\n\t\tdo {\n\t\t\tself = .success(try f())\n\t\t} catch var error {\n\t\t\tif Error.self == AnyError.self {\n\t\t\t\terror = AnyError(error)\n\t\t\t}\n\t\t\tself = .failure(error as! Error)\n\t\t}\n\t}\n\n\t// MARK: Deconstruction\n\n\t/// Returns the value from `success` Results or `throw`s the error.\n\tpublic func dematerialize() throws -> T {\n\t\tswitch self {\n\t\tcase let .success(value):\n\t\t\treturn value\n\t\tcase let .failure(error):\n\t\t\tthrow error\n\t\t}\n\t}\n\n\t/// Case analysis for Result.\n\t///\n\t/// Returns the value produced by applying `ifFailure` to `failure` Results, or `ifSuccess` to `success` Results.\n\tpublic func analysis<Result>(ifSuccess: (T) -> Result, ifFailure: (Error) -> Result) -> Result {\n\t\tswitch self {\n\t\tcase let .success(value):\n\t\t\treturn ifSuccess(value)\n\t\tcase let .failure(value):\n\t\t\treturn ifFailure(value)\n\t\t}\n\t}\n\n\t// MARK: Errors\n\n\t/// The domain for errors constructed by Result.\n\tpublic static var errorDomain: String { return \"com.antitypical.Result\" }\n\n\t/// The userInfo key for source functions in errors constructed by Result.\n\tpublic static var functionKey: String { return \"\\(errorDomain).function\" }\n\n\t/// The userInfo key for source file paths in errors constructed by Result.\n\tpublic static var fileKey: String { return \"\\(errorDomain).file\" }\n\n\t/// The userInfo key for source file line numbers in errors constructed by Result.\n\tpublic static var lineKey: String { return \"\\(errorDomain).line\" }\n\n\t/// Constructs an error.\n\tpublic static func error(_ message: String? = nil, function: String = #function, file: String = #file, line: Int = #line) -> NSError {\n\t\tvar userInfo: [String: Any] = [\n\t\t\tfunctionKey: function,\n\t\t\tfileKey: file,\n\t\t\tlineKey: line,\n\t\t]\n\n\t\tif let message = message {\n\t\t\tuserInfo[NSLocalizedDescriptionKey] = message\n\t\t}\n\n\t\treturn NSError(domain: errorDomain, code: 0, userInfo: userInfo)\n\t}\n\n\n\t// MARK: CustomStringConvertible\n\n\tpublic var description: String {\n\t\treturn analysis(\n\t\t\tifSuccess: { \".success(\\($0))\" },\n\t\t\tifFailure: { \".failure(\\($0))\" })\n\t}\n\n\n\t// MARK: CustomDebugStringConvertible\n\n\tpublic var debugDescription: String {\n\t\treturn description\n\t}\n}\n\n// MARK: - Derive result from failable closure\n\npublic func materialize<T>(_ f: () throws -> T) -> Result<T, AnyError> {\n\treturn materialize(try f())\n}\n\npublic func materialize<T>(_ f: @autoclosure () throws -> T) -> Result<T, AnyError> {\n\tdo {\n\t\treturn .success(try f())\n\t} catch {\n\t\treturn .failure(AnyError(error))\n\t}\n}\n\n@available(*, deprecated, message: \"Use the overload which returns `Result<T, AnyError>` instead\")\npublic func materialize<T>(_ f: () throws -> T) -> Result<T, NSError> {\n\treturn materialize(try f())\n}\n\n@available(*, deprecated, message: \"Use the overload which returns `Result<T, AnyError>` instead\")\npublic func materialize<T>(_ f: @autoclosure () throws -> T) -> Result<T, NSError> {\n\tdo {\n\t\treturn .success(try f())\n\t} catch {\n// This isn't great, but it lets us maintain compatibility until this deprecated\n// method can be removed.\n#if _runtime(_ObjC)\n\t\treturn .failure(error as NSError)\n#else\n\t\t// https://github.com/apple/swift-corelibs-foundation/blob/swift-3.0.2-RELEASE/Foundation/NSError.swift#L314\n\t\tlet userInfo = _swift_Foundation_getErrorDefaultUserInfo(error) as? [String: Any]\n\t\tlet nsError = NSError(domain: error._domain, code: error._code, userInfo: userInfo)\n\t\treturn .failure(nsError)\n#endif\n\t}\n}\n\n// MARK: - Cocoa API conveniences\n\n#if !os(Linux)\n\n/// Constructs a `Result` with the result of calling `try` with an error pointer.\n///\n/// This is convenient for wrapping Cocoa API which returns an object or `nil` + an error, by reference. e.g.:\n///\n///     Result.try { NSData(contentsOfURL: URL, options: .dataReadingMapped, error: $0) }\n@available(*, deprecated, message: \"This will be removed in Result 4.0. Use `Result.init(attempt:)` instead. See https://github.com/antitypical/Result/issues/85 for the details.\")\npublic func `try`<T>(_ function: String = #function, file: String = #file, line: Int = #line, `try`: (NSErrorPointer) -> T?) -> Result<T, NSError> {\n\tvar error: NSError?\n\treturn `try`(&error).map(Result.success) ?? .failure(error ?? Result<T, NSError>.error(function: function, file: file, line: line))\n}\n\n/// Constructs a `Result` with the result of calling `try` with an error pointer.\n///\n/// This is convenient for wrapping Cocoa API which returns a `Bool` + an error, by reference. e.g.:\n///\n///     Result.try { NSFileManager.defaultManager().removeItemAtURL(URL, error: $0) }\n@available(*, deprecated, message: \"This will be removed in Result 4.0. Use `Result.init(attempt:)` instead. See https://github.com/antitypical/Result/issues/85 for the details.\")\npublic func `try`(_ function: String = #function, file: String = #file, line: Int = #line, `try`: (NSErrorPointer) -> Bool) -> Result<(), NSError> {\n\tvar error: NSError?\n\treturn `try`(&error) ?\n\t\t.success(())\n\t:\t.failure(error ?? Result<(), NSError>.error(function: function, file: file, line: line))\n}\n\n#endif\n\n// MARK: - ErrorConvertible conformance\n\t\nextension NSError: ErrorConvertible {\n\tpublic static func error(from error: Swift.Error) -> Self {\n\t\tfunc cast<T: NSError>(_ error: Swift.Error) -> T {\n\t\t\treturn error as! T\n\t\t}\n\n\t\treturn cast(error)\n\t}\n}\n\n// MARK: - Errors\n\n/// An “error” that is impossible to construct.\n///\n/// This can be used to describe `Result`s where failures will never\n/// be generated. For example, `Result<Int, NoError>` describes a result that\n/// contains an `Int`eger and is guaranteed never to be a `failure`.\npublic enum NoError: Swift.Error, Equatable {\n\tpublic static func ==(lhs: NoError, rhs: NoError) -> Bool {\n\t\treturn true\n\t}\n}\n\n/// A type-erased error which wraps an arbitrary error instance. This should be\n/// useful for generic contexts.\npublic struct AnyError: Swift.Error {\n\t/// The underlying error.\n\tpublic let error: Swift.Error\n\n\tpublic init(_ error: Swift.Error) {\n\t\tif let anyError = error as? AnyError {\n\t\t\tself = anyError\n\t\t} else {\n\t\t\tself.error = error\n\t\t}\n\t}\n}\n\nextension AnyError: ErrorConvertible {\n\tpublic static func error(from error: Error) -> AnyError {\n\t\treturn AnyError(error)\n\t}\n}\n\nextension AnyError: CustomStringConvertible {\n\tpublic var description: String {\n\t\treturn String(describing: error)\n\t}\n}\n\n// There appears to be a bug in Foundation on Linux which prevents this from working:\n// https://bugs.swift.org/browse/SR-3565\n// Don't forget to comment the tests back in when removing this check when it's fixed!\n#if !os(Linux)\n\nextension AnyError: LocalizedError {\n\tpublic var errorDescription: String? {\n\t\treturn error.localizedDescription\n\t}\n\n\tpublic var failureReason: String? {\n\t\treturn (error as? LocalizedError)?.failureReason\n\t}\n\n\tpublic var helpAnchor: String? {\n\t\treturn (error as? LocalizedError)?.helpAnchor\n\t}\n\n\tpublic var recoverySuggestion: String? {\n\t\treturn (error as? LocalizedError)?.recoverySuggestion\n\t}\n}\n\n#endif\n\n// MARK: - migration support\nextension Result {\n\t@available(*, unavailable, renamed: \"success\")\n\tpublic static func Success(_: T) -> Result<T, Error> {\n\t\tfatalError()\n\t}\n\n\t@available(*, unavailable, renamed: \"failure\")\n\tpublic static func Failure(_: Error) -> Result<T, Error> {\n\t\tfatalError()\n\t}\n}\n\nextension NSError {\n\t@available(*, unavailable, renamed: \"error(from:)\")\n\tpublic static func errorFromErrorType(_ error: Swift.Error) -> Self {\n\t\tfatalError()\n\t}\n}\n\nimport Foundation\n"
  },
  {
    "path": "Pods/Result/Result/ResultProtocol.swift",
    "content": "//  Copyright (c) 2015 Rob Rix. All rights reserved.\n\n/// A type that can represent either failure with an error or success with a result value.\npublic protocol ResultProtocol {\n\tassociatedtype Value\n\tassociatedtype Error: Swift.Error\n\t\n\t/// Constructs a successful result wrapping a `value`.\n\tinit(value: Value)\n\n\t/// Constructs a failed result wrapping an `error`.\n\tinit(error: Error)\n\t\n\t/// Case analysis for ResultProtocol.\n\t///\n\t/// Returns the value produced by appliying `ifFailure` to the error if self represents a failure, or `ifSuccess` to the result value if self represents a success.\n\tfunc analysis<U>(ifSuccess: (Value) -> U, ifFailure: (Error) -> U) -> U\n\n\t/// Returns the value if self represents a success, `nil` otherwise.\n\t///\n\t/// A default implementation is provided by a protocol extension. Conforming types may specialize it.\n\tvar value: Value? { get }\n\n\t/// Returns the error if self represents a failure, `nil` otherwise.\n\t///\n\t/// A default implementation is provided by a protocol extension. Conforming types may specialize it.\n\tvar error: Error? { get }\n}\n\npublic extension ResultProtocol {\n\t\n\t/// Returns the value if self represents a success, `nil` otherwise.\n\tpublic var value: Value? {\n\t\treturn analysis(ifSuccess: { $0 }, ifFailure: { _ in nil })\n\t}\n\t\n\t/// Returns the error if self represents a failure, `nil` otherwise.\n\tpublic var error: Error? {\n\t\treturn analysis(ifSuccess: { _ in nil }, ifFailure: { $0 })\n\t}\n\n\t/// Returns a new Result by mapping `Success`es’ values using `transform`, or re-wrapping `Failure`s’ errors.\n\tpublic func map<U>(_ transform: (Value) -> U) -> Result<U, Error> {\n\t\treturn flatMap { .success(transform($0)) }\n\t}\n\n\t/// Returns the result of applying `transform` to `Success`es’ values, or re-wrapping `Failure`’s errors.\n\tpublic func flatMap<U>(_ transform: (Value) -> Result<U, Error>) -> Result<U, Error> {\n\t\treturn analysis(\n\t\t\tifSuccess: transform,\n\t\t\tifFailure: Result<U, Error>.failure)\n\t}\n\n\t/// Returns a Result with a tuple of the receiver and `other` values if both\n\t/// are `Success`es, or re-wrapping the error of the earlier `Failure`.\n\tpublic func fanout<R: ResultProtocol>(_ other: @autoclosure () -> R) -> Result<(Value, R.Value), Error>\n\t\twhere Error == R.Error\n\t{\n\t\treturn self.flatMap { left in other().map { right in (left, right) } }\n\t}\n\n\t/// Returns a new Result by mapping `Failure`'s values using `transform`, or re-wrapping `Success`es’ values.\n\tpublic func mapError<Error2>(_ transform: (Error) -> Error2) -> Result<Value, Error2> {\n\t\treturn flatMapError { .failure(transform($0)) }\n\t}\n\n\t/// Returns the result of applying `transform` to `Failure`’s errors, or re-wrapping `Success`es’ values.\n\tpublic func flatMapError<Error2>(_ transform: (Error) -> Result<Value, Error2>) -> Result<Value, Error2> {\n\t\treturn analysis(\n\t\t\tifSuccess: Result<Value, Error2>.success,\n\t\t\tifFailure: transform)\n\t}\n\n\t/// Returns a new Result by mapping `Success`es’ values using `success`, and by mapping `Failure`'s values using `failure`.\n\tpublic func bimap<U, Error2>(success: (Value) -> U, failure: (Error) -> Error2) -> Result<U, Error2> {\n\t\treturn analysis(\n\t\t\tifSuccess: { .success(success($0)) },\n\t\t\tifFailure: { .failure(failure($0)) }\n\t\t)\n\t}\n}\n\npublic extension ResultProtocol {\n\n\t// MARK: Higher-order functions\n\n\t/// Returns `self.value` if this result is a .Success, or the given value otherwise. Equivalent with `??`\n\tpublic func recover(_ value: @autoclosure () -> Value) -> Value {\n\t\treturn self.value ?? value()\n\t}\n\n\t/// Returns this result if it is a .Success, or the given result otherwise. Equivalent with `??`\n\tpublic func recover(with result: @autoclosure () -> Self) -> Self {\n\t\treturn analysis(\n\t\t\tifSuccess: { _ in self },\n\t\t\tifFailure: { _ in result() })\n\t}\n}\n\n/// Protocol used to constrain `tryMap` to `Result`s with compatible `Error`s.\npublic protocol ErrorConvertible: Swift.Error {\n\tstatic func error(from error: Swift.Error) -> Self\n}\n\npublic extension ResultProtocol where Error: ErrorConvertible {\n\n\t/// Returns the result of applying `transform` to `Success`es’ values, or wrapping thrown errors.\n\tpublic func tryMap<U>(_ transform: (Value) throws -> U) -> Result<U, Error> {\n\t\treturn flatMap { value in\n\t\t\tdo {\n\t\t\t\treturn .success(try transform(value))\n\t\t\t}\n\t\t\tcatch {\n\t\t\t\tlet convertedError = Error.error(from: error)\n\t\t\t\t// Revisit this in a future version of Swift. https://twitter.com/jckarter/status/672931114944696321\n\t\t\t\treturn .failure(convertedError)\n\t\t\t}\n\t\t}\n\t}\n}\n\n// MARK: - Operators\n\ninfix operator &&& : LogicalConjunctionPrecedence\n\n/// Returns a Result with a tuple of `left` and `right` values if both are `Success`es, or re-wrapping the error of the earlier `Failure`.\n@available(*, deprecated, renamed: \"ResultProtocol.fanout(self:_:)\")\npublic func &&& <L: ResultProtocol, R: ResultProtocol> (left: L, right: @autoclosure () -> R) -> Result<(L.Value, R.Value), L.Error>\n\twhere L.Error == R.Error\n{\n\treturn left.fanout(right)\n}\n\nprecedencegroup ChainingPrecedence {\n\tassociativity: left\n\thigherThan: TernaryPrecedence\n}\n\ninfix operator >>- : ChainingPrecedence\n\n/// Returns the result of applying `transform` to `Success`es’ values, or re-wrapping `Failure`’s errors.\n///\n/// This is a synonym for `flatMap`.\n@available(*, deprecated, renamed: \"ResultProtocol.flatMap(self:_:)\")\npublic func >>- <T: ResultProtocol, U> (result: T, transform: (T.Value) -> Result<U, T.Error>) -> Result<U, T.Error> {\n\treturn result.flatMap(transform)\n}\n\n/// Returns `true` if `left` and `right` are both `Success`es and their values are equal, or if `left` and `right` are both `Failure`s and their errors are equal.\npublic func == <T: ResultProtocol> (left: T, right: T) -> Bool\n\twhere T.Value: Equatable, T.Error: Equatable\n{\n\tif let left = left.value, let right = right.value {\n\t\treturn left == right\n\t} else if let left = left.error, let right = right.error {\n\t\treturn left == right\n\t}\n\treturn false\n}\n\n/// Returns `true` if `left` and `right` represent different cases, or if they represent the same case but different values.\npublic func != <T: ResultProtocol> (left: T, right: T) -> Bool\n\twhere T.Value: Equatable, T.Error: Equatable\n{\n\treturn !(left == right)\n}\n\n/// Returns the value of `left` if it is a `Success`, or `right` otherwise. Short-circuits.\npublic func ?? <T: ResultProtocol> (left: T, right: @autoclosure () -> T.Value) -> T.Value {\n\treturn left.recover(right())\n}\n\n/// Returns `left` if it is a `Success`es, or `right` otherwise. Short-circuits.\npublic func ?? <T: ResultProtocol> (left: T, right: @autoclosure () -> T) -> T {\n\treturn left.recover(with: right())\n}\n\n// MARK: - migration support\n@available(*, unavailable, renamed: \"ResultProtocol\")\npublic typealias ResultType = ResultProtocol\n\n@available(*, unavailable, renamed: \"Error\")\npublic typealias ResultErrorType = Swift.Error\n\n@available(*, unavailable, renamed: \"ErrorConvertible\")\npublic typealias ErrorTypeConvertible = ErrorConvertible\n\n@available(*, deprecated, renamed: \"ErrorConvertible\")\npublic protocol ErrorProtocolConvertible: ErrorConvertible {}\n\nextension ResultProtocol {\n\t@available(*, unavailable, renamed: \"recover(with:)\")\n\tpublic func recoverWith(_ result: @autoclosure () -> Self) -> Self {\n\t\tfatalError()\n\t}\n}\n\nextension ErrorConvertible {\n\t@available(*, unavailable, renamed: \"error(from:)\")\n\tpublic static func errorFromErrorType(_ error: Swift.Error) -> Self {\n\t\tfatalError()\n\t}\n}\n"
  },
  {
    "path": "Pods/ReusableKit/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 Suyeol Jeon (xoul.kr)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Pods/ReusableKit/README.md",
    "content": "# ReusableKit\n\n![Swift](https://img.shields.io/badge/Swift-3.1-orange.svg)\n[![CocoaPods](http://img.shields.io/cocoapods/v/ReusableKit.svg)](https://cocoapods.org/pods/ReusableKit)\n[![Build Status](https://travis-ci.org/devxoul/ReusableKit.svg)](https://travis-ci.org/devxoul/ReusableKit)\n[![Codecov](https://img.shields.io/codecov/c/github/devxoul/ReusableKit.svg)](https://codecov.io/gh/devxoul/ReusableKit)\n\nGeneric reusables for Cocoa. Currently supports `UITableView` and `UICollectionView`.\n\n## At a Glance\n\n#### Before 🤢\n\n```swift\ncollectionView.register(UserCell.self, forCellWithReuseIdentifier: \"userCell\")\ncollectionView.dequeueReusableCell(withReuseIdentifier: \"userCell\", for: indexPath) as! UserCell\n```\n\n1. A hard-coded string identifier can cause a human error.\n2. A force downcasting should be avoided.\n\n#### After 😊\n\n```swift\nlet reusableUserCell = ReusableCell<UserCell>()\ncollectionView.register(reusableUserCell)\ncollectionView.dequeue(reusableUserCell) // UserCell\n```\n\n1. A string identifier is generated automatically using UUID and stored in the struct.\n2. A generic can ensure the type of the dequeued cell statically.\n\n## Example Usage\n\nIt is recommended to define reusable types as a static constants in an `enum` or a `struct`.\n\n#### UITableView\n\n```swift\n// 1. define\nenum Reusable {\n  static let headerView = ReusableCell<SectionHeaderView>()\n  static let userCell = ReusableCell<UserCell>()\n}\n\n// 2. register\ntableView.register(Reusable.headerView)\ntableView.register(Reusable.userCell)\n\n// 3. dequeue\ntableView.dequeue(Reusable.headerView, for: indexPath)\ntableView.dequeue(Reusable.userCell, for: indexPath)\n```\n\n#### UICollectionView\n\n```swift\n// 1. define\nenum Reusable {\n  static let headerView = ReusableCell<SectionHeaderView>()\n  static let photoCell = ReusableCell<PhotoCell>()\n}\n\n// 2. register\ncollection.register(Reusable.headerView, kind: .header)\ncollection.register(Reusable.photoCell)\n\n// 3. dequeue\ncollection.dequeue(Reusable.headerView, kind: .header, for: indexPath)\ncollection.dequeue(Reusable.photoCell, for: indexPath)\n```\n\n#### RxSwift Extension\n\nReusableKit supports a RxSwift extension.\n\n```swift\nusers // Observable<[String]>\n  .bind(to: collectionView.rx.items(Reusable.userCell)) { i, user, cell in\n    cell.user = user\n  }\n```\n\n## Contrubiting\n\nPull requests are welcomed 💖\n\nIn order to create Xcode project, run:\n\n```console\n$ swift package generate-xcodeproj\n```\n\n## Installation\n\n- **For iOS 8+ projects** with [CocoaPods](https://cocoapods.org):\n\n    ```ruby\n    pod 'ReusableKit'\n    pod 'ReusableKit/RxSwift'  # with RxSwift extension\n    ```\n\n## License\n\n**ReusableKit** is under MIT license. See the [LICENSE](LICENSE) file for more info.\n"
  },
  {
    "path": "Pods/ReusableKit/Sources/ReusableKit/ReusableKit.swift",
    "content": "#if os(iOS)\nimport UIKit\n\npublic protocol CellType: class {\n  var reuseIdentifier: String? { get }\n}\n\n/// A generic class that represents reusable cells.\npublic struct ReusableCell<Cell: CellType> {\n  public typealias Class = Cell\n\n  public let `class`: Class.Type = Class.self\n  public let identifier: String\n  public let nib: UINib?\n\n  /// Create and returns a new `ReusableCell` instance.\n  ///\n  /// - parameter identifier: A reuse identifier. Use random UUID string if identifier is not provided.\n  /// - parameter nib: A `UINib` instance. Use this when registering from xib.\n  public init(identifier: String? = nil, nib: UINib? = nil) {\n    self.identifier = nib?.instantiate(withOwner: nil, options: nil).lazy\n      .flatMap { ($0 as? CellType)?.reuseIdentifier }\n      .first ?? identifier ?? UUID().uuidString\n    self.nib = nib\n  }\n\n  /// A convenience initializer.\n  ///\n  /// - parameter identifier: A reuse identifier. Use random UUID string if identifier is not provided.\n  /// - parameter nibName: A name of nib.\n  public init(identifier: String? = nil, nibName: String) {\n    let nib = UINib(nibName: nibName, bundle: nil)\n    self.init(identifier: identifier, nib: nib)\n  }\n}\n\npublic protocol ViewType: class {\n}\n\n/// A generic class that represents reusable views.\npublic struct ReusableView<View: ViewType> {\n  public typealias Class = View\n\n  public let `class`: Class.Type = Class.self\n  public let identifier: String\n  public let nib: UINib?\n\n  /// Create and returns a new `ReusableView` instance.\n  ///\n  /// - parameter identifier: A reuse identifier. Use random UUID string if identifier is not provided.\n  /// - parameter nib: A `UINib` instance. Use this when registering from xib.\n  public init(identifier: String? = nil, nib: UINib? = nil) {\n    self.identifier = identifier ?? UUID().uuidString\n    self.nib = nib\n  }\n\n  /// A convenience initializer.\n  ///\n  /// - parameter identifier: A reuse identifier. Use random UUID string if identifier is not provided.\n  /// - parameter nibName: A name of nib.\n  public init(identifier: String? = nil, nibName: String) {\n    let nib = UINib(nibName: nibName, bundle: nil)\n    self.init(identifier: identifier, nib: nib)\n  }\n}\n#endif\n"
  },
  {
    "path": "Pods/ReusableKit/Sources/ReusableKit/UICollectionView+ReusableKit.swift",
    "content": "#if os(iOS)\nimport UIKit\n\n/// An enumeration that represents UICollectionView supplementary view kind.\npublic enum SupplementaryViewKind: String {\n  case header, footer\n\n  public init?(rawValue: String) {\n    switch rawValue {\n    case UICollectionElementKindSectionHeader: self = .header\n    case UICollectionElementKindSectionFooter: self = .footer\n    default: return nil\n    }\n  }\n\n  public var rawValue: String {\n    switch self {\n    case .header: return UICollectionElementKindSectionHeader\n    case .footer: return UICollectionElementKindSectionFooter\n    }\n  }\n}\n\nextension UICollectionViewCell: CellType {\n}\n\nextension UIView: ViewType {\n}\n\nextension UICollectionView {\n\n  // MARK: Cell\n\n  /// Registers a generic cell for use in creating new collection view cells.\n  public func register<Cell>(_ cell: ReusableCell<Cell>) {\n    if let nib = cell.nib {\n      self.register(nib, forCellWithReuseIdentifier: cell.identifier)\n    } else {\n      self.register(Cell.self, forCellWithReuseIdentifier: cell.identifier)\n    }\n  }\n\n  /// Returns a generic reusable cell located by its identifier.\n  public func dequeue<Cell>(_ cell: ReusableCell<Cell>, for indexPath: IndexPath) -> Cell {\n    return self.dequeueReusableCell(withReuseIdentifier: cell.identifier, for: indexPath) as! Cell\n  }\n\n  // MARK: Supplementary View\n\n  /// Registers a generic view for use in creating new supplementary views for the collection view.\n  public func register<View>(_ view: ReusableView<View>, kind: SupplementaryViewKind) {\n    self.register(view, kind: kind.rawValue)\n  }\n\n  /// Registers a generic view for use in creating new supplementary views for the collection view.\n  public func register<View>(_ view: ReusableView<View>, kind: String) {\n    if let nib = view.nib {\n      self.register(nib, forSupplementaryViewOfKind: kind, withReuseIdentifier: view.identifier)\n    } else {\n      self.register(View.self, forSupplementaryViewOfKind: kind, withReuseIdentifier: view.identifier)\n    }\n  }\n\n  /// Returns a generic reusable supplementary view located by its identifier and kind.\n  public func dequeue<View>(_ view: ReusableView<View>, kind: String, for indexPath: IndexPath) -> View {\n    return self.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: view.identifier, for: indexPath) as! View\n  }\n\n  /// Returns a generic reusable supplementary view located by its identifier and kind.\n  public func dequeue<View>(_ view: ReusableView<View>, kind: SupplementaryViewKind, for indexPath: IndexPath) -> View {\n    return self.dequeue(view, kind: kind.rawValue, for: indexPath)\n  }\n}\n#endif\n"
  },
  {
    "path": "Pods/ReusableKit/Sources/ReusableKit/UITableView+ReusableKit.swift",
    "content": "#if os(iOS)\nimport UIKit\n\nextension UITableViewCell: CellType {\n}\n\nextension UITableView {\n\n  // MARK: Cell\n\n  /// Registers a generic cell for use in creating new table cells.\n  public func register<Cell>(_ cell: ReusableCell<Cell>) {\n    if let nib = cell.nib {\n      self.register(nib, forCellReuseIdentifier: cell.identifier)\n    } else {\n      self.register(Cell.self, forCellReuseIdentifier: cell.identifier)\n    }\n  }\n\n  /// Returns a generic reusable cell located by its identifier.\n  public func dequeue<Cell>(_ cell: ReusableCell<Cell>) -> Cell? {\n    return self.dequeueReusableCell(withIdentifier: cell.identifier) as? Cell\n  }\n\n  /// Returns a generic reusable cell located by its identifier.\n  public func dequeue<Cell>(_ cell: ReusableCell<Cell>, for indexPath: IndexPath) -> Cell {\n    return self.dequeueReusableCell(withIdentifier: cell.identifier, for: indexPath) as! Cell\n  }\n\n  // MARK: View\n\n  /// Registers a generic view for use in creating new table header or footer views.\n  public func register<View>(_ cell: ReusableView<View>) {\n    if let nib = cell.nib {\n      self.register(nib, forHeaderFooterViewReuseIdentifier: cell.identifier)\n    } else {\n      self.register(View.self, forHeaderFooterViewReuseIdentifier: cell.identifier)\n    }\n  }\n\n  /// Returns a generic reusable header of footer view located by its identifier.\n  public func dequeue<View>(_ view: ReusableView<View>) -> View? {\n    return self.dequeueReusableHeaderFooterView(withIdentifier: view.identifier) as? View\n  }\n}\n#endif\n"
  },
  {
    "path": "Pods/ReusableKit/Sources/RxReusableKit/UICollectionView+RxReusableKit.swift",
    "content": "#if !COCOAPODS\nimport ReusableKit\n#endif\n\nimport RxCocoa\nimport RxSwift\n\n#if os(iOS)\nimport UIKit\n\nextension Reactive where Base: UICollectionView {\n  public func items<S: Sequence, Cell: UICollectionViewCell, O: ObservableType>(\n    _ reusableCell: ReusableCell<Cell>\n  ) -> (_ source: O)\n    -> (_ configureCell: @escaping (Int, S.Iterator.Element, Cell) -> Void)\n    -> Disposable\n    where O.E == S {\n    return { source in\n      return { configureCell in\n        return self.items(cellIdentifier: reusableCell.identifier, cellType: Cell.self)(source)(configureCell)\n      }\n    }\n  }\n}\n#endif\n"
  },
  {
    "path": "Pods/ReusableKit/Sources/RxReusableKit/UITableView+RxReusableKit.swift",
    "content": "#if !COCOAPODS\nimport ReusableKit\n#endif\n\nimport RxCocoa\nimport RxSwift\n\n#if os(iOS)\nimport UIKit\n\nextension Reactive where Base: UITableView {\n  public func items<S: Sequence, Cell: UITableViewCell, O: ObservableType>(\n    _ reusableCell: ReusableCell<Cell>\n  ) -> (_ source: O)\n    -> (_ configureCell: @escaping (Int, S.Iterator.Element, Cell) -> Void)\n    -> Disposable\n    where O.E == S {\n    return { source in\n      return { configureCell in\n        return self.items(cellIdentifier: reusableCell.identifier, cellType: Cell.self)(source)(configureCell)\n      }\n    }\n  }\n}\n#endif\n"
  },
  {
    "path": "Pods/RxAlamofire/LICENSE.md",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Junior B.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE."
  },
  {
    "path": "Pods/RxAlamofire/README.md",
    "content": "RxAlamofire\n===\n\nRxAlamofire is a [RxSwift](https://github.com/ReactiveX/RxSwift) wrapper around the elegant HTTP networking in Swift [Alamofire](https://github.com/Alamofire/Alamofire).\n\n## Getting Started\n\nWrapping RxSwift around Alamofire makes working with network requests a smoother and nicer task. Alamofire is a very powerful framework and RxSwift add the ability to compose responses in a simple and effective way.\n\nA basic usage is (considering a simple currency converter):\n\n```swift\nlet formatter = NSNumberFormatter()\nformatter.numberStyle = .CurrencyStyle\nformatter.currencyCode = \"USD\"\nif let fromValue = NSNumberFormatter().numberFromString(self.fromTextField.text!) {\n\nRxAlamofire.requestJSON(.get, sourceStringURL)\n                .debug()\n                .subscribe(onNext: { [weak self] (r, json) in\n                    if let dict = json as? [String: AnyObject] {\n                        let valDict = dict[\"rates\"] as! Dictionary<String, AnyObject>\n                        if let conversionRate = valDict[\"USD\"] as? Float {\n                            self?.toTextField.text = formatter\n                                .string(from: NSNumber(value: conversionRate * fromValue))\n                        }\n                    }\n                    }, onError: { [weak self] (error) in\n                        self?.displayError(error as NSError)\n                })\n                .addDisposableTo(disposeBag)\n\n} else {\n    self.toTextField.text = \"Invalid Input!\"\n}\n```\n\n## Example Usages\n\nCurrently, the library features the following extensions:\n\n```swift \nlet stringURL = \"\"\n\n// MARK: NSURLSession simple and fast\nlet session = NSURLSession.sharedSession()\n\n_ = session.rx\n        .json(.get, stringURL)\n        .observeOn(MainScheduler.instance)\n        .subscribe { print($0) }\n\n_ = session\n    .rx.data(.get, stringURL)\n    .observeOn(MainScheduler.instance)\n    .subscribe { print($0) }\n\n// MARK: With Alamofire engine\n\n_ = json(.get, stringURL)\n    .observeOn(MainScheduler.instance)\n    .subscribe { print($0) }\n\n_ = request(.get, stringURL)\n    .flatMap { request in\n        return request.validate(statusCode: 200..<300)\n        .validate(contentType: [\"text/json\"])\n            .rx.json()\n    }\n    .observeOn(MainScheduler.instance)\n    .subscribe { print($0) }\n\n// progress\n_ = request(.get, stringURL)\n    .flatMap {\n        $0\n        .validate(statusCode: 200 ..< 300)\n        .validate(contentType: [\"text/json\"])\n        .rx.progress()\n    }\n    .observeOn(MainScheduler.instance)\n    .subscribe { print($0) }\n\n// just fire upload and display progress\n_ = upload(Data(), urlRequest: try! RxAlamofire.urlRequest(.get, stringURL))\n    .flatMap {\n        $0\n        .validate(statusCode: 200 ..< 300)\n            .validate(contentType: [\"text/json\"])\n            .rx.progress()\n    }\n    .observeOn(MainScheduler.instance)\n    .subscribe { print($0) }\n\n// progress and final result\n// uploading files with progress showing is processing intensive operation anyway, so\n// this doesn't add much overhead\n_ = request(.get, stringURL)\n    .flatMap { request -> Observable<(Data?, RxProgress)> in\n        let validatedRequest = request\n            .validate(statusCode: 200 ..< 300)\n            .validate(contentType: [\"text/json\"])\n        \n        let dataPart = validatedRequest\n            .rx.data()\n            .map { d -> Data? in d }\n            .startWith(nil as Data?)\n        let progressPart = validatedRequest.rx.progress()\n        return Observable.combineLatest(dataPart, progressPart) { ($0, $1) }\n    }\n    .observeOn(MainScheduler.instance)\n    .subscribe { print($0) }\n\n\n// MARK: Alamofire manager\n// same methods with any alamofire manager\n\nlet manager = Manager.sharedInstance\n\n// simple case\n_ = manager.rx.json(.get, stringURL)\n    .observeOn(MainScheduler.instance)\n    .subscribe { print($0) }\n\n\n// URLHTTPResponse + JSON\n_ = manager.rx.responseJSON(.get, stringURL)\n    .observeOn(MainScheduler.instance)\n    .subscribe { print($0) }\n\n// URLHTTPResponse + String\n_ = manager.rx.responseString(.get, stringURL)\n    .observeOn(MainScheduler.instance)\n    .subscribe { print($0) }\n\n// URLHTTPResponse + Validation + String\n_ = manager.rx.request(.get, stringURL)\n    .flatMap {\n        $0\n            .validate(statusCode: 200 ..< 300)\n            .validate(contentType: [\"text/json\"])\n            .rx.string()\n    }\n    .observeOn(MainScheduler.instance)\n    .subscribe { print($0) }\n\n// URLHTTPResponse + Validation + URLHTTPResponse + String\n_ = manager.rx.request(.get, stringURL)\n    .flatMap {\n        $0\n        .validate(statusCode: 200 ..< 300)\n        .validate(contentType: [\"text/json\"])\n        .rx.responseString()\n    }\n    .observeOn(MainScheduler.instance)\n    .subscribe { print($0) }\n\n// URLHTTPResponse + Validation + URLHTTPResponse + String + Progress\n_ = manager.rx.request(.get, stringURL)\n    .flatMap { request -> Observable<(String?, RxProgress)> in\n        let validatedRequest = request\n            .validate(statusCode: 200 ..< 300)\n            .validate(contentType: [\"text/something\"])\n            \n        let stringPart = validatedRequest\n            .rx.string()\n            .map { d -> String? in d }\n            .startWith(nil as String?)\n        let progressPart = validatedRequest.rx.progress()\n        return Observable.combineLatest(stringPart, progressPart) { ($0, $1) }\n    }\n    .observeOn(MainScheduler.instance)\n    .subscribe { print($0) }\n```\n\n## Installation\n\nThere are two ways to install RxAlamofire\n\n### CocoaPods\n\nJust add to your project's `Podfile`:\n\n```\npod 'RxAlamofire'\n```\n\n### Carthage\n\nAdd following to `Cartfile`:\n\n```\ngithub \"RxSwiftCommunity/RxAlamofire\" \"master\"\n```\n\n### Manually\n\nTo manual install this extension you should get the `RxAlamofire/Source/RxAlamofire.swift` imported into your project, alongside RxSwift and Alamofire.\n\n## Requirements\n\nRxAlamofire requires Swift 4.0 and dedicated versions of Alamofire (4.5.1) and RxSwift (4.0.0-beta.0).\n"
  },
  {
    "path": "Pods/RxAlamofire/Sources/RxAlamofire.swift",
    "content": "//\n//  RxAlamofire.swift\n//  RxAlamofire\n//\n//  Created by Junior B. (@bontojr) on 23/08/15.\n//  Developed with the kind help of Krunoslav Zaher (@KrunoslavZaher)\n//\n//  Updated by Ivan Đikić for the latest version of Alamofire(3) and RxSwift(2) on 21/10/15\n//  Updated by Krunoslav Zaher to better wrap Alamofire (3) on 1/10/15\n//\n//  Copyright © 2015 Bonto.ch. All rights reserved.\n//\n\nimport Foundation\n\nimport Alamofire\nimport RxSwift\n\n/// Default instance of unknown error\npublic let RxAlamofireUnknownError = NSError(domain: \"RxAlamofireDomain\", code: -1, userInfo: nil)\n\n// MARK: Convenience functions\n\n/**\n    Creates a NSMutableURLRequest using all necessary parameters.\n\n    - parameter method: Alamofire method object\n    - parameter url: An object adopting `URLConvertible`\n    - parameter parameters: A dictionary containing all necessary options\n    - parameter encoding: The kind of encoding used to process parameters\n    - parameter header: A dictionary containing all the additional headers\n    - returns: An instance of `NSMutableURLRequest`\n*/\n\npublic func urlRequest(_ method: Alamofire.HTTPMethod,\n    _ url: URLConvertible,\n    parameters: [String: Any]? = nil,\n    encoding: ParameterEncoding = URLEncoding.default,\n    headers: [String: String]? = nil)\n    throws -> Foundation.URLRequest\n{\n    var mutableURLRequest = Foundation.URLRequest(url: try url.asURL())\n    mutableURLRequest.httpMethod = method.rawValue\n\n    if let headers = headers {\n        for (headerField, headerValue) in headers {\n            mutableURLRequest.setValue(headerValue, forHTTPHeaderField: headerField)\n        }\n    }\n\n    if let parameters = parameters {\n        mutableURLRequest = try encoding.encode(mutableURLRequest, with: parameters)\n    }\n\n    return mutableURLRequest\n}\n\n// MARK: Request\n\n/**\nCreates an observable of the generated `Request`.\n\n- parameter method: Alamofire method object\n- parameter url: An object adopting `URLConvertible`\n- parameter parameters: A dictionary containing all necessary options\n- parameter encoding: The kind of encoding used to process parameters\n- parameter header: A dictionary containing all the additional headers\n\n- returns: An observable of a the `Request`\n*/\npublic func request(_ method: Alamofire.HTTPMethod,\n    _ url: URLConvertible,\n    parameters: [String: Any]? = nil,\n    encoding: ParameterEncoding = URLEncoding.default,\n    headers: [String: String]? = nil)\n    -> Observable<DataRequest>\n{\n    return SessionManager.default.rx.request(\n        method,\n        url,\n        parameters: parameters,\n        encoding: encoding,\n        headers: headers\n    )\n}\n\n/**\n Creates an observable of the generated `Request`.\n\n - parameter urlRequest: An object adopting `URLRequestConvertible`\n\n - returns: An observable of a the `Request`\n */\npublic func request(_ urlRequest: URLRequestConvertible) -> Observable<DataRequest> {\n  return SessionManager.default.rx.request(urlRequest: urlRequest)\n}\n\n// MARK: data\n\n/**\nCreates an observable of the `(NSHTTPURLResponse, NSData)` instance.\n\n- parameter method: Alamofire method object\n- parameter url: An object adopting `URLConvertible`\n- parameter parameters: A dictionary containing all necessary options\n- parameter encoding: The kind of encoding used to process parameters\n- parameter header: A dictionary containing all the additional headers\n\n- returns: An observable of a tuple containing `(NSHTTPURLResponse, NSData)`\n*/\npublic func requestData(_ method: Alamofire.HTTPMethod,\n    _ url: URLConvertible,\n    parameters: [String: Any]? = nil,\n    encoding: ParameterEncoding = URLEncoding.default,\n    headers: [String: String]? = nil)\n    -> Observable<(HTTPURLResponse, Data)>\n{\n    return SessionManager.default.rx.responseData(\n        method,\n        url,\n        parameters: parameters,\n        encoding: encoding,\n        headers: headers\n    )\n}\n\n/**\n Creates an observable of the `(NSHTTPURLResponse, NSData)` instance.\n\n - parameter urlRequest: An object adopting `URLRequestConvertible`\n\n - returns: An observable of a tuple containing `(NSHTTPURLResponse, NSData)`\n */\npublic func requestData(_ urlRequest: URLRequestConvertible) -> Observable<(HTTPURLResponse, Data)> {\n    return request(urlRequest).flatMap { $0.rx.responseData() }\n}\n\n/**\n Creates an observable of the returned data.\n\n - parameter method: Alamofire method object\n - parameter url: An object adopting `URLConvertible`\n - parameter parameters: A dictionary containing all necessary options\n - parameter encoding: The kind of encoding used to process parameters\n - parameter header: A dictionary containing all the additional headers\n\n - returns: An observable of `NSData`\n */\npublic func data(_ method: Alamofire.HTTPMethod,\n    _ url: URLConvertible,\n    parameters: [String: Any]? = nil,\n    encoding: ParameterEncoding = URLEncoding.default,\n    headers: [String: String]? = nil)\n    -> Observable<Data>\n{\n    return SessionManager.default.rx.data(\n        method,\n        url,\n        parameters: parameters,\n        encoding: encoding,\n        headers: headers\n    )\n}\n\n// MARK: string\n\n/**\nCreates an observable of the returned decoded string and response.\n\n- parameter method: Alamofire method object\n- parameter url: An object adopting `URLConvertible`\n- parameter parameters: A dictionary containing all necessary options\n- parameter encoding: The kind of encoding used to process parameters\n- parameter header: A dictionary containing all the additional headers\n\n- returns: An observable of the tuple `(NSHTTPURLResponse, String)`\n*/\npublic func requestString(_ method: Alamofire.HTTPMethod,\n    _ url: URLConvertible,\n    parameters: [String: Any]? = nil,\n    encoding: ParameterEncoding = URLEncoding.default,\n    headers: [String: String]? = nil)\n    -> Observable<(HTTPURLResponse, String)>\n{\n    return SessionManager.default.rx.responseString(\n        method,\n        url,\n        parameters: parameters,\n        encoding: encoding,\n        headers: headers\n    )\n}\n\n/**\n Creates an observable of the returned decoded string and response.\n\n - parameter urlRequest: An object adopting `URLRequestConvertible`\n\n - returns: An observable of the tuple `(NSHTTPURLResponse, String)`\n */\npublic func requestString(_ urlRequest: URLRequestConvertible) -> Observable<(HTTPURLResponse, String)> {\n    return request(urlRequest).flatMap { $0.rx.responseString() }\n}\n\n/**\n Creates an observable of the returned decoded string.\n\n - parameter method: Alamofire method object\n - parameter url: An object adopting `URLConvertible`\n - parameter parameters: A dictionary containing all necessary options\n - parameter encoding: The kind of encoding used to process parameters\n - parameter header: A dictionary containing all the additional headers\n\n - returns: An observable of `String`\n */\npublic func string(_ method: Alamofire.HTTPMethod,\n    _ url: URLConvertible,\n    parameters: [String: Any]? = nil,\n    encoding: ParameterEncoding = URLEncoding.default,\n    headers: [String: String]? = nil)\n    -> Observable<String>\n{\n    return SessionManager.default.rx.string(\n        method,\n        url,\n        parameters: parameters,\n        encoding: encoding,\n        headers: headers\n    )\n}\n\n// MARK: JSON\n\n/**\nCreates an observable of the returned decoded JSON as `AnyObject` and the response.\n\n- parameter method: Alamofire method object\n- parameter url: An object adopting `URLConvertible`\n- parameter parameters: A dictionary containing all necessary options\n- parameter encoding: The kind of encoding used to process parameters\n- parameter header: A dictionary containing all the additional headers\n\n- returns: An observable of the tuple `(NSHTTPURLResponse, AnyObject)`\n*/\npublic func requestJSON(_ method: Alamofire.HTTPMethod,\n    _ url: URLConvertible,\n    parameters: [String: Any]? = nil,\n    encoding: ParameterEncoding = URLEncoding.default,\n    headers: [String: String]? = nil)\n    -> Observable<(HTTPURLResponse, Any)>\n{\n    return SessionManager.default.rx.responseJSON(\n        method,\n        url,\n        parameters: parameters,\n        encoding: encoding,\n        headers: headers\n    )\n}\n\n/**\n Creates an observable of the returned decoded JSON as `AnyObject` and the response.\n\n - parameter urlRequest: An object adopting `URLRequestConvertible`\n\n - returns: An observable of the tuple `(NSHTTPURLResponse, AnyObject)`\n */\npublic func requestJSON(_ urlRequest: URLRequestConvertible) -> Observable<(HTTPURLResponse, Any)> {\n    return request(urlRequest).flatMap { $0.rx.responseJSON() }\n}\n\n/**\n Creates an observable of the returned decoded JSON.\n\n - parameter method: Alamofire method object\n - parameter url: An object adopting `URLConvertible`\n - parameter parameters: A dictionary containing all necessary options\n - parameter encoding: The kind of encoding used to process parameters\n - parameter header: A dictionary containing all the additional headers\n\n - returns: An observable of the decoded JSON as `Any`\n */\npublic func json(_ method: Alamofire.HTTPMethod,\n    _ url: URLConvertible,\n    parameters: [String: Any]? = nil,\n    encoding: ParameterEncoding = URLEncoding.default,\n    headers: [String: String]? = nil)\n    -> Observable<Any>\n{\n    return SessionManager.default.rx.json(\n        method,\n        url,\n        parameters: parameters,\n        encoding: encoding,\n        headers: headers\n    )\n}\n\n// MARK: Upload\n\n/**\n    Returns an observable of a request using the shared manager instance to upload a specific file to a specified URL.\n    The request is started immediately.\n\n    - parameter urlRequest: The request object to start the upload.\n    - paramenter file: An instance of NSURL holding the information of the local file.\n    - returns: The observable of `UploadRequest` for the created request.\n */\npublic func upload(_ file: URL, urlRequest: URLRequestConvertible) -> Observable<UploadRequest> {\n    return SessionManager.default.rx.upload(file, urlRequest: urlRequest)\n}\n\n/**\n    Returns an observable of a request using the shared manager instance to upload any data to a specified URL.\n    The request is started immediately.\n\n    - parameter urlRequest: The request object to start the upload.\n    - paramenter data: An instance of NSData holdint the data to upload.\n    - returns: The observable of `UploadRequest` for the created request.\n */\npublic func upload(_ data: Data, urlRequest: URLRequestConvertible) -> Observable<UploadRequest> {\n    return SessionManager.default.rx.upload(data , urlRequest: urlRequest)\n}\n\n/**\n    Returns an observable of a request using the shared manager instance to upload any stream to a specified URL.\n    The request is started immediately.\n\n    - parameter urlRequest: The request object to start the upload.\n    - paramenter stream: The stream to upload.\n    - returns: The observable of `Request` for the created upload request.\n */\npublic func upload(_ stream: InputStream, urlRequest: URLRequestConvertible) -> Observable<UploadRequest> {\n    return SessionManager.default.rx.upload(stream, urlRequest: urlRequest)\n}\n\n// MARK: Download\n\n/**\n    Creates a download request using the shared manager instance for the specified URL request.\n    - parameter urlRequest:  The URL request.\n    - parameter destination: The closure used to determine the destination of the downloaded file.\n    - returns: The observable of `DownloadRequest` for the created download request.\n */\npublic func download(_ urlRequest: URLRequestConvertible,\n                     to destination: @escaping DownloadRequest.DownloadFileDestination) -> Observable<DownloadRequest> {\n    return SessionManager.default.rx.download(urlRequest, to: destination)\n}\n\n// MARK: Resume Data\n\n/**\n    Creates a request using the shared manager instance for downloading from the resume data produced from a\n    previous request cancellation.\n\n    - parameter resumeData:  The resume data. This is an opaque data blob produced by `NSURLSessionDownloadTask`\n    when a task is cancelled. See `NSURLSession -downloadTaskWithResumeData:` for additional\n    information.\n    - parameter destination: The closure used to determine the destination of the downloaded file.\n    - returns: The observable of `Request` for the created download request.\n*/\npublic func download(resumeData: Data,\n                     to destination: @escaping DownloadRequest.DownloadFileDestination) -> Observable<DownloadRequest> {\n    return SessionManager.default.rx.download(resumeData: resumeData, to: destination)\n}\n\n// MARK: Manager - Extension of Manager\n\nextension SessionManager: ReactiveCompatible {\n}\n\nprotocol RxAlamofireRequest {\n\n    func responseWith(completionHandler: @escaping (RxAlamofireResponse) -> Void)\n    func resume()\n    func cancel()\n}\n\nprotocol RxAlamofireResponse {\n    var error: Error? {get}\n}\n\nextension DefaultDataResponse: RxAlamofireResponse {}\n\nextension DefaultDownloadResponse: RxAlamofireResponse {}\n\nextension DataRequest: RxAlamofireRequest {\n    func responseWith(completionHandler: @escaping (RxAlamofireResponse) -> Void) {\n        response { (response) in\n            completionHandler(response)\n        }\n    }\n}\n\nextension DownloadRequest: RxAlamofireRequest {\n    func responseWith(completionHandler: @escaping (RxAlamofireResponse) -> Void) {\n        response { (response) in\n            completionHandler(response)\n        }\n    }\n}\n\n\nextension Reactive where Base: SessionManager {\n\n    // MARK: Generic request convenience\n\n    /**\n    Creates an observable of the DataRequest.\n\n    - parameter createRequest: A function used to create a `Request` using a `Manager`\n\n    - returns: A generic observable of created data request\n    */\n    func request<R: RxAlamofireRequest>(_ createRequest: @escaping (SessionManager) throws -> R) -> Observable<R> {\n        return Observable.create { observer -> Disposable in\n            let request: R\n            do {\n                request = try createRequest(self.base)\n                observer.on(.next(request))\n                request.responseWith(completionHandler: { (response) in\n                    if let error = response.error {\n                        observer.on(.error(error))\n                    } else {\n                        observer.on(.completed)\n                    }\n                })\n\n                if !self.base.startRequestsImmediately {\n                    request.resume()\n                }\n\n                return Disposables.create {\n                    request.cancel()\n                }\n            }\n            catch let error {\n                observer.on(.error(error))\n                return Disposables.create()\n            }\n        }\n    }\n\n\n    /**\n     Creates an observable of the `Request`.\n\n     - parameter method: Alamofire method object\n     - parameter url: An object adopting `URLConvertible`\n     - parameter parameters: A dictionary containing all necessary options\n     - parameter encoding: The kind of encoding used to process parameters\n     - parameter header: A dictionary containing all the additional headers\n\n     - returns: An observable of the `Request`\n     */\n    public func request(_ method: Alamofire.HTTPMethod,\n        _ url: URLConvertible,\n        parameters: [String: Any]? = nil,\n        encoding: ParameterEncoding = URLEncoding.default,\n        headers: [String: String]? = nil\n    )\n        -> Observable<DataRequest>\n    {\n        return request { manager in\n            return manager.request(url,\n                                   method: method,\n                                   parameters: parameters,\n                                   encoding: encoding,\n                                   headers: headers)\n        }\n    }\n\n    /**\n     Creates an observable of the `Request`.\n\n     - parameter URLRequest: An object adopting `URLRequestConvertible`\n     - parameter parameters: A dictionary containing all necessary options\n     - parameter encoding: The kind of encoding used to process parameters\n     - parameter header: A dictionary containing all the additional headers\n\n     - returns: An observable of the `Request`\n     */\n    public func request(urlRequest: URLRequestConvertible)\n        -> Observable<DataRequest>\n    {\n        return request { manager in\n            return manager.request(urlRequest)\n        }\n    }\n\n    // MARK: data\n\n    /**\n    Creates an observable of the data.\n\n    - parameter url: An object adopting `URLConvertible`\n    - parameter parameters: A dictionary containing all necessary options\n    - parameter encoding: The kind of encoding used to process parameters\n    - parameter header: A dictionary containing all the additional headers\n\n    - returns: An observable of the tuple `(NSHTTPURLResponse, NSData)`\n    */\n    public func responseData(_ method: Alamofire.HTTPMethod,\n        _ url: URLConvertible,\n        parameters: [String: Any]? = nil,\n        encoding: ParameterEncoding = URLEncoding.default,\n        headers: [String: String]? = nil\n    )\n        -> Observable<(HTTPURLResponse, Data)>\n    {\n        return request(\n            method,\n            url,\n            parameters: parameters,\n            encoding: encoding,\n            headers: headers\n        ).flatMap { $0.rx.responseData() }\n    }\n\n    /**\n     Creates an observable of the data.\n\n     - parameter URLRequest: An object adopting `URLRequestConvertible`\n     - parameter parameters: A dictionary containing all necessary options\n     - parameter encoding: The kind of encoding used to process parameters\n     - parameter header: A dictionary containing all the additional headers\n\n     - returns: An observable of `NSData`\n     */\n    public func data(_ method: Alamofire.HTTPMethod,\n        _ url: URLConvertible,\n        parameters: [String: Any]? = nil,\n        encoding: ParameterEncoding = URLEncoding.default,\n        headers: [String: String]? = nil\n        )\n        -> Observable<Data>\n    {\n        return request(\n            method,\n            url,\n            parameters: parameters,\n            encoding: encoding,\n            headers: headers\n            ).flatMap { $0.rx.data() }\n    }\n\n    // MARK: string\n\n    /**\n    Creates an observable of the tuple `(NSHTTPURLResponse, String)`.\n\n    - parameter url: An object adopting `URLRequestConvertible`\n    - parameter parameters: A dictionary containing all necessary options\n    - parameter encoding: The kind of encoding used to process parameters\n    - parameter header: A dictionary containing all the additional headers\n\n    - returns: An observable of the tuple `(NSHTTPURLResponse, String)`\n    */\n    public func responseString(_ method: Alamofire.HTTPMethod,\n        _ url: URLConvertible,\n        parameters: [String: Any]? = nil,\n        encoding: ParameterEncoding = URLEncoding.default,\n        headers: [String: String]? = nil\n    )\n        -> Observable<(HTTPURLResponse, String)>\n    {\n        return request(\n            method,\n            url,\n            parameters: parameters,\n            encoding: encoding,\n            headers: headers\n        ).flatMap { $0.rx.responseString() }\n    }\n\n    /**\n     Creates an observable of the data encoded as String.\n\n     - parameter url: An object adopting `URLConvertible`\n     - parameter parameters: A dictionary containing all necessary options\n     - parameter encoding: The kind of encoding used to process parameters\n     - parameter header: A dictionary containing all the additional headers\n\n     - returns: An observable of `String`\n     */\n    public func string(_ method: Alamofire.HTTPMethod,\n        _ url: URLConvertible,\n        parameters: [String: Any]? = nil,\n        encoding: ParameterEncoding = URLEncoding.default,\n        headers: [String: String]? = nil\n        )\n        -> Observable<String>\n    {\n        return request(\n            method,\n            url,\n            parameters: parameters,\n            encoding: encoding,\n            headers: headers\n            )\n            .flatMap { (request) -> Observable<String> in\n                return request.rx.string()\n            }\n    }\n\n    // MARK: JSON\n\n    /**\n    Creates an observable of the data decoded from JSON and processed as tuple `(NSHTTPURLResponse, AnyObject)`.\n\n    - parameter url: An object adopting `URLRequestConvertible`\n    - parameter parameters: A dictionary containing all necessary options\n    - parameter encoding: The kind of encoding used to process parameters\n    - parameter header: A dictionary containing all the additional headers\n\n    - returns: An observable of the tuple `(NSHTTPURLResponse, AnyObject)`\n    */\n    public func responseJSON(_ method: Alamofire.HTTPMethod,\n        _ url: URLConvertible,\n        parameters: [String: Any]? = nil,\n        encoding: ParameterEncoding = URLEncoding.default,\n        headers: [String: String]? = nil\n    )\n        -> Observable<(HTTPURLResponse, Any)>\n    {\n        return request(method,\n            url,\n            parameters: parameters,\n            encoding: encoding,\n            headers: headers\n        ).flatMap { $0.rx.responseJSON() }\n    }\n\n    /**\n     Creates an observable of the data decoded from JSON and processed as `AnyObject`.\n\n     - parameter URLRequest: An object adopting `URLRequestConvertible`\n     - parameter parameters: A dictionary containing all necessary options\n     - parameter encoding: The kind of encoding used to process parameters\n     - parameter header: A dictionary containing all the additional headers\n\n     - returns: An observable of `AnyObject`\n     */\n    public func json(_ method: Alamofire.HTTPMethod,\n        _ url: URLConvertible,\n        parameters: [String: Any]? = nil,\n        encoding: ParameterEncoding = URLEncoding.default,\n        headers: [String: String]? = nil\n        )\n        -> Observable<Any>\n    {\n        return request(\n            method,\n            url,\n            parameters: parameters,\n            encoding: encoding,\n            headers: headers\n            ).flatMap { $0.rx.json() }\n    }\n\n    // MARK: Upload\n\n    /**\n     Returns an observable of a request using the shared manager instance to upload a specific file to a specified URL.\n     The request is started immediately.\n\n     - parameter urlRequest: The request object to start the upload.\n     - paramenter file: An instance of NSURL holding the information of the local file.\n     - returns: The observable of `AnyObject` for the created request.\n     */\n    public func upload(_ file: URL, urlRequest: URLRequestConvertible) -> Observable<UploadRequest> {\n\n        return request { manager in\n            return manager.upload(file, with: urlRequest)\n        }\n    }\n\n    /**\n     Returns an observable of a request using the shared manager instance to upload any data to a specified URL.\n     The request is started immediately.\n\n     - parameter urlRequest: The request object to start the upload.\n     - paramenter data: An instance of Data holdint the data to upload.\n     - returns: The observable of `UploadRequest` for the created request.\n     */\n    public func upload(_ data: Data, urlRequest: URLRequestConvertible) -> Observable<UploadRequest> {\n        return request { manager in\n            return manager.upload(data, with: urlRequest)\n        }\n    }\n\n    /**\n     Returns an observable of a request using the shared manager instance to upload any stream to a specified URL.\n     The request is started immediately.\n\n     - parameter urlRequest: The request object to start the upload.\n     - paramenter stream: The stream to upload.\n     - returns: The observable of `(NSData?, RxProgress)` for the created upload request.\n     */\n    public func upload(_ stream: InputStream,\n                       urlRequest: URLRequestConvertible) -> Observable<UploadRequest> {\n        return request { manager in\n            return manager.upload(stream, with: urlRequest)\n        }\n    }\n\n    // MARK: Download\n\n    /**\n     Creates a download request using the shared manager instance for the specified URL request.\n     - parameter urlRequest:  The URL request.\n     - parameter destination: The closure used to determine the destination of the downloaded file.\n     - returns: The observable of `(NSData?, RxProgress)` for the created download request.\n     */\n    public func download(_ urlRequest: URLRequestConvertible,\n                         to destination: @escaping DownloadRequest.DownloadFileDestination) -> Observable<DownloadRequest> {\n        return request { manager in\n            return manager.download(urlRequest, to: destination)\n        }\n    }\n\n    /**\n    Creates a request using the shared manager instance for downloading with a resume data produced from a\n    previous request cancellation.\n\n    - parameter resumeData:  The resume data. This is an opaque data blob produced by `NSURLSessionDownloadTask`\n    when a task is cancelled. See `NSURLSession -downloadTaskWithResumeData:` for additional\n    information.\n    - parameter destination: The closure used to determine the destination of the downloaded file.\n    - returns: The observable of `(NSData?, RxProgress)` for the created download request.\n    */\n    public func download(resumeData: Data,\n                         to destination: @escaping DownloadRequest.DownloadFileDestination) -> Observable<DownloadRequest> {\n        return request { manager in\n            return manager.download(resumingWith: resumeData, to: destination)\n        }\n    }\n}\n\n// MARK: Request - Common Response Handlers\n\nextension ObservableType where E == DataRequest {\n    public func responseJSON() -> Observable<DataResponse<Any>> {\n        return self.flatMap { $0.rx.responseJSON() }\n    }\n}\n\nextension Request: ReactiveCompatible {\n}\n\nextension Reactive where Base: DataRequest {\n\n    // MARK: Defaults\n\n    /// - returns: A validated request based on the status code\n    func validateSuccessfulResponse() -> DataRequest {\n        return self.base.validate(statusCode: 200 ..< 300)\n    }\n\n    /**\n     Transform a request into an observable of the response and serialized object.\n\n     - parameter queue: The dispatch queue to use.\n     - parameter responseSerializer: The the serializer.\n     - returns: The observable of `(NSHTTPURLResponse, T.SerializedObject)` for the created download request.\n     */\n    public func responseResult<T: DataResponseSerializerProtocol>(queue: DispatchQueue? = nil,\n        responseSerializer: T)\n        -> Observable<(HTTPURLResponse, T.SerializedObject)>\n    {\n        return Observable.create { observer in\n            let dataRequest = self.base\n                .response(queue: queue, responseSerializer: responseSerializer) { (packedResponse) -> Void in\n                switch packedResponse.result {\n                case .success(let result):\n                    if let httpResponse = packedResponse.response {\n                        observer.on(.next((httpResponse, result)))\n                        observer.on(.completed)\n                    }\n                    else {\n                        observer.on(.error(RxAlamofireUnknownError))\n                    }\n                case .failure(let error):\n                    observer.on(.error(error as Error))\n                }\n            }\n            return Disposables.create {\n                dataRequest.cancel()\n            }\n        }\n    }\n\n    public func responseJSON() -> Observable<DataResponse<Any>> {\n        return Observable.create { observer in\n            let request = self.base\n\n            request.responseJSON { response in\n                if let error = response.result.error {\n                    observer.on(.error(error))\n                } else {\n                    observer.on(.next(response))\n                    observer.on(.completed)\n                }\n            }\n\n            return Disposables.create {\n                request.cancel()\n            }\n        }\n    }\n\n    /**\n     Transform a request into an observable of the serialized object.\n\n     - parameter queue: The dispatch queue to use.\n     - parameter responseSerializer: The the serializer.\n     - returns: The observable of `T.SerializedObject` for the created download request.\n     */\n    public func result<T: DataResponseSerializerProtocol>(\n        queue: DispatchQueue? = nil,\n        responseSerializer: T)\n        -> Observable<T.SerializedObject>\n    {\n        return Observable.create { observer in\n            let dataRequest = self.validateSuccessfulResponse()\n                .response(queue: queue, responseSerializer: responseSerializer) { (packedResponse) -> Void in\n                    switch packedResponse.result {\n                    case .success(let result):\n                        if let _ = packedResponse.response {\n                            observer.on(.next(result))\n                            observer.on(.completed)\n                        }\n                        else {\n                            observer.on(.error(RxAlamofireUnknownError))\n                        }\n                    case .failure(let error):\n                        observer.on(.error(error as Error))\n                    }\n                }\n            return Disposables.create {\n                dataRequest.cancel()\n            }\n        }\n    }\n\n    /**\n    Returns an `Observable` of NSData for the current request.\n\n    - parameter cancelOnDispose: Indicates if the request has to be canceled when the observer is disposed, **default:** `false`\n\n    - returns: An instance of `Observable<NSData>`\n    */\n    public func responseData() -> Observable<(HTTPURLResponse, Data)> {\n        return responseResult(responseSerializer: DataRequest.dataResponseSerializer())\n    }\n\n    public func data() -> Observable<Data> {\n        return result(responseSerializer: DataRequest.dataResponseSerializer())\n    }\n\n    /**\n    Returns an `Observable` of a String for the current request\n\n    - parameter encoding: Type of the string encoding, **default:** `nil`\n\n    - returns: An instance of `Observable<String>`\n    */\n    public func responseString(encoding: String.Encoding? = nil) -> Observable<(HTTPURLResponse, String)> {\n        return responseResult(responseSerializer: Base.stringResponseSerializer(encoding: encoding))\n    }\n\n    public func string(encoding: String.Encoding? = nil) -> Observable<String> {\n        return result(responseSerializer: Base.stringResponseSerializer(encoding: encoding))\n    }\n\n    /**\n    Returns an `Observable` of a serialized JSON for the current request.\n\n    - parameter options: Reading options for JSON decoding process, **default:** `.AllowFragments`\n\n    - returns: An instance of `Observable<AnyObject>`\n    */\n    public func responseJSON(options: JSONSerialization.ReadingOptions = .allowFragments) -> Observable<(HTTPURLResponse, Any)> {\n        return responseResult(responseSerializer: Base.jsonResponseSerializer(options: options))\n    }\n\n    /**\n     Returns an `Observable` of a serialized JSON for the current request.\n\n     - parameter options: Reading options for JSON decoding process, **default:** `.AllowFragments`\n\n     - returns: An instance of `Observable<AnyObject>`\n     */\n    public func json(options: JSONSerialization.ReadingOptions = .allowFragments) -> Observable<Any> {\n        return result(responseSerializer: Base.jsonResponseSerializer(options: options))\n    }\n\n    /**\n    Returns and `Observable` of a serialized property list for the current request.\n\n    - parameter options: Property list reading options, **default:** `NSPropertyListReadOptions()`\n\n    - returns: An instance of `Observable<AnyData>`\n    */\n    public func responsePropertyList(options: PropertyListSerialization.ReadOptions = PropertyListSerialization.ReadOptions()) -> Observable<(HTTPURLResponse, Any)> {\n        return responseResult(responseSerializer: Base.propertyListResponseSerializer(options: options))\n    }\n\n    public func propertyList(options: PropertyListSerialization.ReadOptions = PropertyListSerialization.ReadOptions()) -> Observable<Any> {\n        return result(responseSerializer: Base.propertyListResponseSerializer(options: options))\n    }\n\n    // MARK: Request - Upload and download progress\n\n    /**\n    Returns an `Observable` for the current progress status.\n\n    Parameters on observed tuple:\n\n    1. bytes written so far.\n    1. total bytes to write.\n\n    - returns: An instance of `Observable<RxProgress>`\n    */\n    public func progress() -> Observable<RxProgress> {\n        return Observable.create { observer in\n            self.base.downloadProgress { progress in\n                let rxProgress = RxProgress(bytesWritten: progress.completedUnitCount,\n                                            totalBytes: progress.totalUnitCount)\n                observer.on(.next(rxProgress))\n                if rxProgress.bytesWritten >= rxProgress.totalBytes {\n                    observer.on(.completed)\n                }\n            }\n            return Disposables.create()\n            }\n            // warm up a bit :)\n            .startWith(RxProgress(bytesWritten: 0, totalBytes: 0))\n    }\n}\n\nextension Reactive where Base: DownloadRequest {\n    /**\n     Returns an `Observable` for the current progress status.\n\n     Parameters on observed tuple:\n\n     1. bytes written so far.\n     1. total bytes to write.\n\n     - returns: An instance of `Observable<RxProgress>`\n     */\n    public func progress() -> Observable<RxProgress> {\n        return Observable.create { observer in\n            self.base.downloadProgress { progress in\n                let rxProgress = RxProgress(bytesWritten: progress.completedUnitCount,\n                                            totalBytes: progress.totalUnitCount)\n                observer.on(.next(rxProgress))\n                if rxProgress.bytesWritten >= rxProgress.totalBytes {\n                    observer.on(.completed)\n                }\n            }\n            return Disposables.create()\n            }\n            // warm up a bit :)\n            .startWith(RxProgress(bytesWritten: 0, totalBytes: 0))\n    }\n}\n\n// MARK: RxProgress\npublic struct RxProgress {\n    public let bytesWritten: Int64\n    public let totalBytes: Int64\n\n    public init(bytesWritten: Int64, totalBytes: Int64) {\n        self.bytesWritten = bytesWritten\n        self.totalBytes = totalBytes\n    }\n}\n\nextension RxProgress {\n    public var bytesRemaining: Int64 {\n        return totalBytes - bytesWritten\n    }\n\n    public var completed: Float {\n        if totalBytes > 0 {\n            return Float(bytesWritten) / Float(totalBytes)\n        }\n        else {\n            return 0\n        }\n    }\n}\n\nextension RxProgress: Equatable {}\n\npublic func ==(lhs: RxProgress, rhs: RxProgress) -> Bool {\n    return lhs.bytesWritten == rhs.bytesWritten &&\n        lhs.totalBytes == rhs.totalBytes\n}\n"
  },
  {
    "path": "Pods/RxCocoa/LICENSE.md",
    "content": "**The MIT License**\n**Copyright © 2015 Krunoslav Zaher**\n**All rights reserved.**\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "Pods/RxCocoa/Platform/DataStructures/Bag.swift",
    "content": "//\n//  Bag.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 2/28/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport Swift\n\nlet arrayDictionaryMaxSize = 30\n\nstruct BagKey {\n    /**\n    Unique identifier for object added to `Bag`.\n     \n    It's underlying type is UInt64. If we assume there in an idealized CPU that works at 4GHz,\n     it would take ~150 years of continuous running time for it to overflow.\n    */\n    fileprivate let rawValue: UInt64\n}\n\n/**\nData structure that represents a bag of elements typed `T`.\n\nSingle element can be stored multiple times.\n\nTime and space complexity of insertion an deletion is O(n). \n\nIt is suitable for storing small number of elements.\n*/\nstruct Bag<T> : CustomDebugStringConvertible {\n    /// Type of identifier for inserted elements.\n    typealias KeyType = BagKey\n    \n    typealias Entry = (key: BagKey, value: T)\n \n    fileprivate var _nextKey: BagKey = BagKey(rawValue: 0)\n\n    // data\n\n    // first fill inline variables\n    var _key0: BagKey? = nil\n    var _value0: T? = nil\n\n    // then fill \"array dictionary\"\n    var _pairs = ContiguousArray<Entry>()\n\n    // last is sparse dictionary\n    var _dictionary: [BagKey : T]? = nil\n\n    var _onlyFastPath = true\n\n    /// Creates new empty `Bag`.\n    init() {\n    }\n    \n    /**\n    Inserts `value` into bag.\n    \n    - parameter element: Element to insert.\n    - returns: Key that can be used to remove element from bag.\n    */\n    mutating func insert(_ element: T) -> BagKey {\n        let key = _nextKey\n\n        _nextKey = BagKey(rawValue: _nextKey.rawValue &+ 1)\n\n        if _key0 == nil {\n            _key0 = key\n            _value0 = element\n            return key\n        }\n\n        _onlyFastPath = false\n\n        if _dictionary != nil {\n            _dictionary![key] = element\n            return key\n        }\n\n        if _pairs.count < arrayDictionaryMaxSize {\n            _pairs.append((key: key, value: element))\n            return key\n        }\n\n        if _dictionary == nil {\n            _dictionary = [:]\n        }\n\n        _dictionary![key] = element\n        \n        return key\n    }\n    \n    /// - returns: Number of elements in bag.\n    var count: Int {\n        let dictionaryCount: Int = _dictionary?.count ?? 0\n        return (_value0 != nil ? 1 : 0) + _pairs.count + dictionaryCount\n    }\n    \n    /// Removes all elements from bag and clears capacity.\n    mutating func removeAll() {\n        _key0 = nil\n        _value0 = nil\n\n        _pairs.removeAll(keepingCapacity: false)\n        _dictionary?.removeAll(keepingCapacity: false)\n    }\n    \n    /**\n    Removes element with a specific `key` from bag.\n    \n    - parameter key: Key that identifies element to remove from bag.\n    - returns: Element that bag contained, or nil in case element was already removed.\n    */\n    mutating func removeKey(_ key: BagKey) -> T? {\n        if _key0 == key {\n            _key0 = nil\n            let value = _value0!\n            _value0 = nil\n            return value\n        }\n\n        if let existingObject = _dictionary?.removeValue(forKey: key) {\n            return existingObject\n        }\n\n        for i in 0 ..< _pairs.count {\n            if _pairs[i].key == key {\n                let value = _pairs[i].value\n                _pairs.remove(at: i)\n                return value\n            }\n        }\n\n        return nil\n    }\n}\n\nextension Bag {\n    /// A textual representation of `self`, suitable for debugging.\n    var debugDescription : String {\n        return \"\\(self.count) elements in Bag\"\n    }\n}\n\nextension Bag {\n    /// Enumerates elements inside the bag.\n    ///\n    /// - parameter action: Enumeration closure.\n    func forEach(_ action: (T) -> Void) {\n        if _onlyFastPath {\n            if let value0 = _value0 {\n                action(value0)\n            }\n            return\n        }\n\n        let value0 = _value0\n        let dictionary = _dictionary\n\n        if let value0 = value0 {\n            action(value0)\n        }\n\n        for i in 0 ..< _pairs.count {\n            action(_pairs[i].value)\n        }\n\n        if dictionary?.count ?? 0 > 0 {\n            for element in dictionary!.values {\n                action(element)\n            }\n        }\n    }\n}\n\nextension BagKey: Hashable {\n    var hashValue: Int {\n        return rawValue.hashValue\n    }\n}\n\nfunc ==(lhs: BagKey, rhs: BagKey) -> Bool {\n    return lhs.rawValue == rhs.rawValue\n}\n"
  },
  {
    "path": "Pods/RxCocoa/Platform/DataStructures/InfiniteSequence.swift",
    "content": "//\n//  InfiniteSequence.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 6/13/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Sequence that repeats `repeatedValue` infinite number of times.\nstruct InfiniteSequence<E> : Sequence {\n    typealias Element = E\n    typealias Iterator = AnyIterator<E>\n    \n    private let _repeatedValue: E\n    \n    init(repeatedValue: E) {\n        _repeatedValue = repeatedValue\n    }\n    \n    func makeIterator() -> Iterator {\n        let repeatedValue = _repeatedValue\n        return AnyIterator {\n            return repeatedValue\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/Platform/DataStructures/PriorityQueue.swift",
    "content": "//\n//  PriorityQueue.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 12/27/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nstruct PriorityQueue<Element> {\n    private let _hasHigherPriority: (Element, Element) -> Bool\n    private let _isEqual: (Element, Element) -> Bool\n\n    fileprivate var _elements = [Element]()\n\n    init(hasHigherPriority: @escaping (Element, Element) -> Bool, isEqual: @escaping (Element, Element) -> Bool) {\n        _hasHigherPriority = hasHigherPriority\n        _isEqual = isEqual\n    }\n\n    mutating func enqueue(_ element: Element) {\n        _elements.append(element)\n        bubbleToHigherPriority(_elements.count - 1)\n    }\n\n    func peek() -> Element? {\n        return _elements.first\n    }\n\n    var isEmpty: Bool {\n        return _elements.count == 0\n    }\n\n    mutating func dequeue() -> Element? {\n        guard let front = peek() else {\n            return nil\n        }\n\n        removeAt(0)\n\n        return front\n    }\n\n    mutating func remove(_ element: Element) {\n        for i in 0 ..< _elements.count {\n            if _isEqual(_elements[i], element) {\n                removeAt(i)\n                return\n            }\n        }\n    }\n\n    private mutating func removeAt(_ index: Int) {\n        let removingLast = index == _elements.count - 1\n        if !removingLast {\n            #if swift(>=3.2)\n            _elements.swapAt(index, _elements.count - 1)\n            #else\n            swap(&_elements[index], &_elements[_elements.count - 1])\n            #endif\n        }\n\n        _ = _elements.popLast()\n\n        if !removingLast {\n            bubbleToHigherPriority(index)\n            bubbleToLowerPriority(index)\n        }\n    }\n\n    private mutating func bubbleToHigherPriority(_ initialUnbalancedIndex: Int) {\n        precondition(initialUnbalancedIndex >= 0)\n        precondition(initialUnbalancedIndex < _elements.count)\n\n        var unbalancedIndex = initialUnbalancedIndex\n\n        while unbalancedIndex > 0 {\n            let parentIndex = (unbalancedIndex - 1) / 2\n            guard _hasHigherPriority(_elements[unbalancedIndex], _elements[parentIndex]) else { break }\n            #if swift(>=3.2)\n            _elements.swapAt(unbalancedIndex, parentIndex)\n            #else\n            swap(&_elements[unbalancedIndex], &_elements[parentIndex])\n            #endif\n            unbalancedIndex = parentIndex\n        }\n    }\n\n    private mutating func bubbleToLowerPriority(_ initialUnbalancedIndex: Int) {\n        precondition(initialUnbalancedIndex >= 0)\n        precondition(initialUnbalancedIndex < _elements.count)\n\n        var unbalancedIndex = initialUnbalancedIndex\n        while true {\n            let leftChildIndex = unbalancedIndex * 2 + 1\n            let rightChildIndex = unbalancedIndex * 2 + 2\n\n            var highestPriorityIndex = unbalancedIndex\n\n            if leftChildIndex < _elements.count && _hasHigherPriority(_elements[leftChildIndex], _elements[highestPriorityIndex]) {\n                highestPriorityIndex = leftChildIndex\n            }\n\n            if rightChildIndex < _elements.count && _hasHigherPriority(_elements[rightChildIndex], _elements[highestPriorityIndex]) {\n                highestPriorityIndex = rightChildIndex\n            }\n\n            guard highestPriorityIndex != unbalancedIndex else { break }\n\n            #if swift(>=3.2)\n            _elements.swapAt(highestPriorityIndex, unbalancedIndex)\n            #else\n            swap(&_elements[highestPriorityIndex], &_elements[unbalancedIndex])\n            #endif\n            unbalancedIndex = highestPriorityIndex\n        }\n    }\n}\n\nextension PriorityQueue : CustomDebugStringConvertible {\n    var debugDescription: String {\n        return _elements.debugDescription\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/Platform/DataStructures/Queue.swift",
    "content": "//\n//  Queue.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 3/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/**\nData structure that represents queue.\n\nComplexity of `enqueue`, `dequeue` is O(1) when number of operations is\naveraged over N operations.\n\nComplexity of `peek` is O(1).\n*/\nstruct Queue<T>: Sequence {\n    /// Type of generator.\n    typealias Generator = AnyIterator<T>\n\n    private let _resizeFactor = 2\n    \n    private var _storage: ContiguousArray<T?>\n    private var _count = 0\n    private var _pushNextIndex = 0\n    private let _initialCapacity: Int\n\n    /**\n    Creates new queue.\n    \n    - parameter capacity: Capacity of newly created queue.\n    */\n    init(capacity: Int) {\n        _initialCapacity = capacity\n\n        _storage = ContiguousArray<T?>(repeating: nil, count: capacity)\n    }\n    \n    private var dequeueIndex: Int {\n        let index = _pushNextIndex - count\n        return index < 0 ? index + _storage.count : index\n    }\n    \n    /// - returns: Is queue empty.\n    var isEmpty: Bool {\n        return count == 0\n    }\n    \n    /// - returns: Number of elements inside queue.\n    var count: Int {\n        return _count\n    }\n    \n    /// - returns: Element in front of a list of elements to `dequeue`.\n    func peek() -> T {\n        precondition(count > 0)\n        \n        return _storage[dequeueIndex]!\n    }\n    \n    mutating private func resizeTo(_ size: Int) {\n        var newStorage = ContiguousArray<T?>(repeating: nil, count: size)\n        \n        let count = _count\n        \n        let dequeueIndex = self.dequeueIndex\n        let spaceToEndOfQueue = _storage.count - dequeueIndex\n        \n        // first batch is from dequeue index to end of array\n        let countElementsInFirstBatch = Swift.min(count, spaceToEndOfQueue)\n        // second batch is wrapped from start of array to end of queue\n        let numberOfElementsInSecondBatch = count - countElementsInFirstBatch\n        \n        newStorage[0 ..< countElementsInFirstBatch] = _storage[dequeueIndex ..< (dequeueIndex + countElementsInFirstBatch)]\n        newStorage[countElementsInFirstBatch ..< (countElementsInFirstBatch + numberOfElementsInSecondBatch)] = _storage[0 ..< numberOfElementsInSecondBatch]\n        \n        _count = count\n        _pushNextIndex = count\n        _storage = newStorage\n    }\n    \n    /// Enqueues `element`.\n    ///\n    /// - parameter element: Element to enqueue.\n    mutating func enqueue(_ element: T) {\n        if count == _storage.count {\n            resizeTo(Swift.max(_storage.count, 1) * _resizeFactor)\n        }\n        \n        _storage[_pushNextIndex] = element\n        _pushNextIndex += 1\n        _count += 1\n        \n        if _pushNextIndex >= _storage.count {\n            _pushNextIndex -= _storage.count\n        }\n    }\n    \n    private mutating func dequeueElementOnly() -> T {\n        precondition(count > 0)\n        \n        let index = dequeueIndex\n\n        defer {\n            _storage[index] = nil\n            _count -= 1\n        }\n\n        return _storage[index]!\n    }\n\n    /// Dequeues element or throws an exception in case queue is empty.\n    ///\n    /// - returns: Dequeued element.\n    mutating func dequeue() -> T? {\n        if self.count == 0 {\n            return nil\n        }\n\n        defer {\n            let downsizeLimit = _storage.count / (_resizeFactor * _resizeFactor)\n            if _count < downsizeLimit && downsizeLimit >= _initialCapacity {\n                resizeTo(_storage.count / _resizeFactor)\n            }\n        }\n\n        return dequeueElementOnly()\n    }\n    \n    /// - returns: Generator of contained elements.\n    func makeIterator() -> AnyIterator<T> {\n        var i = dequeueIndex\n        var count = _count\n\n        return AnyIterator {\n            if count == 0 {\n                return nil\n            }\n\n            defer {\n                count -= 1\n                i += 1\n            }\n\n            if i >= self._storage.count {\n                i -= self._storage.count\n            }\n\n            return self._storage[i]\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/Platform/DispatchQueue+Extensions.swift",
    "content": "//\n//  DispatchQueue+Extensions.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 10/22/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport Dispatch\n\nextension DispatchQueue {\n    private static var token: DispatchSpecificKey<()> = {\n        let key = DispatchSpecificKey<()>()\n        DispatchQueue.main.setSpecific(key: key, value: ())\n        return key\n    }()\n\n    static var isMain: Bool {\n        return DispatchQueue.getSpecific(key: token) != nil\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/Platform/Platform.Darwin.swift",
    "content": "//\n//  Platform.Darwin.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 12/29/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS)\n\n    import Darwin\n    import class Foundation.Thread\n    import func Foundation.OSAtomicCompareAndSwap32Barrier\n    import func Foundation.OSAtomicIncrement32Barrier\n    import func Foundation.OSAtomicDecrement32Barrier\n    import protocol Foundation.NSCopying\n\n    typealias AtomicInt = Int32\n\n    fileprivate func castToUInt32Pointer(_ pointer: UnsafeMutablePointer<Int32>) -> UnsafeMutablePointer<UInt32> {\n        let raw = UnsafeMutableRawPointer(pointer)\n        return raw.assumingMemoryBound(to: UInt32.self)\n    }\n\n    let AtomicCompareAndSwap = OSAtomicCompareAndSwap32Barrier\n    let AtomicIncrement = OSAtomicIncrement32Barrier\n    let AtomicDecrement = OSAtomicDecrement32Barrier\n    func AtomicOr(_ mask: UInt32, _ theValue : UnsafeMutablePointer<Int32>) -> Int32 {\n        return OSAtomicOr32OrigBarrier(mask, castToUInt32Pointer(theValue))\n    }\n    func AtomicFlagSet(_ mask: UInt32, _ theValue : UnsafeMutablePointer<Int32>) -> Bool {\n        // just used to create a barrier\n        OSAtomicXor32OrigBarrier(0, castToUInt32Pointer(theValue))\n        return (theValue.pointee & Int32(mask)) != 0\n    }\n\n    extension Thread {\n\n        static func setThreadLocalStorageValue<T: AnyObject>(_ value: T?, forKey key: NSCopying\n            ) {\n            let currentThread = Thread.current\n            let threadDictionary = currentThread.threadDictionary\n\n            if let newValue = value {\n                threadDictionary[key] = newValue\n            }\n            else {\n                threadDictionary[key] = nil\n            }\n\n        }\n        static func getThreadLocalStorageValueForKey<T>(_ key: NSCopying) -> T? {\n            let currentThread = Thread.current\n            let threadDictionary = currentThread.threadDictionary\n            \n            return threadDictionary[key] as? T\n        }\n    }\n\n    extension AtomicInt {\n        func valueSnapshot() -> Int32 {\n            return self\n        }\n    }\n    \n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/Platform/Platform.Linux.swift",
    "content": "//\n//  Platform.Linux.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 12/29/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(Linux)\n\n    import XCTest\n    import Glibc\n    import SwiftShims\n    import class Foundation.Thread\n\n    final class AtomicInt {\n        typealias IntegerLiteralType = Int\n        fileprivate var value: Int32 = 0\n        fileprivate var _lock = RecursiveLock()\n\n        func lock() {\n          _lock.lock()\n        }\n        func unlock() {\n          _lock.unlock()\n        }\n\n        func valueSnapshot() -> Int32 {\n            return value\n        }\n    }\n\n    extension AtomicInt: ExpressibleByIntegerLiteral {\n        convenience init(integerLiteral value: Int) {\n            self.init()\n            self.value = Int32(value)\n        }\n    }\n    \n    func >(lhs: AtomicInt, rhs: Int32) -> Bool {\n        return lhs.value > rhs\n    }\n    func ==(lhs: AtomicInt, rhs: Int32) -> Bool {\n        return lhs.value == rhs\n    }\n\n    func AtomicFlagSet(_ mask: UInt32, _ atomic: inout AtomicInt) -> Bool {\n        atomic.lock(); defer { atomic.unlock() }\n        return (atomic.value & Int32(mask)) != 0\n    }\n\n    func AtomicOr(_ mask: UInt32, _ atomic: inout AtomicInt) -> Int32 {\n        atomic.lock(); defer { atomic.unlock() }\n        let value = atomic.value\n        atomic.value |= Int32(mask)\n        return value\n    }\n\n    func AtomicIncrement(_ atomic: inout AtomicInt) -> Int32 {\n        atomic.lock(); defer { atomic.unlock() }\n        atomic.value += 1\n        return atomic.value\n    }\n\n    func AtomicDecrement(_ atomic: inout AtomicInt) -> Int32 {\n        atomic.lock(); defer { atomic.unlock() }\n        atomic.value -= 1\n        return atomic.value\n    }\n\n    func AtomicCompareAndSwap(_ l: Int32, _ r: Int32, _ atomic: inout AtomicInt) -> Bool {\n        atomic.lock(); defer { atomic.unlock() }\n        if atomic.value == l {\n            atomic.value = r\n            return true\n        }\n\n        return false\n    }\n\n    extension Thread {\n\n        static func setThreadLocalStorageValue<T: AnyObject>(_ value: T?, forKey key: String) {\n            let currentThread = Thread.current\n            var threadDictionary = currentThread.threadDictionary\n\n            if let newValue = value {\n                threadDictionary[key] = newValue\n            }\n            else {\n                threadDictionary[key] = nil\n            }\n\n            currentThread.threadDictionary = threadDictionary\n        }\n\n        static func getThreadLocalStorageValueForKey<T: AnyObject>(_ key: String) -> T? {\n            let currentThread = Thread.current\n            let threadDictionary = currentThread.threadDictionary\n\n            return threadDictionary[key] as? T\n        }\n    }\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/Platform/RecursiveLock.swift",
    "content": "//\n//  RecursiveLock.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 12/18/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport class Foundation.NSRecursiveLock\n\n#if TRACE_RESOURCES\n    class RecursiveLock: NSRecursiveLock {\n        override init() {\n            _ = Resources.incrementTotal()\n            super.init()\n        }\n\n        override func lock() {\n            super.lock()\n            _ = Resources.incrementTotal()\n        }\n\n        override func unlock() {\n            super.unlock()\n            _ = Resources.decrementTotal()\n        }\n\n        deinit {\n            _ = Resources.decrementTotal()\n        }\n    }\n#else\n    typealias RecursiveLock = NSRecursiveLock\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/README.md",
    "content": "<img src=\"assets/Rx_Logo_M.png\" alt=\"Miss Electric Eel 2016\" width=\"36\" height=\"36\"> RxSwift: ReactiveX for Swift\n======================================\n\n[![Travis CI](https://travis-ci.org/ReactiveX/RxSwift.svg?branch=master)](https://travis-ci.org/ReactiveX/RxSwift) ![platforms](https://img.shields.io/badge/platforms-iOS%20%7C%20macOS%20%7C%20tvOS%20%7C%20watchOS%20%7C%20Linux-333333.svg) ![pod](https://img.shields.io/cocoapods/v/RxSwift.svg) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) [![Swift Package Manager compatible](https://img.shields.io/badge/Swift%20Package%20Manager-compatible-brightgreen.svg)](https://github.com/apple/swift-package-manager)\n\n* RxSwift 4.x / Swift 4.x can be found in [**rxswift4.0-swift4.0** branch](https://github.com/ReactiveX/RxSwift/tree/rxswift4.0-swift4.0).\n* RxSwift 3.x / Swift 3.x can be found in [**master** branch](https://github.com/ReactiveX/RxSwift/tree/master).\n\nRx is a [generic abstraction of computation](https://youtu.be/looJcaeboBY) expressed through `Observable<Element>` interface.\n\nThis is a Swift version of [Rx](https://github.com/Reactive-Extensions/Rx.NET).\n\nIt tries to port as many concepts from the original version as possible, but some concepts were adapted for more pleasant and performant integration with iOS/macOS environment.\n\nCross platform documentation can be found on [ReactiveX.io](http://reactivex.io/).\n\nLike the original Rx, its intention is to enable easy composition of asynchronous operations and event/data streams.\n\nKVO observing, async operations and streams are all unified under [abstraction of sequence](Documentation/GettingStarted.md#observables-aka-sequences). This is the reason why Rx is so simple, elegant and powerful.\n\n## I came here because I want to ...\n\n###### ... understand\n\n* [why use rx?](Documentation/Why.md)\n* [the basics, getting started with RxSwift](Documentation/GettingStarted.md)\n* [traits](Documentation/Traits.md) - what are `Single`, `Completable`, `Maybe`, `Driver`, `ControlProperty`, and `Variable` ... and why do they exist?\n* [testing](Documentation/UnitTests.md)\n* [tips and common errors](Documentation/Tips.md)\n* [debugging](Documentation/GettingStarted.md#debugging)\n* [the math behind Rx](Documentation/MathBehindRx.md)\n* [what are hot and cold observable sequences?](Documentation/HotAndColdObservables.md)\n\n###### ... install\n\n* Integrate RxSwift/RxCocoa with my app. [Installation Guide](#installation)\n\n###### ... hack around\n\n* with the example app. [Running Example App](Documentation/ExampleApp.md)\n* with operators in playgrounds. [Playgrounds](Documentation/Playgrounds.md)\n\n###### ... interact\n\n* All of this is great, but it would be nice to talk with other people using RxSwift and exchange experiences. <br />[![Slack channel](http://rxswift-slack.herokuapp.com/badge.svg)](http://rxswift-slack.herokuapp.com/) [Join Slack Channel](http://rxswift-slack.herokuapp.com)\n* Report a problem using the library. [Open an Issue With Bug Template](.github/ISSUE_TEMPLATE.md)\n* Request a new feature. [Open an Issue With Feature Request Template](Documentation/NewFeatureRequestTemplate.md)\n\n\n###### ... compare\n\n* [with other libraries](Documentation/ComparisonWithOtherLibraries.md).\n\n\n###### ... find compatible\n\n* libraries from [RxSwiftCommunity](https://github.com/RxSwiftCommunity).\n* [Pods using RxSwift](https://cocoapods.org/?q=uses%3Arxswift).\n\n###### ... see the broader vision\n\n* Does this exist for Android? [RxJava](https://github.com/ReactiveX/RxJava)\n* Where is all of this going, what is the future, what about reactive architectures, how do you design entire apps this way? [Cycle.js](https://github.com/cyclejs/cycle-core) - this is javascript, but [RxJS](https://github.com/Reactive-Extensions/RxJS) is javascript version of Rx.\n\n## Usage\n\n<table>\n  <tr>\n    <th width=\"30%\">Here's an example</th>\n    <th width=\"30%\">In Action</th>\n  </tr>\n  <tr>\n    <td>Define search for GitHub repositories ...</td>\n    <th rowspan=\"9\"><img src=\"https://raw.githubusercontent.com/kzaher/rxswiftcontent/master/GithubSearch.gif\"></th>\n  </tr>\n  <tr>\n    <td><div class=\"highlight highlight-source-swift\"><pre>\nlet searchResults = searchBar.rx.text.orEmpty\n    .throttle(0.3, scheduler: MainScheduler.instance)\n    .distinctUntilChanged()\n    .flatMapLatest { query -> Observable&lt;[Repository]&gt; in\n        if query.isEmpty {\n            return .just([])\n        }\n        return searchGitHub(query)\n            .catchErrorJustReturn([])\n    }\n    .observeOn(MainScheduler.instance)</pre></div></td>\n  </tr>\n  <tr>\n    <td>... then bind the results to your tableview</td>\n  </tr>\n  <tr>\n    <td width=\"30%\"><div class=\"highlight highlight-source-swift\"><pre>\nsearchResults\n    .bind(to: tableView.rx.items(cellIdentifier: \"Cell\")) {\n        (index, repository: Repository, cell) in\n        cell.textLabel?.text = repository.name\n        cell.detailTextLabel?.text = repository.url\n    }\n    .disposed(by: disposeBag)</pre></div></td>\n  </tr>\n</table>\n\n\n## Requirements\n\n* Xcode 8.0\n* Swift 3.0\n* Swift 2.3 ([use `rxswift-2.0` branch](https://github.com/ReactiveX/RxSwift/tree/rxswift-2.0) instead)\n\n## Installation\n\nRx doesn't contain any external dependencies.\n\nThese are currently the supported options:\n\n### Manual\n\nOpen Rx.xcworkspace, choose `RxExample` and hit run. This method will build everything and run the sample app\n\n### [CocoaPods](https://guides.cocoapods.org/using/using-cocoapods.html)\n\n**Tested with `pod --version`: `1.1.1`**\n\n```ruby\n# Podfile\nuse_frameworks!\n\ntarget 'YOUR_TARGET_NAME' do\n    pod 'RxSwift',    '~> 3.0'\n    pod 'RxCocoa',    '~> 3.0'\nend\n\n# RxTests and RxBlocking make the most sense in the context of unit/integration tests\ntarget 'YOUR_TESTING_TARGET' do\n    pod 'RxBlocking', '~> 3.0'\n    pod 'RxTest',     '~> 3.0'\nend\n```\n\nReplace `YOUR_TARGET_NAME` and then, in the `Podfile` directory, type:\n\n```bash\n$ pod install\n```\n\n### [Carthage](https://github.com/Carthage/Carthage)\n\n**Tested with `carthage version`: `0.18.1`**\n\nAdd this to `Cartfile`\n\n```\ngithub \"ReactiveX/RxSwift\" ~> 3.0\n```\n\n```bash\n$ carthage update\n```\n\n### [Swift Package Manager](https://github.com/apple/swift-package-manager)\n\n**Tested with `swift build --version`: `3.0.0 (swiftpm-19)`**\n\nCreate a `Package.swift` file.\n\n```swift\nimport PackageDescription\n\nlet package = Package(\n    name: \"RxTestProject\",\n    targets: [],\n    dependencies: [\n        .Package(url: \"https://github.com/ReactiveX/RxSwift.git\", majorVersion: 3)\n    ]\n)\n```\n\n```bash\n$ swift build\n```\n\nTo build or test a module with RxTest dependency, set `TEST=1`. ([RxSwift >= 3.4.2](https://github.com/ReactiveX/RxSwift/releases/tag/3.4.2))\n\n```bash\n$ TEST=1 swift test\n```\n\n### Manually using git submodules\n\n* Add RxSwift as a submodule\n\n```bash\n$ git submodule add git@github.com:ReactiveX/RxSwift.git\n```\n\n* Drag `Rx.xcodeproj` into Project Navigator\n* Go to `Project > Targets > Build Phases > Link Binary With Libraries`, click `+` and select `RxSwift-[Platform]` and `RxCocoa-[Platform]` targets\n\n\n## References\n\n* [http://reactivex.io/](http://reactivex.io/)\n* [Reactive Extensions GitHub (GitHub)](https://github.com/Reactive-Extensions)\n* [RxSwift RayWenderlich.com Book](https://store.raywenderlich.com/products/rxswift)\n* [Boxue.io RxSwift Online Course](https://boxueio.com/series/rxswift-101) (Chinese 🇨🇳)\n* [Erik Meijer (Wikipedia)](http://en.wikipedia.org/wiki/Erik_Meijer_%28computer_scientist%29)\n* [Expert to Expert: Brian Beckman and Erik Meijer - Inside the .NET Reactive Framework (Rx) (video)](https://youtu.be/looJcaeboBY)\n* [Reactive Programming Overview (Jafar Husain from Netflix)](https://www.youtube.com/watch?v=dwP1TNXE6fc)\n* [Subject/Observer is Dual to Iterator (paper)](http://csl.stanford.edu/~christos/pldi2010.fit/meijer.duality.pdf)\n* [Rx standard sequence operators visualized (visualization tool)](http://rxmarbles.com/)\n* [Haskell](https://www.haskell.org/)\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Common/Binder.swift",
    "content": "//\n//  Binder.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 9/17/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nimport RxSwift\n\n/**\n Observer that enforces interface binding rules:\n * can't bind errors (in debug builds binding of errors causes `fatalError` in release builds errors are being logged)\n * ensures binding is performed on a specific scheduler\n\n `Binder` doesn't retain target and in case target is released, element isn't bound.\n \n By default it binds elements on main scheduler.\n */\npublic struct Binder<Value>: ObserverType {\n    public typealias E = Value\n    \n    private let _binding: (Event<Value>) -> ()\n\n    /// Initializes `Binder`\n    ///\n    /// - parameter target: Target object.\n    /// - parameter scheduler: Scheduler used to bind the events.\n    /// - parameter binding: Binding logic.\n    public init<Target: AnyObject>(_ target: Target, scheduler: ImmediateSchedulerType = MainScheduler(), binding: @escaping (Target, Value) -> ()) {\n        weak var weakTarget = target\n\n        _binding = { event in\n            switch event {\n            case .next(let element):\n                _ = scheduler.schedule(element) { element in\n                    if let target = weakTarget {\n                        binding(target, element)\n                    }\n                    return Disposables.create()\n                }\n            case .error(let error):\n                bindingError(error)\n            case .completed:\n                break\n            }\n        }\n    }\n\n    /// Binds next element to owner view as described in `binding`.\n    public func on(_ event: Event<Value>) {\n        _binding(event)\n    }\n\n    /// Erases type of observer.\n    ///\n    /// - returns: type erased observer.\n    public func asObserver() -> AnyObserver<Value> {\n        return AnyObserver(eventHandler: on)\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Common/ControlTarget.swift",
    "content": "//\n//  ControlTarget.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 2/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS) || os(macOS)\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n\n    typealias Control = UIKit.UIControl\n    typealias ControlEvents = UIKit.UIControlEvents\n#elseif os(macOS)\n    import Cocoa\n\n    typealias Control = Cocoa.NSControl\n#endif\n\n// This should be only used from `MainScheduler`\nfinal class ControlTarget: RxTarget {\n    typealias Callback = (Control) -> Void\n\n    let selector: Selector = #selector(ControlTarget.eventHandler(_:))\n\n    weak var control: Control?\n#if os(iOS) || os(tvOS)\n    let controlEvents: UIControlEvents\n#endif\n    var callback: Callback?\n    #if os(iOS) || os(tvOS)\n    init(control: Control, controlEvents: UIControlEvents, callback: @escaping Callback) {\n        MainScheduler.ensureExecutingOnScheduler()\n\n        self.control = control\n        self.controlEvents = controlEvents\n        self.callback = callback\n\n        super.init()\n\n        control.addTarget(self, action: selector, for: controlEvents)\n\n        let method = self.method(for: selector)\n        if method == nil {\n            rxFatalError(\"Can't find method\")\n        }\n    }\n#elseif os(macOS)\n    init(control: Control, callback: @escaping Callback) {\n        MainScheduler.ensureExecutingOnScheduler()\n\n        self.control = control\n        self.callback = callback\n\n        super.init()\n\n        control.target = self\n        control.action = selector\n\n        let method = self.method(for: selector)\n        if method == nil {\n            rxFatalError(\"Can't find method\")\n        }\n    }\n#endif\n\n    @objc func eventHandler(_ sender: Control!) {\n        if let callback = self.callback, let control = self.control {\n            callback(control)\n        }\n    }\n\n    override func dispose() {\n        super.dispose()\n#if os(iOS) || os(tvOS)\n        self.control?.removeTarget(self, action: self.selector, for: self.controlEvents)\n#elseif os(macOS)\n        self.control?.target = nil\n        self.control?.action = nil\n#endif\n        self.callback = nil\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Common/DelegateProxy.swift",
    "content": "//\n//  DelegateProxy.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 6/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if !os(Linux)\n\n#if !RX_NO_MODULE\n    import RxSwift\n#if SWIFT_PACKAGE && !os(Linux)\n    import RxCocoaRuntime\n#endif\n#endif\n\n    /// Base class for `DelegateProxyType` protocol.\n    ///\n    /// This implementation is not thread safe and can be used only from one thread (Main thread).\n    open class DelegateProxy<P: AnyObject, D: AnyObject>: _RXDelegateProxy {\n        public typealias ParentObject = P\n        public typealias Delegate = D\n\n        private var _sentMessageForSelector = [Selector: MessageDispatcher]()\n        private var _methodInvokedForSelector = [Selector: MessageDispatcher]()\n\n        /// Parent object associated with delegate proxy.\n        private weak private(set) var _parentObject: ParentObject?\n\n        fileprivate let _currentDelegateFor: (ParentObject) -> Delegate?\n        fileprivate let _setCurrentDelegateTo: (Delegate?, ParentObject) -> ()\n\n        /// Initializes new instance.\n        ///\n        /// - parameter parentObject: Optional parent object that owns `DelegateProxy` as associated object.\n        public init<Proxy: DelegateProxyType>(parentObject: ParentObject, delegateProxy: Proxy.Type)\n            where Proxy: DelegateProxy<ParentObject, Delegate>, Proxy.ParentObject == ParentObject, Proxy.Delegate == Delegate {\n            self._parentObject = parentObject\n            self._currentDelegateFor = delegateProxy.currentDelegate(for:)\n            self._setCurrentDelegateTo = delegateProxy.setCurrentDelegate(_:to:)\n\n            MainScheduler.ensureExecutingOnScheduler()\n            #if TRACE_RESOURCES\n                _ = Resources.incrementTotal()\n            #endif\n            super.init()\n        }\n\n        /**\n         Returns observable sequence of invocations of delegate methods. Elements are sent *before method is invoked*.\n\n         Only methods that have `void` return value can be observed using this method because\n         those methods are used as a notification mechanism. It doesn't matter if they are optional\n         or not. Observing is performed by installing a hidden associated `PublishSubject` that is\n         used to dispatch messages to observers.\n\n         Delegate methods that have non `void` return value can't be observed directly using this method\n         because:\n         * those methods are not intended to be used as a notification mechanism, but as a behavior customization mechanism\n         * there is no sensible automatic way to determine a default return value\n\n         In case observing of delegate methods that have return type is required, it can be done by\n         manually installing a `PublishSubject` or `BehaviorSubject` and implementing delegate method.\n\n         e.g.\n\n             // delegate proxy part (RxScrollViewDelegateProxy)\n\n             let internalSubject = PublishSubject<CGPoint>\n\n             public func requiredDelegateMethod(scrollView: UIScrollView, arg1: CGPoint) -> Bool {\n                 internalSubject.on(.next(arg1))\n                 return self._forwardToDelegate?.requiredDelegateMethod?(scrollView, arg1: arg1) ?? defaultReturnValue\n             }\n\n         ....\n\n             // reactive property implementation in a real class (`UIScrollView`)\n             public var property: Observable<CGPoint> {\n                 let proxy = RxScrollViewDelegateProxy.proxy(for: base)\n                 return proxy.internalSubject.asObservable()\n             }\n\n         **In case calling this method prints \"Delegate proxy is already implementing `\\(selector)`,\n         a more performant way of registering might exist.\", that means that manual observing method\n         is required analog to the example above because delegate method has already been implemented.**\n\n         - parameter selector: Selector used to filter observed invocations of delegate methods.\n         - returns: Observable sequence of arguments passed to `selector` method.\n         */\n        open func sentMessage(_ selector: Selector) -> Observable<[Any]> {\n            MainScheduler.ensureExecutingOnScheduler()\n            checkSelectorIsObservable(selector)\n\n            let subject = _sentMessageForSelector[selector]\n\n            if let subject = subject {\n                return subject.asObservable()\n            }\n            else {\n                let subject = MessageDispatcher(delegateProxy: self)\n                _sentMessageForSelector[selector] = subject\n                return subject.asObservable()\n            }\n        }\n\n        /**\n         Returns observable sequence of invoked delegate methods. Elements are sent *after method is invoked*.\n\n         Only methods that have `void` return value can be observed using this method because\n         those methods are used as a notification mechanism. It doesn't matter if they are optional\n         or not. Observing is performed by installing a hidden associated `PublishSubject` that is\n         used to dispatch messages to observers.\n\n         Delegate methods that have non `void` return value can't be observed directly using this method\n         because:\n         * those methods are not intended to be used as a notification mechanism, but as a behavior customization mechanism\n         * there is no sensible automatic way to determine a default return value\n\n         In case observing of delegate methods that have return type is required, it can be done by\n         manually installing a `PublishSubject` or `BehaviorSubject` and implementing delegate method.\n\n         e.g.\n\n             // delegate proxy part (RxScrollViewDelegateProxy)\n\n             let internalSubject = PublishSubject<CGPoint>\n\n             public func requiredDelegateMethod(scrollView: UIScrollView, arg1: CGPoint) -> Bool {\n                 internalSubject.on(.next(arg1))\n                 return self._forwardToDelegate?.requiredDelegateMethod?(scrollView, arg1: arg1) ?? defaultReturnValue\n             }\n\n         ....\n\n             // reactive property implementation in a real class (`UIScrollView`)\n             public var property: Observable<CGPoint> {\n                 let proxy = RxScrollViewDelegateProxy.proxy(for: base)\n                 return proxy.internalSubject.asObservable()\n             }\n\n         **In case calling this method prints \"Delegate proxy is already implementing `\\(selector)`,\n         a more performant way of registering might exist.\", that means that manual observing method\n         is required analog to the example above because delegate method has already been implemented.**\n\n         - parameter selector: Selector used to filter observed invocations of delegate methods.\n         - returns: Observable sequence of arguments passed to `selector` method.\n         */\n        open func methodInvoked(_ selector: Selector) -> Observable<[Any]> {\n            MainScheduler.ensureExecutingOnScheduler()\n            checkSelectorIsObservable(selector)\n\n            let subject = _methodInvokedForSelector[selector]\n\n            if let subject = subject {\n                return subject.asObservable()\n            }\n            else {\n                let subject = MessageDispatcher(delegateProxy: self)\n                _methodInvokedForSelector[selector] = subject\n                return subject.asObservable()\n            }\n        }\n\n        private func checkSelectorIsObservable(_ selector: Selector) {\n            MainScheduler.ensureExecutingOnScheduler()\n\n            if hasWiredImplementation(for: selector) {\n                print(\"Delegate proxy is already implementing `\\(selector)`, a more performant way of registering might exist.\")\n                return\n            }\n\n            guard ((self.forwardToDelegate() as? NSObject)?.responds(to: selector) ?? false) || voidDelegateMethodsContain(selector) else {\n                rxFatalError(\"This class doesn't respond to selector \\(selector)\")\n            }\n        }\n\n        // proxy\n\n        open override func _sentMessage(_ selector: Selector, withArguments arguments: [Any]) {\n            _sentMessageForSelector[selector]?.on(.next(arguments))\n        }\n\n        open override func _methodInvoked(_ selector: Selector, withArguments arguments: [Any]) {\n            _methodInvokedForSelector[selector]?.on(.next(arguments))\n        }\n\n        /// Returns reference of normal delegate that receives all forwarded messages\n        /// through `self`.\n        ///\n        /// - returns: Value of reference if set or nil.\n        open func forwardToDelegate() -> Delegate? {\n            return castOptionalOrFatalError(self._forwardToDelegate)\n        }\n\n        /// Sets reference of normal delegate that receives all forwarded messages\n        /// through `self`.\n        ///\n        /// - parameter forwardToDelegate: Reference of delegate that receives all messages through `self`.\n        /// - parameter retainDelegate: Should `self` retain `forwardToDelegate`.\n        open func setForwardToDelegate(_ delegate: Delegate?, retainDelegate: Bool) {\n            #if DEBUG // 4.0 all configurations\n                MainScheduler.ensureExecutingOnScheduler()\n            #endif\n            self._setForwardToDelegate(delegate, retainDelegate: retainDelegate)\n            self.reset()\n        }\n\n        private func hasObservers(selector: Selector) -> Bool {\n            return (_sentMessageForSelector[selector]?.hasObservers ?? false)\n                || (_methodInvokedForSelector[selector]?.hasObservers ?? false)\n        }\n\n        override open func responds(to aSelector: Selector!) -> Bool {\n            return super.responds(to: aSelector)\n                || (self._forwardToDelegate?.responds(to: aSelector) ?? false)\n                || (self.voidDelegateMethodsContain(aSelector) && self.hasObservers(selector: aSelector))\n        }\n\n        fileprivate func reset() {\n            guard let parentObject = self._parentObject else { return }\n\n            let maybeCurrentDelegate = _currentDelegateFor(parentObject)\n\n            if maybeCurrentDelegate === self {\n                _setCurrentDelegateTo(nil, parentObject)\n                _setCurrentDelegateTo(castOrFatalError(self), parentObject)\n            }\n        }\n\n        deinit {\n            for v in _sentMessageForSelector.values {\n                v.on(.completed)\n            }\n            for v in _methodInvokedForSelector.values {\n                v.on(.completed)\n            }\n            #if TRACE_RESOURCES\n                _ = Resources.decrementTotal()\n            #endif\n        }\n    \n\n    }\n\n    fileprivate let mainScheduler = MainScheduler()\n\n    fileprivate final class MessageDispatcher {\n        private let dispatcher: PublishSubject<[Any]>\n        private let result: Observable<[Any]>\n\n        init<P, D>(delegateProxy _delegateProxy: DelegateProxy<P, D>) {\n            weak var weakDelegateProxy = _delegateProxy\n\n            let dispatcher = PublishSubject<[Any]>()\n            self.dispatcher = dispatcher\n\n            self.result = dispatcher\n                .do(onSubscribed: { weakDelegateProxy?.reset() }, onDispose: { weakDelegateProxy?.reset() })\n                .share()\n                .subscribeOn(mainScheduler)\n        }\n\n        var on: (Event<[Any]>) -> () {\n            return self.dispatcher.on\n        }\n\n        var hasObservers: Bool {\n            return self.dispatcher.hasObservers\n        }\n\n        func asObservable() -> Observable<[Any]> {\n            return self.result\n        }\n    }\n    \n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Common/DelegateProxyType.swift",
    "content": "//\n//  DelegateProxyType.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 6/15/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if !os(Linux)\n\n    import func Foundation.objc_getAssociatedObject\n    import func Foundation.objc_setAssociatedObject\n\n    #if !RX_NO_MODULE\n        import RxSwift\n    #endif\n\n/**\n`DelegateProxyType` protocol enables using both normal delegates and Rx observable sequences with\nviews that can have only one delegate/datasource registered.\n\n`Proxies` store information about observers, subscriptions and delegates\nfor specific views.\n\nType implementing `DelegateProxyType` should never be initialized directly.\n\nTo fetch initialized instance of type implementing `DelegateProxyType`, `proxy` method\nshould be used.\n\nThis is more or less how it works.\n\n\n\n      +-------------------------------------------+\n      |                                           |                           \n      | UIView subclass (UIScrollView)            |                           \n      |                                           |\n      +-----------+-------------------------------+                           \n                  |                                                           \n                  | Delegate                                                  \n                  |                                                           \n                  |                                                           \n      +-----------v-------------------------------+                           \n      |                                           |                           \n      | Delegate proxy : DelegateProxyType        +-----+---->  Observable<T1>\n      |                , UIScrollViewDelegate     |     |\n      +-----------+-------------------------------+     +---->  Observable<T2>\n                  |                                     |                     \n                  |                                     +---->  Observable<T3>\n                  |                                     |                     \n                  | forwards events                     |\n                  | to custom delegate                  |\n                  |                                     v                     \n      +-----------v-------------------------------+                           \n      |                                           |                           \n      | Custom delegate (UIScrollViewDelegate)    |                           \n      |                                           |\n      +-------------------------------------------+                           \n\n\nSince RxCocoa needs to automagically create those Proxys and because views that have delegates can be hierarchical\n\n     UITableView : UIScrollView : UIView\n\n.. and corresponding delegates are also hierarchical\n\n     UITableViewDelegate : UIScrollViewDelegate : NSObject\n\n... this mechanism can be extended by using the following snippet in `registerKnownImplementations` or in some other\n     part of your app that executes before using `rx.*` (e.g. appDidFinishLaunching).\n\n    RxScrollViewDelegateProxy.register { RxTableViewDelegateProxy(parentObject: $0) }\n\n*/\npublic protocol DelegateProxyType: class {\n    associatedtype ParentObject: AnyObject\n    associatedtype Delegate: AnyObject\n    \n    /// It is require that enumerate call `register` of the extended DelegateProxy subclasses here.\n    static func registerKnownImplementations()\n\n    /// Unique identifier for delegate\n    static var identifier: UnsafeRawPointer { get }\n\n    /// Returns designated delegate property for object.\n    ///\n    /// Objects can have multiple delegate properties.\n    ///\n    /// Each delegate property needs to have it's own type implementing `DelegateProxyType`.\n    ///\n    /// It's abstract method.\n    ///\n    /// - parameter object: Object that has delegate property.\n    /// - returns: Value of delegate property.\n    static func currentDelegate(for object: ParentObject) -> Delegate?\n\n    /// Sets designated delegate property for object.\n    ///\n    /// Objects can have multiple delegate properties.\n    ///\n    /// Each delegate property needs to have it's own type implementing `DelegateProxyType`.\n    ///\n    /// It's abstract method.\n    ///\n    /// - parameter toObject: Object that has delegate property.\n    /// - parameter delegate: Delegate value.\n    static func setCurrentDelegate(_ delegate: Delegate?, to object: ParentObject)\n\n    /// Returns reference of normal delegate that receives all forwarded messages\n    /// through `self`.\n    ///\n    /// - returns: Value of reference if set or nil.\n    func forwardToDelegate() -> Delegate?\n\n    /// Sets reference of normal delegate that receives all forwarded messages\n    /// through `self`.\n    ///\n    /// - parameter forwardToDelegate: Reference of delegate that receives all messages through `self`.\n    /// - parameter retainDelegate: Should `self` retain `forwardToDelegate`.\n    func setForwardToDelegate(_ forwardToDelegate: Delegate?, retainDelegate: Bool)\n}\n\n// default implementations\nextension DelegateProxyType {\n    /// Unique identifier for delegate\n    public static var identifier: UnsafeRawPointer {\n        let delegateIdentifier = ObjectIdentifier(Delegate.self)\n        let integerIdentifier = Int(bitPattern: delegateIdentifier)\n        return UnsafeRawPointer(bitPattern: integerIdentifier)!\n    }\n}\n\nextension DelegateProxyType {\n\n    /// Store DelegateProxy subclass to factory.\n    /// When make 'Rx*DelegateProxy' subclass, call 'Rx*DelegateProxySubclass.register(for:_)' 1 time, or use it in DelegateProxyFactory\n    /// 'Rx*DelegateProxy' can have one subclass implementation per concrete ParentObject type.\n    /// Should call it from concrete DelegateProxy type, not generic.\n    public static func register<Parent>(make: @escaping (Parent) -> Self) {\n        self.factory.extend(make: make)\n    }\n\n    /// Creates new proxy for target object.\n    /// Should not call this function directory, use 'DelegateProxy.proxy(for:)'\n    public static func createProxy(for object: AnyObject) -> Self {\n        return castOrFatalError(factory.createProxy(for: object))\n    }\n\n    /// Returns existing proxy for object or installs new instance of delegate proxy.\n    ///\n    /// - parameter object: Target object on which to install delegate proxy.\n    /// - returns: Installed instance of delegate proxy.\n    ///\n    ///\n    ///     extension Reactive where Base: UISearchBar {\n    ///\n    ///         public var delegate: DelegateProxy<UISearchBar, UISearchBarDelegate> {\n    ///            return RxSearchBarDelegateProxy.proxy(for: base)\n    ///         }\n    ///\n    ///         public var text: ControlProperty<String> {\n    ///             let source: Observable<String> = self.delegate.observe(#selector(UISearchBarDelegate.searchBar(_:textDidChange:)))\n    ///             ...\n    ///         }\n    ///     }\n    public static func proxy(for object: ParentObject) -> Self {\n        MainScheduler.ensureExecutingOnScheduler()\n\n        let maybeProxy = self.assignedProxy(for: object)\n\n        // Type is ideally be `(Self & Delegate)`, but Swift 3.0 doesn't support it.\n        let proxy: Delegate\n        if let existingProxy = maybeProxy {\n            proxy = existingProxy\n        }\n        else {\n            proxy = castOrFatalError(self.createProxy(for: object))\n            self.assignProxy(proxy, toObject: object)\n            assert(self.assignedProxy(for: object) === proxy)\n        }\n        let currentDelegate = self.currentDelegate(for: object)\n        let delegateProxy: Self = castOrFatalError(proxy)\n\n        if currentDelegate !== delegateProxy {\n            delegateProxy.setForwardToDelegate(currentDelegate, retainDelegate: false)\n            assert(delegateProxy.forwardToDelegate() === currentDelegate)\n            self.setCurrentDelegate(proxy, to: object)\n            assert(self.currentDelegate(for: object) === proxy)\n            assert(delegateProxy.forwardToDelegate() === currentDelegate)\n        }\n\n        return delegateProxy\n    }\n\n    /// Sets forward delegate for `DelegateProxyType` associated with a specific object and return disposable that can be used to unset the forward to delegate.\n    /// Using this method will also make sure that potential original object cached selectors are cleared and will report any accidental forward delegate mutations.\n    ///\n    /// - parameter forwardDelegate: Delegate object to set.\n    /// - parameter retainDelegate: Retain `forwardDelegate` while it's being set.\n    /// - parameter onProxyForObject: Object that has `delegate` property.\n    /// - returns: Disposable object that can be used to clear forward delegate.\n    public static func installForwardDelegate(_ forwardDelegate: Delegate, retainDelegate: Bool, onProxyForObject object: ParentObject) -> Disposable {\n        weak var weakForwardDelegate: AnyObject? = forwardDelegate\n        let proxy = self.proxy(for: object)\n\n        assert(proxy.forwardToDelegate() === nil, \"This is a feature to warn you that there is already a delegate (or data source) set somewhere previously. The action you are trying to perform will clear that delegate (data source) and that means that some of your features that depend on that delegate (data source) being set will likely stop working.\\n\" +\n            \"If you are ok with this, try to set delegate (data source) to `nil` in front of this operation.\\n\" +\n            \" This is the source object value: \\(object)\\n\" +\n            \" This this the original delegate (data source) value: \\(proxy.forwardToDelegate()!)\\n\" +\n            \"Hint: Maybe delegate was already set in xib or storyboard and now it's being overwritten in code.\\n\")\n\n        proxy.setForwardToDelegate(forwardDelegate, retainDelegate: retainDelegate)\n\n        return Disposables.create {\n            MainScheduler.ensureExecutingOnScheduler()\n\n            let delegate: AnyObject? = weakForwardDelegate\n\n            assert(delegate == nil || proxy.forwardToDelegate() === delegate, \"Delegate was changed from time it was first set. Current \\(String(describing: proxy.forwardToDelegate())), and it should have been \\(proxy)\")\n\n            proxy.setForwardToDelegate(nil, retainDelegate: retainDelegate)\n        }\n    }\n}\n\n\n// fileprivate extensions\nextension DelegateProxyType\n{\n    fileprivate static var factory: DelegateProxyFactory {\n        return DelegateProxyFactory.sharedFactory(for: self)\n    }\n\n\n    fileprivate static func assignedProxy(for object: ParentObject) -> Delegate? {\n        let maybeDelegate = objc_getAssociatedObject(object, self.identifier)\n        return castOptionalOrFatalError(maybeDelegate.map { $0 as AnyObject })\n    }\n\n    fileprivate static func assignProxy(_ proxy: Delegate, toObject object: ParentObject) {\n        objc_setAssociatedObject(object, self.identifier, proxy, .OBJC_ASSOCIATION_RETAIN)\n    }\n}\n\n/// Describes an object that has a delegate.\npublic protocol HasDelegate: AnyObject {\n    /// Delegate type\n    associatedtype Delegate: AnyObject\n\n    /// Delegate\n    var delegate: Delegate? { get set }\n}\n\nextension DelegateProxyType where ParentObject: HasDelegate, Self.Delegate == ParentObject.Delegate {\n    public static func currentDelegate(for object: ParentObject) -> Delegate? {\n        return object.delegate\n    }\n\n    public static func setCurrentDelegate(_ delegate: Delegate?, to object: ParentObject) {\n        object.delegate = delegate\n    }\n}\n\n/// Describes an object that has a data source.\npublic protocol HasDataSource: AnyObject {\n    /// Data source type\n    associatedtype DataSource: AnyObject\n\n    /// Data source\n    var dataSource: DataSource? { get set }\n}\n\nextension DelegateProxyType where ParentObject: HasDataSource, Self.Delegate == ParentObject.DataSource {\n    public static func currentDelegate(for object: ParentObject) -> Delegate? {\n        return object.dataSource\n    }\n\n    public static func setCurrentDelegate(_ delegate: Delegate?, to object: ParentObject) {\n        object.dataSource = delegate\n    }\n}\n\n    #if os(iOS) || os(tvOS)\n        import UIKit\n\n        extension ObservableType {\n            func subscribeProxyDataSource<DelegateProxy: DelegateProxyType>(ofObject object: DelegateProxy.ParentObject, dataSource: DelegateProxy.Delegate, retainDataSource: Bool, binding: @escaping (DelegateProxy, Event<E>) -> Void)\n                -> Disposable\n                where DelegateProxy.ParentObject: UIView {\n                let proxy = DelegateProxy.proxy(for: object)\n                let unregisterDelegate = DelegateProxy.installForwardDelegate(dataSource, retainDelegate: retainDataSource, onProxyForObject: object)\n                // this is needed to flush any delayed old state (https://github.com/RxSwiftCommunity/RxDataSources/pull/75)\n                object.layoutIfNeeded()\n\n                let subscription = self.asObservable()\n                    .observeOn(MainScheduler())\n                    .catchError { error in\n                        bindingError(error)\n                        return Observable.empty()\n                    }\n                    // source can never end, otherwise it would release the subscriber, and deallocate the data source\n                    .concat(Observable.never())\n                    .takeUntil(object.rx.deallocated)\n                    .subscribe { [weak object] (event: Event<E>) in\n\n                        if let object = object {\n                            assert(proxy === DelegateProxy.currentDelegate(for: object), \"Proxy changed from the time it was first set.\\nOriginal: \\(proxy)\\nExisting: \\(String(describing: DelegateProxy.currentDelegate(for: object)))\")\n                        }\n                        \n                        binding(proxy, event)\n                        \n                        switch event {\n                        case .error(let error):\n                            bindingError(error)\n                            unregisterDelegate.dispose()\n                        case .completed:\n                            unregisterDelegate.dispose()\n                        default:\n                            break\n                        }\n                    }\n                    \n                return Disposables.create { [weak object] in\n                    subscription.dispose()\n                    object?.layoutIfNeeded()\n                    unregisterDelegate.dispose()\n                }\n            }\n        }\n\n    #endif\n\n    /**\n\n     To add delegate proxy subclasses call `DelegateProxySubclass.register()` in `registerKnownImplementations` or in some other\n     part of your app that executes before using `rx.*` (e.g. appDidFinishLaunching).\n\n         class RxScrollViewDelegateProxy: DelegateProxy {\n             public static func registerKnownImplementations() {\n                 self.register { RxTableViewDelegateProxy(parentObject: $0) }\n         }\n         ...\n\n\n     */\n    private class DelegateProxyFactory {\n        private static var _sharedFactories: [UnsafeRawPointer: DelegateProxyFactory] = [:]\n\n        fileprivate static func sharedFactory<DelegateProxy: DelegateProxyType>(for proxyType: DelegateProxy.Type) -> DelegateProxyFactory {\n            MainScheduler.ensureExecutingOnScheduler()\n            let identifier = DelegateProxy.identifier\n            if let factory = _sharedFactories[identifier] {\n                return factory\n            }\n            let factory = DelegateProxyFactory(for: proxyType)\n            _sharedFactories[identifier] = factory\n            DelegateProxy.registerKnownImplementations()\n            return factory\n        }\n\n        private var _factories: [ObjectIdentifier: ((AnyObject) -> AnyObject)]\n        private var _delegateProxyType: Any.Type\n        private var _identifier: UnsafeRawPointer\n\n        private init<DelegateProxy: DelegateProxyType>(for proxyType: DelegateProxy.Type) {\n            _factories = [:]\n            _delegateProxyType = proxyType\n            _identifier = proxyType.identifier\n        }\n\n        fileprivate func extend<DelegateProxy: DelegateProxyType, ParentObject>(make: @escaping (ParentObject) -> DelegateProxy)\n           {\n                MainScheduler.ensureExecutingOnScheduler()\n                precondition(_identifier == DelegateProxy.identifier, \"Delegate proxy has inconsistent identifier\")\n                precondition((DelegateProxy.self as? DelegateProxy.Delegate) != nil, \"DelegateProxy subclass should be as a Delegate\")\n                guard _factories[ObjectIdentifier(ParentObject.self)] == nil else {\n                    rxFatalError(\"The factory of \\(ParentObject.self) is duplicated. DelegateProxy is not allowed of duplicated base object type.\")\n                }\n                _factories[ObjectIdentifier(ParentObject.self)] = { make(castOrFatalError($0)) }\n        }\n\n        fileprivate func createProxy(for object: AnyObject) -> AnyObject {\n            MainScheduler.ensureExecutingOnScheduler()\n            var maybeMirror: Mirror? = Mirror(reflecting: object)\n            while let mirror = maybeMirror {\n                if let factory = _factories[ObjectIdentifier(mirror.subjectType)] {\n                    return factory(object)\n                }\n                maybeMirror = mirror.superclassMirror\n            }\n            rxFatalError(\"DelegateProxy has no factory of \\(object). Implement DelegateProxy subclass for \\(object) first.\")\n        }\n    }\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Common/NSLayoutConstraint+Rx.swift",
    "content": "//\n//  NSLayoutConstraint+Rx.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 12/6/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if !os(Linux)\n\n#if os(macOS)\nimport Cocoa\n#else\nimport UIKit\n#endif\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\n#if os(iOS) || os(macOS) || os(tvOS)\nextension Reactive where Base: NSLayoutConstraint {\n    /// Bindable sink for `constant` property.\n    public var constant: Binder<CGFloat> {\n        return Binder(self.base) { constraint, constant in\n            constraint.constant = constant\n        }\n    }\n    \n    /// Bindable sink for `active` property.\n    @available(iOS 8, OSX 10.10, *)\n    public var active: Binder<Bool> {\n        return Binder(self.base) { constraint, value in\n            constraint.isActive = value\n        }\n    }\n}\n\n#endif\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Common/Observable+Bind.swift",
    "content": "//\n//  Observable+Bind.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 8/29/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n\nextension ObservableType {\n    \n    /**\n    Creates new subscription and sends elements to observer.\n    \n    In this form it's equivalent to `subscribe` method, but it communicates intent better, and enables\n    writing more consistent binding code.\n    \n    - parameter to: Observer that receives events.\n    - returns: Disposable object that can be used to unsubscribe the observer.\n    */\n    public func bind<O: ObserverType>(to observer: O) -> Disposable where O.E == E {\n        return self.subscribe(observer)\n    }\n\n    /**\n     Creates new subscription and sends elements to observer.\n\n     In this form it's equivalent to `subscribe` method, but it communicates intent better, and enables\n     writing more consistent binding code.\n\n     - parameter to: Observer that receives events.\n     - returns: Disposable object that can be used to unsubscribe the observer.\n     */\n    public func bind<O: ObserverType>(to observer: O) -> Disposable where O.E == E? {\n        return self.map { $0 }.subscribe(observer)\n    }\n\n    /**\n    Creates new subscription and sends elements to variable.\n\n    In case error occurs in debug mode, `fatalError` will be raised.\n    In case error occurs in release mode, `error` will be logged.\n\n    - parameter to: Target variable for sequence elements.\n    - returns: Disposable object that can be used to unsubscribe the observer.\n    */\n    public func bind(to variable: Variable<E>) -> Disposable {\n        return subscribe { e in\n            switch e {\n            case let .next(element):\n                variable.value = element\n            case let .error(error):\n                let error = \"Binding error to variable: \\(error)\"\n            #if DEBUG\n                rxFatalError(error)\n            #else\n                print(error)\n            #endif\n            case .completed:\n                break\n            }\n        }\n    }\n\n    /**\n     Creates new subscription and sends elements to variable.\n\n     In case error occurs in debug mode, `fatalError` will be raised.\n     In case error occurs in release mode, `error` will be logged.\n\n     - parameter to: Target variable for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer.\n     */\n    public func bind(to variable: Variable<E?>) -> Disposable {\n        return self.map { $0 as E? }.bind(to: variable)\n    }\n    \n    /**\n    Subscribes to observable sequence using custom binder function.\n    \n    - parameter to: Function used to bind elements from `self`.\n    - returns: Object representing subscription.\n    */\n    public func bind<R>(to binder: (Self) -> R) -> R {\n        return binder(self)\n    }\n\n    /**\n    Subscribes to observable sequence using custom binder function and final parameter passed to binder function\n    after `self` is passed.\n    \n        public func bind<R1, R2>(to binder: Self -> R1 -> R2, curriedArgument: R1) -> R2 {\n            return binder(self)(curriedArgument)\n        }\n    \n    - parameter to: Function used to bind elements from `self`.\n    - parameter curriedArgument: Final argument passed to `binder` to finish binding process.\n    - returns: Object representing subscription.\n    */\n    public func bind<R1, R2>(to binder: (Self) -> (R1) -> R2, curriedArgument: R1) -> R2 {\n         return binder(self)(curriedArgument)\n    }\n    \n    \n    /**\n    Subscribes an element handler to an observable sequence. \n\n    In case error occurs in debug mode, `fatalError` will be raised.\n    In case error occurs in release mode, `error` will be logged.\n    \n    - parameter onNext: Action to invoke for each element in the observable sequence.\n    - returns: Subscription object used to unsubscribe from the observable sequence.\n    */\n    public func bind(onNext: @escaping (E) -> Void) -> Disposable {\n        return subscribe(onNext: onNext, onError: { error in\n            let error = \"Binding error: \\(error)\"\n            #if DEBUG\n                rxFatalError(error)\n            #else\n                print(error)\n            #endif\n        })\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Common/RxCocoaObjCRuntimeError+Extensions.swift",
    "content": "//\n//  RxCocoaObjCRuntimeError+Extensions.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 10/9/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if !RX_NO_MODULE\n    #if SWIFT_PACKAGE && !DISABLE_SWIZZLING && !os(Linux)\n        import RxCocoaRuntime\n    #endif\n#endif\n\n#if !DISABLE_SWIZZLING && !os(Linux)\n    /// RxCocoa ObjC runtime interception mechanism.\n    public enum RxCocoaInterceptionMechanism {\n        /// Unknown message interception mechanism.\n        case unknown\n        /// Key value observing interception mechanism.\n        case kvo\n    }\n\n    /// RxCocoa ObjC runtime modification errors.\n    public enum RxCocoaObjCRuntimeError\n        : Swift.Error\n        , CustomDebugStringConvertible {\n        /// Unknown error has occurred.\n        case unknown(target: AnyObject)\n\n        /**\n        If the object is reporting a different class then it's real class, that means that there is probably\n        already some interception mechanism in place or something weird is happening.\n\n        The most common case when this would happen is when using a combination of KVO (`observe`) and `sentMessage`.\n\n        This error is easily resolved by just using `sentMessage` observing before `observe`.\n\n        The reason why the other way around could create issues is because KVO will unregister it's interceptor\n        class and restore original class. Unfortunately that will happen no matter was there another interceptor\n        subclass registered in hierarchy or not.\n\n        Failure scenario:\n        * KVO sets class to be `__KVO__OriginalClass` (subclass of `OriginalClass`)\n        * `sentMessage` sets object class to be `_RX_namespace___KVO__OriginalClass` (subclass of `__KVO__OriginalClass`)\n        * then unobserving with KVO will restore class to be `OriginalClass` -> failure point (possibly a bug in KVO)\n\n        The reason why changing order of observing works is because any interception method on unregistration \n        should return object's original real class (if that doesn't happen then it's really easy to argue that's a bug\n        in that interception mechanism).\n\n        This library won't remove registered interceptor even if there aren't any observers left because\n        it's highly unlikely it would have any benefit in real world use cases, and it's even more\n        dangerous.\n        */\n        case objectMessagesAlreadyBeingIntercepted(target: AnyObject, interceptionMechanism: RxCocoaInterceptionMechanism)\n\n        /// Trying to observe messages for selector that isn't implemented.\n        case selectorNotImplemented(target: AnyObject)\n\n        /// Core Foundation classes are usually toll free bridged. Those classes crash the program in case\n        /// `object_setClass` is performed on them.\n        ///\n        /// There is a possibility to just swizzle methods on original object, but since those won't be usual use\n        /// cases for this library, then an error will just be reported for now.\n        case cantInterceptCoreFoundationTollFreeBridgedObjects(target: AnyObject)\n\n        /// Two libraries have simultaneously tried to modify ObjC runtime and that was detected. This can only\n        /// happen in scenarios where multiple interception libraries are used.\n        ///\n        /// To synchronize other libraries intercepting messages for an object, use `synchronized` on target object and\n        /// it's meta-class.\n        case threadingCollisionWithOtherInterceptionMechanism(target: AnyObject)\n\n        /// For some reason saving original method implementation under RX namespace failed.\n        case savingOriginalForwardingMethodFailed(target: AnyObject)\n\n        /// Intercepting a sent message by replacing a method implementation with `_objc_msgForward` failed for some reason.\n        case replacingMethodWithForwardingImplementation(target: AnyObject)\n\n        /// Attempt to intercept one of the performance sensitive methods:\n        ///    * class\n        ///    * respondsToSelector:\n        ///    * methodSignatureForSelector:\n        ///    * forwardingTargetForSelector:\n        case observingPerformanceSensitiveMessages(target: AnyObject)\n\n        /// Message implementation has unsupported return type (for example large struct). The reason why this is a error\n        /// is because in some cases intercepting sent messages requires replacing implementation with `_objc_msgForward_stret`\n        /// instead of `_objc_msgForward`.\n        ///\n        /// The unsupported cases should be fairly uncommon.\n        case observingMessagesWithUnsupportedReturnType(target: AnyObject)\n    }\n\n    extension RxCocoaObjCRuntimeError {\n        /// A textual representation of `self`, suitable for debugging.\n        public var debugDescription: String {\n            switch self {\n            case let .unknown(target):\n                return \"Unknown error occurred.\\nTarget: `\\(target)`\"\n            case let .objectMessagesAlreadyBeingIntercepted(target, interceptionMechanism):\n                let interceptionMechanismDescription = interceptionMechanism == .kvo ? \"KVO\" : \"other interception mechanism\"\n                return \"Collision between RxCocoa interception mechanism and \\(interceptionMechanismDescription).\"\n                    + \" To resolve this conflict please use this interception mechanism first.\\nTarget: \\(target)\"\n            case let .selectorNotImplemented(target):\n                return \"Trying to observe messages for selector that isn't implemented.\\nTarget: \\(target)\"\n            case let .cantInterceptCoreFoundationTollFreeBridgedObjects(target):\n                return \"Interception of messages sent to Core Foundation isn't supported.\\nTarget: \\(target)\"\n            case let .threadingCollisionWithOtherInterceptionMechanism(target):\n                return \"Detected a conflict while modifying ObjC runtime.\\nTarget: \\(target)\"\n            case let .savingOriginalForwardingMethodFailed(target):\n                return \"Saving original method implementation failed.\\nTarget: \\(target)\"\n            case let .replacingMethodWithForwardingImplementation(target):\n                return \"Intercepting a sent message by replacing a method implementation with `_objc_msgForward` failed for some reason.\\nTarget: \\(target)\"\n            case let .observingPerformanceSensitiveMessages(target):\n                return \"Attempt to intercept one of the performance sensitive methods. \\nTarget: \\(target)\"\n            case let .observingMessagesWithUnsupportedReturnType(target):\n                return \"Attempt to intercept a method with unsupported return type. \\nTarget: \\(target)\"\n            }\n        }\n    }\n    \n    // MARK: Conversions `NSError` > `RxCocoaObjCRuntimeError`\n\n    extension Error {\n        func rxCocoaErrorForTarget(_ target: AnyObject) -> RxCocoaObjCRuntimeError {\n            let error = self as NSError\n            \n            if error.domain == RXObjCRuntimeErrorDomain {\n                let errorCode = RXObjCRuntimeError(rawValue: error.code) ?? .unknown\n                \n                switch errorCode {\n                case .unknown:\n                    return .unknown(target: target)\n                case .objectMessagesAlreadyBeingIntercepted:\n                    let isKVO = (error.userInfo[RXObjCRuntimeErrorIsKVOKey] as? NSNumber)?.boolValue ?? false\n                    return .objectMessagesAlreadyBeingIntercepted(target: target, interceptionMechanism: isKVO ? .kvo : .unknown)\n                case .selectorNotImplemented:\n                    return .selectorNotImplemented(target: target)\n                case .cantInterceptCoreFoundationTollFreeBridgedObjects:\n                    return .cantInterceptCoreFoundationTollFreeBridgedObjects(target: target)\n                case .threadingCollisionWithOtherInterceptionMechanism:\n                    return .threadingCollisionWithOtherInterceptionMechanism(target: target)\n                case .savingOriginalForwardingMethodFailed:\n                    return .savingOriginalForwardingMethodFailed(target: target)\n                case .replacingMethodWithForwardingImplementation:\n                    return .replacingMethodWithForwardingImplementation(target: target)\n                case .observingPerformanceSensitiveMessages:\n                    return .observingPerformanceSensitiveMessages(target: target)\n                case .observingMessagesWithUnsupportedReturnType:\n                    return .observingMessagesWithUnsupportedReturnType(target: target)\n                }\n            }\n            \n            return RxCocoaObjCRuntimeError.unknown(target: target)\n        }\n    }\n\n#endif\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Common/RxTarget.swift",
    "content": "//\n//  RxTarget.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 7/12/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport class Foundation.NSObject\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\nclass RxTarget : NSObject\n               , Disposable {\n    \n    private var retainSelf: RxTarget?\n    \n    override init() {\n        super.init()\n        self.retainSelf = self\n\n#if TRACE_RESOURCES\n        _ = Resources.incrementTotal()\n#endif\n\n#if DEBUG\n        MainScheduler.ensureExecutingOnScheduler()\n#endif\n    }\n    \n    func dispose() {\n#if DEBUG\n        MainScheduler.ensureExecutingOnScheduler()\n#endif\n        self.retainSelf = nil\n    }\n\n#if TRACE_RESOURCES\n    deinit {\n        _ = Resources.decrementTotal()\n    }\n#endif\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Common/SectionedViewDataSourceType.swift",
    "content": "//\n//  SectionedViewDataSourceType.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 1/10/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport struct Foundation.IndexPath\n\n/// Data source with access to underlying sectioned model.\npublic protocol SectionedViewDataSourceType {\n    /// Returns model at index path.\n    ///\n    /// In case data source doesn't contain any sections when this method is being called, `RxCocoaError.ItemsNotYetBound(object: self)` is thrown.\n\n    /// - parameter indexPath: Model index path\n    /// - returns: Model at index path.\n    func model(at indexPath: IndexPath) throws -> Any\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Common/TextInput.swift",
    "content": "//\n//  TextInput.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 5/12/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n\n    /// Represents text input with reactive extensions.\n    public struct TextInput<Base: UITextInput> {\n        /// Base text input to extend.\n        public let base: Base\n\n        /// Reactive wrapper for `text` property.\n        public let text: ControlProperty<String?>\n\n        /// Initializes new text input.\n        ///\n        /// - parameter base: Base object.\n        /// - parameter text: Textual control property.\n        public init(base: Base, text: ControlProperty<String?>) {\n            self.base = base\n            self.text = text\n        }\n    }\n\n    extension Reactive where Base: UITextField {\n        /// Reactive text input.\n        public var textInput: TextInput<Base> {\n            return TextInput(base: base, text: self.text)\n        }\n    }\n\n    extension Reactive where Base: UITextView {\n        /// Reactive text input.\n        public var textInput: TextInput<Base> {\n            return TextInput(base: base, text: self.text)\n        }\n    }\n\n#endif\n\n#if os(macOS)\n    import Cocoa\n\n    /// Represents text input with reactive extensions.\n    public struct TextInput<Base: NSTextInputClient> {\n        /// Base text input to extend.\n        public let base: Base\n\n        /// Reactive wrapper for `text` property.\n        public let text: ControlProperty<String?>\n\n        /// Initializes new text input.\n        ///\n        /// - parameter base: Base object.\n        /// - parameter text: Textual control property.\n        public init(base: Base, text: ControlProperty<String?>) {\n            self.base = base\n            self.text = text\n        }\n    }\n\n    extension Reactive where Base: NSTextField, Base: NSTextInputClient {\n        /// Reactive text input.\n        public var textInput: TextInput<Base> {\n            return TextInput(base: base, text: self.text)\n        }\n    }\n\n#endif\n\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Deprecated.swift",
    "content": "//\n//  Deprecated.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 3/19/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n\nimport Dispatch\n\nextension ObservableType {\n\n    /**\n     Creates new subscription and sends elements to observer.\n\n     In this form it's equivalent to `subscribe` method, but it communicates intent better, and enables\n     writing more consistent binding code.\n\n     - parameter observer: Observer that receives events.\n     - returns: Disposable object that can be used to unsubscribe the observer.\n     */\n    @available(*, deprecated, renamed: \"bind(to:)\")\n    public func bindTo<O: ObserverType>(_ observer: O) -> Disposable where O.E == E {\n        return self.subscribe(observer)\n    }\n\n    /**\n     Creates new subscription and sends elements to observer.\n\n     In this form it's equivalent to `subscribe` method, but it communicates intent better, and enables\n     writing more consistent binding code.\n\n     - parameter observer: Observer that receives events.\n     - returns: Disposable object that can be used to unsubscribe the observer.\n     */\n    @available(*, deprecated, renamed: \"bind(to:)\")\n    public func bindTo<O: ObserverType>(_ observer: O) -> Disposable where O.E == E? {\n        return self.map { $0 }.subscribe(observer)\n    }\n\n    /**\n     Creates new subscription and sends elements to variable.\n\n     In case error occurs in debug mode, `fatalError` will be raised.\n     In case error occurs in release mode, `error` will be logged.\n\n     - parameter variable: Target variable for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer.\n     */\n    @available(*, deprecated, renamed: \"bind(to:)\")\n    public func bindTo(_ variable: Variable<E>) -> Disposable {\n        return subscribe { e in\n            switch e {\n            case let .next(element):\n                variable.value = element\n            case let .error(error):\n                let error = \"Binding error to variable: \\(error)\"\n                #if DEBUG\n                    rxFatalError(error)\n                #else\n                    print(error)\n                #endif\n            case .completed:\n                break\n            }\n        }\n    }\n\n    /**\n     Creates new subscription and sends elements to variable.\n\n     In case error occurs in debug mode, `fatalError` will be raised.\n     In case error occurs in release mode, `error` will be logged.\n\n     - parameter variable: Target variable for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer.\n     */\n    @available(*, deprecated, renamed: \"bind(to:)\")\n    public func bindTo(_ variable: Variable<E?>) -> Disposable {\n        return self.map { $0 as E? }.bindTo(variable)\n    }\n\n    /**\n     Subscribes to observable sequence using custom binder function.\n\n     - parameter binder: Function used to bind elements from `self`.\n     - returns: Object representing subscription.\n     */\n    @available(*, deprecated, renamed: \"bind(to:)\")\n    public func bindTo<R>(_ binder: (Self) -> R) -> R {\n        return binder(self)\n    }\n\n    /**\n     Subscribes to observable sequence using custom binder function and final parameter passed to binder function\n     after `self` is passed.\n\n     public func bindTo<R1, R2>(binder: Self -> R1 -> R2, curriedArgument: R1) -> R2 {\n     return binder(self)(curriedArgument)\n     }\n\n     - parameter binder: Function used to bind elements from `self`.\n     - parameter curriedArgument: Final argument passed to `binder` to finish binding process.\n     - returns: Object representing subscription.\n     */\n    @available(*, deprecated, renamed: \"bind(to:)\")\n    public func bindTo<R1, R2>(_ binder: (Self) -> (R1) -> R2, curriedArgument: R1) -> R2 {\n        return binder(self)(curriedArgument)\n    }\n\n\n    /**\n     Subscribes an element handler to an observable sequence.\n\n     In case error occurs in debug mode, `fatalError` will be raised.\n     In case error occurs in release mode, `error` will be logged.\n\n     - parameter onNext: Action to invoke for each element in the observable sequence.\n     - returns: Subscription object used to unsubscribe from the observable sequence.\n     */\n    @available(*, deprecated, renamed: \"bind(onNext:)\")\n    public func bindNext(_ onNext: @escaping (E) -> Void) -> Disposable {\n        return subscribe(onNext: onNext, onError: { error in\n            let error = \"Binding error: \\(error)\"\n            #if DEBUG\n                rxFatalError(error)\n            #else\n                print(error)\n            #endif\n        })\n    }\n}\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n\n    extension NSTextStorage {\n        @available(*, unavailable, message: \"createRxDelegateProxy is now unavailable, check DelegateProxyFactory\")\n        public func createRxDelegateProxy() -> RxTextStorageDelegateProxy {\n            fatalError()\n        }\n    }\n\n    extension UIScrollView {\n        @available(*, unavailable, message: \"createRxDelegateProxy is now unavailable, check DelegateProxyFactory\")\n        public func createRxDelegateProxy() -> RxScrollViewDelegateProxy {\n            fatalError()\n        }\n    }\n\n    extension UICollectionView {\n        @available(*, unavailable, message: \"createRxDataSourceProxy is now unavailable, check DelegateProxyFactory\")\n        public func createRxDataSourceProxy() -> RxCollectionViewDataSourceProxy {\n            fatalError()\n        }\n    }\n\n    extension UITableView {\n        @available(*, unavailable, message: \"createRxDataSourceProxy is now unavailable, check DelegateProxyFactory\")\n        public func createRxDataSourceProxy() -> RxTableViewDataSourceProxy {\n            fatalError()\n        }\n    }\n\n    extension UINavigationBar {\n        @available(*, unavailable, message: \"createRxDelegateProxy is now unavailable, check DelegateProxyFactory\")\n        public func createRxDelegateProxy() -> RxNavigationControllerDelegateProxy {\n            fatalError()\n        }\n    }\n\n    extension UINavigationController {\n        @available(*, unavailable, message: \"createRxDelegateProxy is now unavailable, check DelegateProxyFactory\")\n        public func createRxDelegateProxy() -> RxNavigationControllerDelegateProxy {\n            fatalError()\n        }\n    }\n\n    extension UITabBar {\n        @available(*, unavailable, message: \"createRxDelegateProxy is now unavailable, check DelegateProxyFactory\")\n        public func createRxDelegateProxy() -> RxTabBarDelegateProxy {\n            fatalError()\n        }\n    }\n\n    extension UITabBarController {\n        @available(*, unavailable, message: \"createRxDelegateProxy is now unavailable, check DelegateProxyFactory\")\n        public func createRxDelegateProxy() -> RxTabBarControllerDelegateProxy {\n            fatalError()\n        }\n    }\n\n    extension UISearchBar {\n        @available(*, unavailable, message: \"createRxDelegateProxy is now unavailable, check DelegateProxyFactory\")\n        public func createRxDelegateProxy() -> RxSearchBarDelegateProxy {\n            fatalError()\n        }\n    }\n\n#endif\n\n#if os(iOS)\n    extension UISearchController {\n        @available(*, unavailable, message: \"createRxDelegateProxy is now unavailable, check DelegateProxyFactory\")\n        public func createRxDelegateProxy() -> RxSearchControllerDelegateProxy {\n            fatalError()\n        }\n    }\n\n    extension UIPickerView {\n        @available(*, unavailable, message: \"createRxDelegateProxy is now unavailable, check DelegateProxyFactory\")\n        public func createRxDelegateProxy() -> RxPickerViewDelegateProxy {\n            fatalError()\n        }\n\n        @available(*, unavailable, message: \"createRxDataSourceProxy is now unavailable, check DelegateProxyFactory\")\n        public func createRxDataSourceProxy() -> RxPickerViewDataSourceProxy {\n            fatalError()\n        }\n    }\n    extension UIWebView {\n        @available(*, unavailable, message: \"createRxDelegateProxy is now unavailable, check DelegateProxyFactory\")\n        public func createRxDelegateProxy() -> RxWebViewDelegateProxy {\n            fatalError()\n        }\n    }\n#endif\n\n#if os(macOS)\n    import Cocoa\n\n    extension NSTextField {\n        @available(*, unavailable, message: \"createRxDelegateProxy is now unavailable, check DelegateProxyFactory\")\n        public func createRxDelegateProxy() -> RxTextFieldDelegateProxy {\n            fatalError()\n        }\n    }\n#endif\n\n/**\n This method can be used in unit tests to ensure that driver is using mock schedulers instead of\n main schedulers.\n\n **This shouldn't be used in normal release builds.**\n */\n@available(*, deprecated, renamed: \"SharingScheduler.mock(scheduler:action:)\")\npublic func driveOnScheduler(_ scheduler: SchedulerType, action: () -> ()) {\n    SharingScheduler.mock(scheduler: scheduler, action: action)\n}\n\nextension Variable {\n    /// Converts `Variable` to `SharedSequence` unit.\n    ///\n    /// - returns: Observable sequence.\n    @available(*, deprecated, renamed: \"asDriver()\")\n    public func asSharedSequence<SharingStrategy: SharingStrategyProtocol>(strategy: SharingStrategy.Type = SharingStrategy.self) -> SharedSequence<SharingStrategy, E> {\n        let source = self.asObservable()\n            .observeOn(SharingStrategy.scheduler)\n        return SharedSequence(source)\n    }\n}\n\n#if !os(Linux)\n\nextension DelegateProxy {\n    @available(*, unavailable, renamed: \"assignedProxy(for:)\")\n    public static func assignedProxyFor(_ object: ParentObject) -> Delegate? {\n        fatalError()\n    }\n    \n    @available(*, unavailable, renamed: \"currentDelegate(for:)\")\n    public static func currentDelegateFor(_ object: ParentObject) -> Delegate? {\n        fatalError()\n    }\n}\n\n#endif\n\n/**\nObserver that enforces interface binding rules:\n * can't bind errors (in debug builds binding of errors causes `fatalError` in release builds errors are being logged)\n * ensures binding is performed on main thread\n \n`UIBindingObserver` doesn't retain target interface and in case owned interface element is released, element isn't bound.\n \n In case event binding is attempted from non main dispatch queue, event binding will be dispatched async to main dispatch\n queue.\n*/\n@available(*, deprecated, renamed: \"Binder\")\npublic final class UIBindingObserver<UIElementType, Value> : ObserverType where UIElementType: AnyObject {\n    public typealias E = Value\n\n    weak var UIElement: UIElementType?\n\n    let binding: (UIElementType, Value) -> Void\n\n    /// Initializes `ViewBindingObserver` using\n    @available(*, deprecated, renamed: \"UIBinder.init(_:scheduler:binding:)\")\n    public init(UIElement: UIElementType, binding: @escaping (UIElementType, Value) -> Void) {\n        self.UIElement = UIElement\n        self.binding = binding\n    }\n\n    /// Binds next element to owner view as described in `binding`.\n    public func on(_ event: Event<Value>) {\n        if !DispatchQueue.isMain {\n            DispatchQueue.main.async {\n                self.on(event)\n            }\n            return\n        }\n\n        switch event {\n        case .next(let element):\n            if let view = self.UIElement {\n                binding(view, element)\n            }\n        case .error(let error):\n            bindingError(error)\n        case .completed:\n            break\n        }\n    }\n\n    /// Erases type of observer.\n    ///\n    /// - returns: type erased observer.\n    public func asObserver() -> AnyObserver<Value> {\n        return AnyObserver(eventHandler: on)\n    }\n}\n\n\n#if os(iOS)\n    extension Reactive where Base: UIRefreshControl {\n\n        /// Bindable sink for `beginRefreshing()`, `endRefreshing()` methods.\n        @available(*, deprecated, renamed: \"isRefreshing\")\n        public var refreshing: Binder<Bool> {\n            return self.isRefreshing\n        }\n    }\n#endif\n\n#if os(iOS) || os(tvOS)\nextension Reactive where Base: UIImageView {\n\n    /// Bindable sink for `image` property.\n    /// - parameter transitionType: Optional transition type while setting the image (kCATransitionFade, kCATransitionMoveIn, ...)\n    @available(*, deprecated, renamed: \"image\")\n    public func image(transitionType: String? = nil) -> Binder<UIImage?> {\n        return Binder(base) { imageView, image in\n            if let transitionType = transitionType {\n                if image != nil {\n                    let transition = CATransition()\n                    transition.duration = 0.25\n                    transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)\n                    transition.type = transitionType\n                    imageView.layer.add(transition, forKey: kCATransition)\n                }\n            }\n            else {\n                imageView.layer.removeAllAnimations()\n            }\n            imageView.image = image\n        }\n    }\n}\n#endif\n\n#if os(macOS)\n\n    extension Reactive where Base: NSImageView {\n\n        /// Bindable sink for `image` property.\n        ///\n        /// - parameter transitionType: Optional transition type while setting the image (kCATransitionFade, kCATransitionMoveIn, ...)\n        @available(*, deprecated, renamed: \"image\")\n        public func image(transitionType: String? = nil) -> Binder<NSImage?> {\n            return Binder(self.base) { control, value in\n                if let transitionType = transitionType {\n                    if value != nil {\n                        let transition = CATransition()\n                        transition.duration = 0.25\n                        transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)\n                        transition.type = transitionType\n                        control.layer?.add(transition, forKey: kCATransition)\n                    }\n                }\n                else {\n                    control.layer?.removeAllAnimations()\n                }\n                control.image = value\n            }\n        }\n    }\n#endif\n\n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n\nextension Variable {\n    /// Converts `Variable` to `Driver` trait.\n    ///\n    /// - returns: Driving observable sequence.\n    public func asDriver() -> Driver<E> {\n        let source = self.asObservable()\n            .observeOn(DriverSharingStrategy.scheduler)\n        return Driver(source)\n    }\n}\n\n\nprivate let errorMessage = \"`drive*` family of methods can be only called from `MainThread`.\\n\" +\n\"This is required to ensure that the last replayed `Driver` element is delivered on `MainThread`.\\n\"\n\nextension SharedSequenceConvertibleType where SharingStrategy == DriverSharingStrategy {\n    /**\n     Creates new subscription and sends elements to variable.\n     This method can be only called from `MainThread`.\n\n     - parameter variable: Target variable for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer from the variable.\n     */\n    public func drive(_ variable: Variable<E>) -> Disposable {\n        MainScheduler.ensureExecutingOnScheduler(errorMessage: errorMessage)\n        return drive(onNext: { e in\n            variable.value = e\n        })\n    }\n\n    /**\n     Creates new subscription and sends elements to variable.\n     This method can be only called from `MainThread`.\n\n     - parameter variable: Target variable for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer from the variable.\n     */\n    public func drive(_ variable: Variable<E?>) -> Disposable {\n        MainScheduler.ensureExecutingOnScheduler(errorMessage: errorMessage)\n        return drive(onNext: { e in\n            variable.value = e\n        })\n    }\n}\n\nextension ObservableConvertibleType {\n    /**\n     Converts anything convertible to `Observable` to `SharedSequence` unit.\n\n     - parameter onErrorJustReturn: Element to return in case of error and after that complete the sequence.\n     - returns: Driving observable sequence.\n     */\n    @available(*, deprecated, message: \"Please use conversion methods to some SharedSequence specialization.\")\n    public func asSharedSequence<S>(sharingStrategy: S.Type = S.self, onErrorJustReturn: E) -> SharedSequence<S, E> {\n        let source = self\n            .asObservable()\n            .observeOn(S.scheduler)\n            .catchErrorJustReturn(onErrorJustReturn)\n        return SharedSequence(source)\n    }\n\n    /**\n     Converts anything convertible to `Observable` to `SharedSequence` unit.\n\n     - parameter onErrorDriveWith: SharedSequence that provides elements of the sequence in case of error.\n     - returns: Driving observable sequence.\n     */\n    @available(*, deprecated, message: \"Please use conversion methods to some SharedSequence specialization.\")\n    public func asSharedSequence<S>(sharingStrategy: S.Type = S.self, onErrorDriveWith: SharedSequence<S, E>) -> SharedSequence<S, E> {\n        let source = self\n            .asObservable()\n            .observeOn(S.scheduler)\n            .catchError { _ in\n                onErrorDriveWith.asObservable()\n        }\n        return SharedSequence(source)\n    }\n\n    /**\n     Converts anything convertible to `Observable` to `SharedSequence` unit.\n\n     - parameter onErrorRecover: Calculates driver that continues to drive the sequence in case of error.\n     - returns: Driving observable sequence.\n     */\n    @available(*, deprecated, message: \"Please use conversion methods to some SharedSequence specialization.\")\n    public func asSharedSequence<S>(sharingStrategy: S.Type = S.self, onErrorRecover: @escaping (_ error: Swift.Error) -> SharedSequence<S, E>) -> SharedSequence<S, E> {\n        let source = self\n            .asObservable()\n            .observeOn(S.scheduler)\n            .catchError { error in\n                onErrorRecover(error).asObservable()\n        }\n        return SharedSequence(source)\n    }\n}\n\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Foundation/KVORepresentable+CoreGraphics.swift",
    "content": "//\n//  KVORepresentable+CoreGraphics.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 11/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if !os(Linux)\n\n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n    import CoreGraphics\n\n    import class Foundation.NSValue\n\n#if arch(x86_64) || arch(arm64)\nlet CGRectType = \"{CGRect={CGPoint=dd}{CGSize=dd}}\"\nlet CGSizeType = \"{CGSize=dd}\"\nlet CGPointType = \"{CGPoint=dd}\"\n#elseif arch(i386) || arch(arm)\nlet CGRectType = \"{CGRect={CGPoint=ff}{CGSize=ff}}\"\nlet CGSizeType = \"{CGSize=ff}\"\nlet CGPointType = \"{CGPoint=ff}\"\n#endif\n\nextension CGRect : KVORepresentable {\n    public typealias KVOType = NSValue\n\n    /// Constructs self from `NSValue`.\n    public init?(KVOValue: KVOType) {\n        if strcmp(KVOValue.objCType, CGRectType) != 0 {\n            return nil\n        }\n        var typedValue = CGRect(x: 0, y: 0, width: 0, height: 0)\n        KVOValue.getValue(&typedValue)\n        self = typedValue\n    }\n}\n\nextension CGPoint : KVORepresentable {\n    public typealias KVOType = NSValue\n\n    /// Constructs self from `NSValue`.\n    public init?(KVOValue: KVOType) {\n        if strcmp(KVOValue.objCType, CGPointType) != 0 {\n            return nil\n        }\n        var typedValue = CGPoint(x: 0, y: 0)\n        KVOValue.getValue(&typedValue)\n        self = typedValue\n    }\n}\n\nextension CGSize : KVORepresentable {\n    public typealias KVOType = NSValue\n\n    /// Constructs self from `NSValue`.\n    public init?(KVOValue: KVOType) {\n        if strcmp(KVOValue.objCType, CGSizeType) != 0 {\n            return nil\n        }\n        var typedValue = CGSize(width: 0, height: 0)\n        KVOValue.getValue(&typedValue)\n        self = typedValue\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Foundation/KVORepresentable+Swift.swift",
    "content": "//\n//  KVORepresentable+Swift.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 11/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport class Foundation.NSNumber\n\nextension Int : KVORepresentable {\n    public typealias KVOType = NSNumber\n\n    /// Constructs `Self` using KVO value.\n    public init?(KVOValue: KVOType) {\n        self.init(KVOValue.int32Value)\n    }\n}\n\nextension Int32 : KVORepresentable {\n    public typealias KVOType = NSNumber\n\n    /// Constructs `Self` using KVO value.\n    public init?(KVOValue: KVOType) {\n        self.init(KVOValue.int32Value)\n    }\n}\n\nextension Int64 : KVORepresentable {\n    public typealias KVOType = NSNumber\n\n    /// Constructs `Self` using KVO value.\n    public init?(KVOValue: KVOType) {\n        self.init(KVOValue.int64Value)\n    }\n}\n\nextension UInt : KVORepresentable {\n    public typealias KVOType = NSNumber\n\n    /// Constructs `Self` using KVO value.\n    public init?(KVOValue: KVOType) {\n        self.init(KVOValue.uintValue)\n    }\n}\n\nextension UInt32 : KVORepresentable {\n    public typealias KVOType = NSNumber\n\n    /// Constructs `Self` using KVO value.\n    public init?(KVOValue: KVOType) {\n        self.init(KVOValue.uint32Value)\n    }\n}\n\nextension UInt64 : KVORepresentable {\n    public typealias KVOType = NSNumber\n\n    /// Constructs `Self` using KVO value.\n    public init?(KVOValue: KVOType) {\n        self.init(KVOValue.uint64Value)\n    }\n}\n\nextension Bool : KVORepresentable {\n    public typealias KVOType = NSNumber\n\n    /// Constructs `Self` using KVO value.\n    public init?(KVOValue: KVOType) {\n        self.init(KVOValue.boolValue)\n    }\n}\n\n\nextension RawRepresentable where RawValue: KVORepresentable {\n    /// Constructs `Self` using optional KVO value.\n    init?(KVOValue: RawValue.KVOType?) {\n        guard let KVOValue = KVOValue else {\n            return nil\n        }\n\n        guard let rawValue = RawValue(KVOValue: KVOValue) else {\n            return nil\n        }\n\n        self.init(rawValue: rawValue)\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Foundation/KVORepresentable.swift",
    "content": "//\n//  KVORepresentable.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 11/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Type that is KVO representable (KVO mechanism can be used to observe it).\npublic protocol KVORepresentable {\n    /// Associated KVO type.\n    associatedtype KVOType\n\n    /// Constructs `Self` using KVO value.\n    init?(KVOValue: KVOType)\n}\n\nextension KVORepresentable {\n    /// Initializes `KVORepresentable` with optional value.\n    init?(KVOValue: KVOType?) {\n        guard let KVOValue = KVOValue else {\n            return nil\n        }\n\n        self.init(KVOValue: KVOValue)\n    }\n}\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Foundation/Logging.swift",
    "content": "//\n//  Logging.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 4/3/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport struct Foundation.URLRequest\n\n/// Simple logging settings for RxCocoa library.\npublic struct Logging {\n    public typealias LogURLRequest = (URLRequest) -> Bool\n    \n    /// Log URL requests to standard output in curl format.\n    public static var URLRequests: LogURLRequest =  { _ in\n    #if DEBUG\n        return true\n    #else\n        return false\n    #endif\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx+KVORepresentable.swift",
    "content": "//\n//  NSObject+Rx+KVORepresentable.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 11/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if !os(Linux)\n\nimport Foundation.NSObject\n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n\n    /// Key value observing options\n    public struct KeyValueObservingOptions: OptionSet {\n        /// Raw value\n        public let rawValue: UInt\n\n        public init(rawValue: UInt) {\n            self.rawValue = rawValue\n        }\n\n        /// Whether a sequence element should be sent to the observer immediately, before the subscribe method even returns.\n        public static let initial = KeyValueObservingOptions(rawValue: 1 << 0)\n        /// Whether to send updated values.\n        public static let new = KeyValueObservingOptions(rawValue: 1 << 1)\n    }\n\nextension Reactive where Base: NSObject {\n\n    /**\n     Specialization of generic `observe` method.\n\n     This is a special overload because to observe values of some type (for example `Int`), first values of KVO type\n     need to be observed (`NSNumber`), and then converted to result type.\n\n     For more information take a look at `observe` method.\n     */\n    public func observe<E: KVORepresentable>(_ type: E.Type, _ keyPath: String, options: KeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable<E?> {\n        return observe(E.KVOType.self, keyPath, options: options, retainSelf: retainSelf)\n            .map(E.init)\n    }\n}\n\n#if !DISABLE_SWIZZLING && !os(Linux)\n    // KVO\n    extension Reactive where Base: NSObject {\n        /**\n        Specialization of generic `observeWeakly` method.\n\n        For more information take a look at `observeWeakly` method.\n        */\n        public func observeWeakly<E: KVORepresentable>(_ type: E.Type, _ keyPath: String, options: KeyValueObservingOptions = [.new, .initial]) -> Observable<E?> {\n            return observeWeakly(E.KVOType.self, keyPath, options: options)\n                .map(E.init)\n        }\n    }\n#endif\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx+RawRepresentable.swift",
    "content": "//\n//  NSObject+Rx+RawRepresentable.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 11/9/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if !os(Linux)\n\nimport Foundation.NSObject\n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n\nextension Reactive where Base: NSObject {\n    /**\n     Specialization of generic `observe` method.\n\n     This specialization first observes `KVORepresentable` value and then converts it to `RawRepresentable` value.\n     \n     It is useful for observing bridged ObjC enum values.\n\n     For more information take a look at `observe` method.\n     */\n    public func observe<E: RawRepresentable>(_ type: E.Type, _ keyPath: String, options: KeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable<E?> where E.RawValue: KVORepresentable {\n        return observe(E.RawValue.KVOType.self, keyPath, options: options, retainSelf: retainSelf)\n            .map(E.init)\n    }\n}\n\n#if !DISABLE_SWIZZLING\n\n    // observeWeakly + RawRepresentable\n    extension Reactive where Base: NSObject {\n\n        /**\n         Specialization of generic `observeWeakly` method.\n\n         This specialization first observes `KVORepresentable` value and then converts it to `RawRepresentable` value.\n     \n         It is useful for observing bridged ObjC enum values.\n\n         For more information take a look at `observeWeakly` method.\n         */\n        public func observeWeakly<E: RawRepresentable>(_ type: E.Type, _ keyPath: String, options: KeyValueObservingOptions = [.new, .initial]) -> Observable<E?> where E.RawValue: KVORepresentable {\n            return observeWeakly(E.RawValue.KVOType.self, keyPath, options: options)\n                .map(E.init)\n        }\n    }\n#endif\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx.swift",
    "content": "//\n//  NSObject+Rx.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 2/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if !os(Linux)\n\nimport Foundation.NSObject\n#if !RX_NO_MODULE\n    import RxSwift\n    #if SWIFT_PACKAGE && !DISABLE_SWIZZLING && !os(Linux)\n        import RxCocoaRuntime\n    #endif\n#endif\n\n#if !DISABLE_SWIZZLING && !os(Linux)\nfileprivate var deallocatingSubjectTriggerContext: UInt8 = 0\nfileprivate var deallocatingSubjectContext: UInt8 = 0\n#endif\nfileprivate var deallocatedSubjectTriggerContext: UInt8 = 0\nfileprivate var deallocatedSubjectContext: UInt8 = 0\n\n#if !os(Linux)\n\n/**\nKVO is a tricky mechanism.\n\nWhen observing child in a ownership hierarchy, usually retaining observing target is wanted behavior.\nWhen observing parent in a ownership hierarchy, usually retaining target isn't wanter behavior.\n\nKVO with weak references is especially tricky. For it to work, some kind of swizzling is required.\nThat can be done by\n    * replacing object class dynamically (like KVO does)\n    * by swizzling `dealloc` method on all instances for a class.\n    * some third method ...\n\nBoth approaches can fail in certain scenarios:\n    * problems arise when swizzlers return original object class (like KVO does when nobody is observing)\n    * Problems can arise because replacing dealloc method isn't atomic operation (get implementation,\n    set implementation).\n\nSecond approach is chosen. It can fail in case there are multiple libraries dynamically trying\nto replace dealloc method. In case that isn't the case, it should be ok.\n*/\nextension Reactive where Base: NSObject {\n\n\n    /**\n     Observes values on `keyPath` starting from `self` with `options` and retains `self` if `retainSelf` is set.\n\n     `observe` is just a simple and performant wrapper around KVO mechanism.\n\n     * it can be used to observe paths starting from `self` or from ancestors in ownership graph (`retainSelf = false`)\n     * it can be used to observe paths starting from descendants in ownership graph (`retainSelf = true`)\n     * the paths have to consist only of `strong` properties, otherwise you are risking crashing the system by not unregistering KVO observer before dealloc.\n\n     If support for weak properties is needed or observing arbitrary or unknown relationships in the\n     ownership tree, `observeWeakly` is the preferred option.\n\n     - parameter keyPath: Key path of property names to observe.\n     - parameter options: KVO mechanism notification options.\n     - parameter retainSelf: Retains self during observation if set `true`.\n     - returns: Observable sequence of objects on `keyPath`.\n     */\n    public func observe<E>(_ type: E.Type, _ keyPath: String, options: KeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable<E?> {\n        return KVOObservable(object: base, keyPath: keyPath, options: options, retainTarget: retainSelf).asObservable()\n    }\n}\n\n#endif\n\n#if !DISABLE_SWIZZLING && !os(Linux)\n// KVO\nextension Reactive where Base: NSObject {\n    /**\n     Observes values on `keyPath` starting from `self` with `options` and doesn't retain `self`.\n\n     It can be used in all cases where `observe` can be used and additionally\n\n     * because it won't retain observed target, it can be used to observe arbitrary object graph whose ownership relation is unknown\n     * it can be used to observe `weak` properties\n\n     **Since it needs to intercept object deallocation process it needs to perform swizzling of `dealloc` method on observed object.**\n\n     - parameter keyPath: Key path of property names to observe.\n     - parameter options: KVO mechanism notification options.\n     - returns: Observable sequence of objects on `keyPath`.\n     */\n    public func observeWeakly<E>(_ type: E.Type, _ keyPath: String, options: KeyValueObservingOptions = [.new, .initial]) -> Observable<E?> {\n        return observeWeaklyKeyPathFor(base, keyPath: keyPath, options: options)\n            .map { n in\n                return n as? E\n            }\n    }\n}\n#endif\n\n// Dealloc\nextension Reactive where Base: AnyObject {\n    \n    /**\n    Observable sequence of object deallocated events.\n    \n    After object is deallocated one `()` element will be produced and sequence will immediately complete.\n    \n    - returns: Observable sequence of object deallocated events.\n    */\n    public var deallocated: Observable<Void> {\n        return synchronized {\n            if let deallocObservable = objc_getAssociatedObject(base, &deallocatedSubjectContext) as? DeallocObservable {\n                return deallocObservable._subject\n            }\n\n            let deallocObservable = DeallocObservable()\n\n            objc_setAssociatedObject(base, &deallocatedSubjectContext, deallocObservable, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n            return deallocObservable._subject\n        }\n    }\n\n#if !DISABLE_SWIZZLING && !os(Linux)\n\n    /**\n     Observable sequence of message arguments that completes when object is deallocated.\n     \n     Each element is produced before message is invoked on target object. `methodInvoked`\n     exists in case observing of invoked messages is needed.\n\n     In case an error occurs sequence will fail with `RxCocoaObjCRuntimeError`.\n     \n     In case some argument is `nil`, instance of `NSNull()` will be sent.\n\n     - returns: Observable sequence of arguments passed to `selector` method.\n     */\n    public func sentMessage(_ selector: Selector) -> Observable<[Any]> {\n        return synchronized {\n            // in case of dealloc selector replay subject behavior needs to be used\n            if selector == deallocSelector {\n                return deallocating.map { _ in [] }\n            }\n\n            do {\n                let proxy: MessageSentProxy = try registerMessageInterceptor(selector)\n                return proxy.messageSent.asObservable()\n            }\n            catch let e {\n                return Observable.error(e)\n            }\n        }\n    }\n\n    /**\n     Observable sequence of message arguments that completes when object is deallocated.\n\n     Each element is produced after message is invoked on target object. `sentMessage`\n     exists in case interception of sent messages before they were invoked is needed.\n\n     In case an error occurs sequence will fail with `RxCocoaObjCRuntimeError`.\n\n     In case some argument is `nil`, instance of `NSNull()` will be sent.\n\n     - returns: Observable sequence of arguments passed to `selector` method.\n     */\n    public func methodInvoked(_ selector: Selector) -> Observable<[Any]> {\n        return synchronized {\n            // in case of dealloc selector replay subject behavior needs to be used\n            if selector == deallocSelector {\n                return deallocated.map { _ in [] }\n            }\n\n\n            do {\n                let proxy: MessageSentProxy = try registerMessageInterceptor(selector)\n                return proxy.methodInvoked.asObservable()\n            }\n            catch let e {\n                return Observable.error(e)\n            }\n        }\n    }\n\n    /**\n    Observable sequence of object deallocating events.\n    \n    When `dealloc` message is sent to `self` one `()` element will be produced and after object is deallocated sequence\n    will immediately complete.\n     \n    In case an error occurs sequence will fail with `RxCocoaObjCRuntimeError`.\n    \n    - returns: Observable sequence of object deallocating events.\n    */\n    public var deallocating: Observable<()> {\n        return synchronized {\n            do {\n                let proxy: DeallocatingProxy = try registerMessageInterceptor(deallocSelector)\n                return proxy.messageSent.asObservable()\n            }\n            catch let e {\n                return Observable.error(e)\n            }\n        }\n    }\n\n    fileprivate func registerMessageInterceptor<T: MessageInterceptorSubject>(_ selector: Selector) throws -> T {\n        let rxSelector = RX_selector(selector)\n        let selectorReference = RX_reference_from_selector(rxSelector)\n\n        let subject: T\n        if let existingSubject = objc_getAssociatedObject(base, selectorReference) as? T {\n            subject = existingSubject\n        }\n        else {\n            subject = T()\n            objc_setAssociatedObject(\n                base,\n                selectorReference,\n                subject,\n                .OBJC_ASSOCIATION_RETAIN_NONATOMIC\n            )\n        }\n\n        if subject.isActive {\n            return subject\n        }\n\n        var error: NSError?\n        let targetImplementation = RX_ensure_observing(base, selector, &error)\n        if targetImplementation == nil {\n            throw error?.rxCocoaErrorForTarget(base) ?? RxCocoaError.unknown\n        }\n\n        subject.targetImplementation = targetImplementation!\n\n        return subject\n    }\n#endif\n}\n\n// MARK: Message interceptors\n\n#if !DISABLE_SWIZZLING && !os(Linux)\n\n    fileprivate protocol MessageInterceptorSubject: class {\n        init()\n\n        var isActive: Bool {\n            get\n        }\n\n        var targetImplementation: IMP { get set }\n    }\n\n    fileprivate final class DeallocatingProxy\n        : MessageInterceptorSubject\n        , RXDeallocatingObserver {\n        typealias E = ()\n\n        let messageSent = ReplaySubject<()>.create(bufferSize: 1)\n\n        @objc var targetImplementation: IMP = RX_default_target_implementation()\n\n        var isActive: Bool {\n            return targetImplementation != RX_default_target_implementation()\n        }\n\n        init() {\n        }\n\n        @objc func deallocating() -> Void {\n            messageSent.on(.next(()))\n        }\n\n        deinit {\n            messageSent.on(.completed)\n        }\n    }\n\n    fileprivate final class MessageSentProxy\n        : MessageInterceptorSubject\n        , RXMessageSentObserver {\n        typealias E = [AnyObject]\n\n        let messageSent = PublishSubject<[Any]>()\n        let methodInvoked = PublishSubject<[Any]>()\n\n        @objc var targetImplementation: IMP = RX_default_target_implementation()\n\n        var isActive: Bool {\n            return targetImplementation != RX_default_target_implementation()\n        }\n\n        init() {\n        }\n\n        @objc func messageSent(withArguments arguments: [Any]) -> Void {\n            messageSent.on(.next(arguments))\n        }\n\n        @objc func methodInvoked(withArguments arguments: [Any]) -> Void {\n            methodInvoked.on(.next(arguments))\n        }\n\n        deinit {\n            messageSent.on(.completed)\n            methodInvoked.on(.completed)\n        }\n    }\n\n#endif\n\n\nfileprivate final class DeallocObservable {\n    let _subject = ReplaySubject<Void>.create(bufferSize:1)\n\n    init() {\n    }\n\n    deinit {\n        _subject.on(.next(()))\n        _subject.on(.completed)\n    }\n}\n\n// MARK: KVO\n\n#if !os(Linux)\n\nfileprivate protocol KVOObservableProtocol {\n    var target: AnyObject { get }\n    var keyPath: String { get }\n    var retainTarget: Bool { get }\n    var options: KeyValueObservingOptions { get }\n}\n\nfileprivate final class KVOObserver\n    : _RXKVOObserver\n    , Disposable {\n    typealias Callback = (Any?) -> Void\n\n    var retainSelf: KVOObserver? = nil\n\n    init(parent: KVOObservableProtocol, callback: @escaping Callback) {\n        #if TRACE_RESOURCES\n            _ = Resources.incrementTotal()\n        #endif\n\n        super.init(target: parent.target, retainTarget: parent.retainTarget, keyPath: parent.keyPath, options: parent.options.nsOptions, callback: callback)\n        self.retainSelf = self\n    }\n\n    override func dispose() {\n        super.dispose()\n        self.retainSelf = nil\n    }\n\n    deinit {\n        #if TRACE_RESOURCES\n            _ = Resources.decrementTotal()\n        #endif\n    }\n}\n\nfileprivate final class KVOObservable<Element>\n    : ObservableType\n    , KVOObservableProtocol {\n    typealias E = Element?\n\n    unowned var target: AnyObject\n    var strongTarget: AnyObject?\n\n    var keyPath: String\n    var options: KeyValueObservingOptions\n    var retainTarget: Bool\n\n    init(object: AnyObject, keyPath: String, options: KeyValueObservingOptions, retainTarget: Bool) {\n        self.target = object\n        self.keyPath = keyPath\n        self.options = options\n        self.retainTarget = retainTarget\n        if retainTarget {\n            self.strongTarget = object\n        }\n    }\n\n    func subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == Element? {\n        let observer = KVOObserver(parent: self) { (value) in\n            if value as? NSNull != nil {\n                observer.on(.next(nil))\n                return\n            }\n            observer.on(.next(value as? Element))\n        }\n\n        return Disposables.create(with: observer.dispose)\n    }\n\n}\n\n#endif\n\n#if !DISABLE_SWIZZLING && !os(Linux)\n\n    fileprivate func observeWeaklyKeyPathFor(_ target: NSObject, keyPath: String, options: KeyValueObservingOptions) -> Observable<AnyObject?> {\n        let components = keyPath.components(separatedBy: \".\").filter { $0 != \"self\" }\n\n        let observable = observeWeaklyKeyPathFor(target, keyPathSections: components, options: options)\n            .finishWithNilWhenDealloc(target)\n\n        if !options.intersection(.initial).isEmpty {\n            return observable\n        }\n        else {\n            return observable\n                .skip(1)\n        }\n    }\n\n    // This should work correctly\n    // Identifiers can't contain `,`, so the only place where `,` can appear\n    // is as a delimiter.\n    // This means there is `W` as element in an array of property attributes.\n    fileprivate func isWeakProperty(_ properyRuntimeInfo: String) -> Bool {\n        return properyRuntimeInfo.range(of: \",W,\") != nil\n    }\n\n    fileprivate extension ObservableType where E == AnyObject? {\n        func finishWithNilWhenDealloc(_ target: NSObject)\n            -> Observable<AnyObject?> {\n                let deallocating = target.rx.deallocating\n\n                return deallocating\n                    .map { _ in\n                        return Observable.just(nil)\n                    }\n                    .startWith(self.asObservable())\n                    .switchLatest()\n        }\n    }\n\n    fileprivate extension KeyValueObservingOptions {\n        fileprivate var nsOptions: NSKeyValueObservingOptions {\n            var result: UInt = 0\n            if self.contains(.new) {\n                result |= NSKeyValueObservingOptions.new.rawValue\n            }\n            if self.contains(.initial) {\n                result |= NSKeyValueObservingOptions.initial.rawValue\n            }\n\n            return NSKeyValueObservingOptions(rawValue: result)\n        }\n    }\n    \n    fileprivate func observeWeaklyKeyPathFor(\n        _ target: NSObject,\n        keyPathSections: [String],\n        options: KeyValueObservingOptions\n        ) -> Observable<AnyObject?> {\n\n        weak var weakTarget: AnyObject? = target\n\n        let propertyName = keyPathSections[0]\n        let remainingPaths = Array(keyPathSections[1..<keyPathSections.count])\n\n        let property = class_getProperty(object_getClass(target), propertyName)\n        if property == nil {\n            return Observable.error(RxCocoaError.invalidPropertyName(object: target, propertyName: propertyName))\n        }\n        let propertyAttributes = property_getAttributes(property!)\n\n        // should dealloc hook be in place if week property, or just create strong reference because it doesn't matter\n        let isWeak = isWeakProperty(propertyAttributes.map(String.init) ?? \"\")\n        let propertyObservable = KVOObservable(object: target, keyPath: propertyName, options: options.union(.initial), retainTarget: false) as KVOObservable<AnyObject>\n\n        // KVO recursion for value changes\n        return propertyObservable\n            .flatMapLatest { (nextTarget: AnyObject?) -> Observable<AnyObject?> in\n                if nextTarget == nil {\n                    return Observable.just(nil)\n                }\n                let nextObject = nextTarget! as? NSObject\n\n                let strongTarget: AnyObject? = weakTarget\n\n                if nextObject == nil {\n                    return Observable.error(RxCocoaError.invalidObjectOnKeyPath(object: nextTarget!, sourceObject: strongTarget ?? NSNull(), propertyName: propertyName))\n                }\n\n                // if target is alive, then send change\n                // if it's deallocated, don't send anything\n                if strongTarget == nil {\n                    return Observable.empty()\n                }\n\n                let nextElementsObservable = keyPathSections.count == 1\n                    ? Observable.just(nextTarget)\n                    : observeWeaklyKeyPathFor(nextObject!, keyPathSections: remainingPaths, options: options)\n                \n                if isWeak {\n                    return nextElementsObservable\n                        .finishWithNilWhenDealloc(nextObject!)\n                }\n                else {\n                    return nextElementsObservable\n                }\n        }\n    }\n#endif\n\n// MARK Constants\n\nfileprivate let deallocSelector = NSSelectorFromString(\"dealloc\")\n\n// MARK: AnyObject + Reactive\n\nextension Reactive where Base: AnyObject {\n    func synchronized<T>( _ action: () -> T) -> T {\n        objc_sync_enter(self.base)\n        let result = action()\n        objc_sync_exit(self.base)\n        return result\n    }\n}\n\nextension Reactive where Base: AnyObject {\n    /**\n     Helper to make sure that `Observable` returned from `createCachedObservable` is only created once.\n     This is important because there is only one `target` and `action` properties on `NSControl` or `UIBarButtonItem`.\n     */\n    func lazyInstanceObservable<T: AnyObject>(_ key: UnsafeRawPointer, createCachedObservable: () -> T) -> T {\n        if let value = objc_getAssociatedObject(base, key) {\n            return value as! T\n        }\n        \n        let observable = createCachedObservable()\n        \n        objc_setAssociatedObject(base, key, observable, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n        \n        return observable\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Foundation/NotificationCenter+Rx.swift",
    "content": "//\n//  NotificationCenter+Rx.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 5/2/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport class Foundation.NotificationCenter\nimport struct Foundation.Notification\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\nextension Reactive where Base: NotificationCenter {\n    /**\n    Transforms notifications posted to notification center to observable sequence of notifications.\n    \n    - parameter name: Optional name used to filter notifications.\n    - parameter object: Optional object used to filter notifications.\n    - returns: Observable sequence of posted notifications.\n    */\n    public func notification(_ name: Notification.Name?, object: AnyObject? = nil) -> Observable<Notification> {\n        return Observable.create { [weak object] observer in\n            let nsObserver = self.base.addObserver(forName: name, object: object, queue: nil) { notification in\n                observer.on(.next(notification))\n            }\n            \n            return Disposables.create {\n                self.base.removeObserver(nsObserver)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Foundation/URLSession+Rx.swift",
    "content": "//\n//  URLSession+Rx.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 3/23/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport struct Foundation.URL\nimport struct Foundation.URLRequest\nimport struct Foundation.Data\nimport struct Foundation.Date\nimport struct Foundation.TimeInterval\nimport class Foundation.HTTPURLResponse\nimport class Foundation.URLSession\nimport class Foundation.URLResponse\nimport class Foundation.JSONSerialization\nimport class Foundation.NSError\nimport var Foundation.NSURLErrorCancelled\nimport var Foundation.NSURLErrorDomain\n\n#if os(Linux)\n    // don't know why\n    import Foundation\n#endif\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\n/// RxCocoa URL errors.\npublic enum RxCocoaURLError\n    : Swift.Error {\n    /// Unknown error occurred.\n    case unknown\n    /// Response is not NSHTTPURLResponse\n    case nonHTTPResponse(response: URLResponse)\n    /// Response is not successful. (not in `200 ..< 300` range)\n    case httpRequestFailed(response: HTTPURLResponse, data: Data?)\n    /// Deserialization error.\n    case deserializationError(error: Swift.Error)\n}\n\nextension RxCocoaURLError\n    : CustomDebugStringConvertible {\n    /// A textual representation of `self`, suitable for debugging.\n    public var debugDescription: String {\n        switch self {\n        case .unknown:\n            return \"Unknown error has occurred.\"\n        case let .nonHTTPResponse(response):\n            return \"Response is not NSHTTPURLResponse `\\(response)`.\"\n        case let .httpRequestFailed(response, _):\n            return \"HTTP request failed with `\\(response.statusCode)`.\"\n        case let .deserializationError(error):\n            return \"Error during deserialization of the response: \\(error)\"\n        }\n    }\n}\n\nfileprivate func escapeTerminalString(_ value: String) -> String {\n    return value.replacingOccurrences(of: \"\\\"\", with: \"\\\\\\\"\", options:[], range: nil)\n}\n\nfileprivate func convertURLRequestToCurlCommand(_ request: URLRequest) -> String {\n    let method = request.httpMethod ?? \"GET\"\n    var returnValue = \"curl -X \\(method) \"\n\n    if let httpBody = request.httpBody, request.httpMethod == \"POST\" {\n        let maybeBody = String(data: httpBody, encoding: String.Encoding.utf8)\n        if let body = maybeBody {\n            returnValue += \"-d \\\"\\(escapeTerminalString(body))\\\" \"\n        }\n    }\n\n    for (key, value) in request.allHTTPHeaderFields ?? [:] {\n        let escapedKey = escapeTerminalString(key as String)\n        let escapedValue = escapeTerminalString(value as String)\n        returnValue += \"\\n    -H \\\"\\(escapedKey): \\(escapedValue)\\\" \"\n    }\n\n    let URLString = request.url?.absoluteString ?? \"<unknown url>\"\n\n    returnValue += \"\\n\\\"\\(escapeTerminalString(URLString))\\\"\"\n\n    returnValue += \" -i -v\"\n\n    return returnValue\n}\n\nfileprivate func convertResponseToString(_ response: URLResponse?, _ error: NSError?, _ interval: TimeInterval) -> String {\n    let ms = Int(interval * 1000)\n\n    if let response = response as? HTTPURLResponse {\n        if 200 ..< 300 ~= response.statusCode {\n            return \"Success (\\(ms)ms): Status \\(response.statusCode)\"\n        }\n        else {\n            return \"Failure (\\(ms)ms): Status \\(response.statusCode)\"\n        }\n    }\n\n    if let error = error {\n        if error.domain == NSURLErrorDomain && error.code == NSURLErrorCancelled {\n            return \"Canceled (\\(ms)ms)\"\n        }\n        return \"Failure (\\(ms)ms): NSError > \\(error)\"\n    }\n\n    return \"<Unhandled response from server>\"\n}\n\nextension Reactive where Base: URLSession {\n    /**\n    Observable sequence of responses for URL request.\n    \n    Performing of request starts after observer is subscribed and not after invoking this method.\n    \n    **URL requests will be performed per subscribed observer.**\n    \n    Any error during fetching of the response will cause observed sequence to terminate with error.\n    \n    - parameter request: URL request.\n    - returns: Observable sequence of URL responses.\n    */\n    public func response(request: URLRequest) -> Observable<(response: HTTPURLResponse, data: Data)> {\n        return Observable.create { observer in\n\n            // smart compiler should be able to optimize this out\n            let d: Date?\n\n            if Logging.URLRequests(request) {\n                d = Date()\n            }\n            else {\n               d = nil\n            }\n\n            let task = self.base.dataTask(with: request) { (data, response, error) in\n\n                if Logging.URLRequests(request) {\n                    let interval = Date().timeIntervalSince(d ?? Date())\n                    print(convertURLRequestToCurlCommand(request))\n                    #if os(Linux)\n                        print(convertResponseToString(response, error.flatMap { $0 as? NSError }, interval))\n                    #else\n                        print(convertResponseToString(response, error.map { $0 as NSError }, interval))\n                    #endif\n                }\n                \n                guard let response = response, let data = data else {\n                    observer.on(.error(error ?? RxCocoaURLError.unknown))\n                    return\n                }\n\n                guard let httpResponse = response as? HTTPURLResponse else {\n                    observer.on(.error(RxCocoaURLError.nonHTTPResponse(response: response)))\n                    return\n                }\n\n                observer.on(.next((httpResponse, data)))\n                observer.on(.completed)\n            }\n\n            task.resume()\n\n            return Disposables.create(with: task.cancel)\n        }\n    }\n\n    /**\n    Observable sequence of response data for URL request.\n    \n    Performing of request starts after observer is subscribed and not after invoking this method.\n    \n    **URL requests will be performed per subscribed observer.**\n    \n    Any error during fetching of the response will cause observed sequence to terminate with error.\n    \n    If response is not HTTP response with status code in the range of `200 ..< 300`, sequence\n    will terminate with `(RxCocoaErrorDomain, RxCocoaError.NetworkError)`.\n    \n    - parameter request: URL request.\n    - returns: Observable sequence of response data.\n    */\n    public func data(request: URLRequest) -> Observable<Data> {\n        return response(request: request).map { pair -> Data in\n            if 200 ..< 300 ~= pair.0.statusCode {\n                return pair.1\n            }\n            else {\n                throw RxCocoaURLError.httpRequestFailed(response: pair.0, data: pair.1)\n            }\n        }\n    }\n\n    /**\n    Observable sequence of response JSON for URL request.\n    \n    Performing of request starts after observer is subscribed and not after invoking this method.\n    \n    **URL requests will be performed per subscribed observer.**\n    \n    Any error during fetching of the response will cause observed sequence to terminate with error.\n    \n    If response is not HTTP response with status code in the range of `200 ..< 300`, sequence\n    will terminate with `(RxCocoaErrorDomain, RxCocoaError.NetworkError)`.\n    \n    If there is an error during JSON deserialization observable sequence will fail with that error.\n    \n    - parameter request: URL request.\n    - returns: Observable sequence of response JSON.\n    */\n    public func json(request: URLRequest, options: JSONSerialization.ReadingOptions = []) -> Observable<Any> {\n        return data(request: request).map { (data) -> Any in\n            do {\n                return try JSONSerialization.jsonObject(with: data, options: options)\n            } catch let error {\n                throw RxCocoaURLError.deserializationError(error: error)\n            }\n        }\n    }\n\n    /**\n    Observable sequence of response JSON for GET request with `URL`.\n     \n    Performing of request starts after observer is subscribed and not after invoking this method.\n    \n    **URL requests will be performed per subscribed observer.**\n    \n    Any error during fetching of the response will cause observed sequence to terminate with error.\n    \n    If response is not HTTP response with status code in the range of `200 ..< 300`, sequence\n    will terminate with `(RxCocoaErrorDomain, RxCocoaError.NetworkError)`.\n    \n    If there is an error during JSON deserialization observable sequence will fail with that error.\n    \n    - parameter url: URL of `NSURLRequest` request.\n    - returns: Observable sequence of response JSON.\n    */\n    public func json(url: Foundation.URL) -> Observable<Any> {\n        return json(request: URLRequest(url: url))\n    }\n}\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Runtime/_RX.m",
    "content": "//\n//  _RX.m\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 7/12/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#import \"include/_RX.h\"\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Runtime/_RXDelegateProxy.m",
    "content": "//\n//  _RXDelegateProxy.m\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 7/4/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#import \"include/_RXDelegateProxy.h\"\n#import \"include/_RX.h\"\n#import \"include/_RXObjCRuntime.h\"\n\n@interface _RXDelegateProxy () {\n    id __weak __forwardToDelegate;\n}\n\n@property (nonatomic, strong) id strongForwardDelegate;\n\n@end\n\nstatic NSMutableDictionary *voidSelectorsPerClass = nil;\n\n@implementation _RXDelegateProxy\n\n+(NSSet*)collectVoidSelectorsForProtocol:(Protocol *)protocol {\n    NSMutableSet *selectors = [NSMutableSet set];\n\n    unsigned int protocolMethodCount = 0;\n    struct objc_method_description *pMethods = protocol_copyMethodDescriptionList(protocol, NO, YES, &protocolMethodCount);\n\n    for (unsigned int i = 0; i < protocolMethodCount; ++i) {\n        struct objc_method_description method = pMethods[i];\n        if (RX_is_method_with_description_void(method)) {\n            [selectors addObject:SEL_VALUE(method.name)];\n        }\n    }\n            \n    free(pMethods);\n\n    unsigned int numberOfBaseProtocols = 0;\n    Protocol * __unsafe_unretained * pSubprotocols = protocol_copyProtocolList(protocol, &numberOfBaseProtocols);\n\n    for (unsigned int i = 0; i < numberOfBaseProtocols; ++i) {\n        [selectors unionSet:[self collectVoidSelectorsForProtocol:pSubprotocols[i]]];\n    }\n    \n    free(pSubprotocols);\n\n    return selectors;\n}\n\n+(void)initialize {\n    @synchronized (_RXDelegateProxy.class) {\n        if (voidSelectorsPerClass == nil) {\n            voidSelectorsPerClass = [[NSMutableDictionary alloc] init];\n        }\n\n        NSMutableSet *voidSelectors = [NSMutableSet set];\n\n#define CLASS_HIERARCHY_MAX_DEPTH 100\n\n        NSInteger  classHierarchyDepth = 0;\n        Class      targetClass         = NULL;\n\n        for (classHierarchyDepth = 0, targetClass = self;\n             classHierarchyDepth < CLASS_HIERARCHY_MAX_DEPTH && targetClass != nil;\n             ++classHierarchyDepth, targetClass = class_getSuperclass(targetClass)\n        ) {\n            unsigned int count;\n            Protocol *__unsafe_unretained *pProtocols = class_copyProtocolList(targetClass, &count);\n            \n            for (unsigned int i = 0; i < count; i++) {\n                NSSet *selectorsForProtocol = [self collectVoidSelectorsForProtocol:pProtocols[i]];\n                [voidSelectors unionSet:selectorsForProtocol];\n            }\n            \n            free(pProtocols);\n        }\n\n        if (classHierarchyDepth == CLASS_HIERARCHY_MAX_DEPTH) {\n            NSLog(@\"Detected weird class hierarchy with depth over %d. Starting with this class -> %@\", CLASS_HIERARCHY_MAX_DEPTH, self);\n#if DEBUG\n            abort();\n#endif\n        }\n        \n        voidSelectorsPerClass[CLASS_VALUE(self)] = voidSelectors;\n    }\n}\n\n-(id)_forwardToDelegate {\n    return __forwardToDelegate;\n}\n\n-(void)_setForwardToDelegate:(id __nullable)forwardToDelegate retainDelegate:(BOOL)retainDelegate {\n    __forwardToDelegate = forwardToDelegate;\n    if (retainDelegate) {\n        self.strongForwardDelegate = forwardToDelegate;\n    }\n    else {\n        self.strongForwardDelegate = nil;\n    }\n}\n\n-(BOOL)hasWiredImplementationForSelector:(SEL)selector {\n    return [super respondsToSelector:selector];\n}\n\n-(BOOL)voidDelegateMethodsContain:(SEL)selector {\n    @synchronized(_RXDelegateProxy.class) {\n        NSSet *voidSelectors = voidSelectorsPerClass[CLASS_VALUE(self.class)];\n        NSAssert(voidSelectors != nil, @\"Set of allowed methods not initialized\");\n        return [voidSelectors containsObject:SEL_VALUE(selector)];\n    }\n}\n\n-(void)forwardInvocation:(NSInvocation *)anInvocation {\n    BOOL isVoid = RX_is_method_signature_void(anInvocation.methodSignature);\n    NSArray *arguments = nil;\n    if (isVoid) {\n        arguments = RX_extract_arguments(anInvocation);\n        [self _sentMessage:anInvocation.selector withArguments:arguments];\n    }\n    \n    if (self._forwardToDelegate && [self._forwardToDelegate respondsToSelector:anInvocation.selector]) {\n        [anInvocation invokeWithTarget:self._forwardToDelegate];\n    }\n\n    if (isVoid) {\n        [self _methodInvoked:anInvocation.selector withArguments:arguments];\n    }\n}\n\n// abstract method\n-(void)_sentMessage:(SEL)selector withArguments:(NSArray *)arguments {\n\n}\n\n// abstract method\n-(void)_methodInvoked:(SEL)selector withArguments:(NSArray *)arguments {\n\n}\n\n-(void)dealloc {\n}\n\n@end\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Runtime/_RXKVOObserver.m",
    "content": "//\n//  _RXKVOObserver.m\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 7/11/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#import \"include/_RXKVOObserver.h\"\n\n@interface _RXKVOObserver ()\n\n@property (nonatomic, unsafe_unretained) id            target;\n@property (nonatomic, strong           ) id            retainedTarget;\n@property (nonatomic, copy             ) NSString     *keyPath;\n@property (nonatomic, copy             ) void (^callback)(id);\n\n@end\n\n@implementation _RXKVOObserver\n\n-(instancetype)initWithTarget:(id)target\n                 retainTarget:(BOOL)retainTarget\n                      keyPath:(NSString*)keyPath\n                      options:(NSKeyValueObservingOptions)options\n                     callback:(void (^)(id))callback {\n    self = [super init];\n    if (!self) return nil;\n    \n    self.target = target;\n    if (retainTarget) {\n        self.retainedTarget = target;\n    }\n    self.keyPath = keyPath;\n    self.callback = callback;\n    \n    [self.target addObserver:self forKeyPath:self.keyPath options:options context:nil];\n    \n    return self;\n}\n\n-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {\n    @synchronized(self) {\n        self.callback(change[NSKeyValueChangeNewKey]);\n    }\n}\n\n-(void)dispose {\n    [self.target removeObserver:self forKeyPath:self.keyPath context:nil];\n    self.target = nil;\n    self.retainedTarget = nil;\n}\n\n@end\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Runtime/_RXObjCRuntime.m",
    "content": "//\n//  _RXObjCRuntime.m\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 7/11/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#import <pthread.h>\n#import <Foundation/Foundation.h>\n#import <objc/runtime.h>\n#import <objc/message.h>\n#import <libkern/OSAtomic.h>\n\n#import \"include/_RX.h\"\n#import \"include/_RXObjCRuntime.h\"\n\n#if !DISABLE_SWIZZLING\n\n#define NSErrorParam NSError *__autoreleasing __nullable * __nullable\n\n// self + cmd\n#define HIDDEN_ARGUMENT_COUNT   2\n\n@class RXObjCRuntime;\n\nBOOL RXAbortOnThreadingHazard = NO;\n\ntypedef NSInvocation       *NSInvocationRef;\ntypedef NSMethodSignature  *NSMethodSignatureRef;\ntypedef unsigned char       rx_uchar;\ntypedef unsigned short      rx_ushort;\ntypedef unsigned int        rx_uint;\ntypedef unsigned long       rx_ulong;\ntypedef id (^rx_block)(id);\ntypedef BOOL (^RXInterceptWithOptimizedObserver)(RXObjCRuntime * __nonnull self, Class __nonnull class, SEL __nonnull selector, NSErrorParam error);\n\nstatic CFTypeID  defaultTypeID;\nstatic SEL       deallocSelector;\n\nstatic int RxSwizzlingTargetClassKey = 0;\n\n#if TRACE_RESOURCES\nstatic int32_t numberOInterceptedMethods = 0;\nstatic int32_t numberOfForwardedMethods = 0;\n#endif\n\n#define THREADING_HAZARD(class) \\\n    NSLog(@\"There was a problem swizzling on `%@`.\\nYou have probably two libraries performing swizzling in runtime.\\nWe didn't want to crash your program, but this is not good ...\\nYou an solve this problem by either not using swizzling in this library, removing one of those other libraries, or making sure that swizzling parts are synchronized (only perform them on main thread).\\nAnd yes, this message will self destruct when you clear the console, and since it's non deterministic, the problem could still exist and it will be hard for you to reproduce it.\", NSStringFromClass(class)); ABORT_IN_DEBUG if (RXAbortOnThreadingHazard) { abort(); }\n\n#define ALWAYS(condition, message) if (!(condition)) { [NSException raise:@\"RX Invalid Operator\" format:@\"%@\", message]; }\n#define ALWAYS_WITH_INFO(condition, message) NSAssert((condition), @\"%@ [%@] > %@\", NSStringFromClass(class), NSStringFromSelector(selector), (message))\n#define C_ALWAYS(condition, message) NSCAssert((condition), @\"%@ [%@] > %@\", NSStringFromClass(class), NSStringFromSelector(selector), (message))\n\n#define RX_PREFIX @\"_RX_namespace_\"\n\n#define RX_ARG_id(value)           ((value) ?: [NSNull null])\n#define RX_ARG_char(value)         [NSNumber numberWithChar:value]\n#define RX_ARG_short(value)        [NSNumber numberWithShort:value]\n#define RX_ARG_int(value)          [NSNumber numberWithInt:value]\n#define RX_ARG_long(value)         [NSNumber numberWithLong:value]\n#define RX_ARG_BOOL(value)         [NSNumber numberWithBool:value]\n#define RX_ARG_SEL(value)          [NSNumber valueWithPointer:value]\n#define RX_ARG_rx_uchar(value)     [NSNumber numberWithUnsignedInt:value]\n#define RX_ARG_rx_ushort(value)    [NSNumber numberWithUnsignedInt:value]\n#define RX_ARG_rx_uint(value)      [NSNumber numberWithUnsignedInt:value]\n#define RX_ARG_rx_ulong(value)     [NSNumber numberWithUnsignedLong:value]\n#define RX_ARG_rx_block(value)     ((id)(value) ?: [NSNull null])\n#define RX_ARG_float(value)        [NSNumber numberWithFloat:value]\n#define RX_ARG_double(value)       [NSNumber numberWithDouble:value]\n\ntypedef struct supported_type {\n    const char *encoding;\n} supported_type_t;\n\nstatic supported_type_t supported_types[] = {\n    { .encoding = @encode(void)},\n    { .encoding = @encode(id)},\n    { .encoding = @encode(Class)},\n    { .encoding = @encode(void (^)(void))},\n    { .encoding = @encode(char)},\n    { .encoding = @encode(short)},\n    { .encoding = @encode(int)},\n    { .encoding = @encode(long)},\n    { .encoding = @encode(long long)},\n    { .encoding = @encode(unsigned char)},\n    { .encoding = @encode(unsigned short)},\n    { .encoding = @encode(unsigned int)},\n    { .encoding = @encode(unsigned long)},\n    { .encoding = @encode(unsigned long long)},\n    { .encoding = @encode(float)},\n    { .encoding = @encode(double)},\n    { .encoding = @encode(BOOL)},\n    { .encoding = @encode(const char*)},\n};\n\nNSString * __nonnull const RXObjCRuntimeErrorDomain   = @\"RXObjCRuntimeErrorDomain\";\nNSString * __nonnull const RXObjCRuntimeErrorIsKVOKey = @\"RXObjCRuntimeErrorIsKVOKey\";\n\nBOOL RX_return_type_is_supported(const char *type) {\n    if (type == nil) {\n        return NO;\n    }\n\n    for (int i = 0; i < sizeof(supported_types) / sizeof(supported_type_t); ++i) {\n        if (supported_types[i].encoding[0] != type[0]) {\n            continue;\n        }\n        if (strcmp(supported_types[i].encoding, type) == 0) {\n            return YES;\n        }\n    }\n\n    return NO;\n}\n\nstatic BOOL RX_method_has_supported_return_type(Method method) {\n    const char *rawEncoding = method_getTypeEncoding(method);\n    ALWAYS(rawEncoding != nil, @\"Example encoding method is nil.\");\n\n    NSMethodSignature *methodSignature = [NSMethodSignature signatureWithObjCTypes:rawEncoding];\n    ALWAYS(methodSignature != nil, @\"Method signature method is nil.\");\n\n    return RX_return_type_is_supported(methodSignature.methodReturnType);\n}\n\nSEL __nonnull RX_selector(SEL __nonnull selector) {\n    NSString *selectorString = NSStringFromSelector(selector);\n    return NSSelectorFromString([RX_PREFIX stringByAppendingString:selectorString]);\n}\n\nBOOL RX_is_method_signature_void(NSMethodSignature * __nonnull methodSignature) {\n    const char *methodReturnType = methodSignature.methodReturnType;\n    return strcmp(methodReturnType, @encode(void)) == 0;\n}\n\nBOOL RX_is_method_with_description_void(struct objc_method_description method) {\n    return strncmp(method.types, @encode(void), 1) == 0;\n}\n\nid __nonnull RX_extract_argument_at_index(NSInvocation * __nonnull invocation, NSUInteger index) {\n    const char *argumentType = [invocation.methodSignature getArgumentTypeAtIndex:index];\n    \n#define RETURN_VALUE(type) \\\n    else if (strcmp(argumentType, @encode(type)) == 0) {\\\n        type val = 0; \\\n        [invocation getArgument:&val atIndex:index]; \\\n        return @(val); \\\n    }\n\n    // Skip const type qualifier.\n    if (argumentType[0] == 'r') {\n        argumentType++;\n    }\n    \n    if (strcmp(argumentType, @encode(id)) == 0\n        || strcmp(argumentType, @encode(Class)) == 0\n        || strcmp(argumentType, @encode(void (^)(void))) == 0\n    ) {\n        __unsafe_unretained id argument = nil;\n        [invocation getArgument:&argument atIndex:index];\n        return argument;\n    }\n    RETURN_VALUE(char)\n    RETURN_VALUE(short)\n    RETURN_VALUE(int)\n    RETURN_VALUE(long)\n    RETURN_VALUE(long long)\n    RETURN_VALUE(unsigned char)\n    RETURN_VALUE(unsigned short)\n    RETURN_VALUE(unsigned int)\n    RETURN_VALUE(unsigned long)\n    RETURN_VALUE(unsigned long long)\n    RETURN_VALUE(float)\n    RETURN_VALUE(double)\n    RETURN_VALUE(BOOL)\n    RETURN_VALUE(const char *)\n    else {\n        NSUInteger size = 0;\n        NSGetSizeAndAlignment(argumentType, &size, NULL);\n        NSCParameterAssert(size > 0);\n        uint8_t data[size];\n        [invocation getArgument:&data atIndex:index];\n        \n        return [NSValue valueWithBytes:&data objCType:argumentType];\n    }\n}\n\nNSArray *RX_extract_arguments(NSInvocation *invocation) {\n    NSUInteger numberOfArguments = invocation.methodSignature.numberOfArguments;\n    NSUInteger numberOfVisibleArguments = numberOfArguments - HIDDEN_ARGUMENT_COUNT;\n    \n    NSCParameterAssert(numberOfVisibleArguments >= 0);\n    \n    NSMutableArray *arguments = [NSMutableArray arrayWithCapacity:numberOfVisibleArguments];\n    \n    for (NSUInteger index = HIDDEN_ARGUMENT_COUNT; index < numberOfArguments; ++index) {\n        [arguments addObject:RX_extract_argument_at_index(invocation, index) ?: [NSNull null]];\n    }\n    \n    return arguments;\n}\n\nvoid * __nonnull RX_reference_from_selector(SEL __nonnull selector) {\n    return selector;\n}\n\nstatic BOOL RX_forward_invocation(id __nonnull __unsafe_unretained self, NSInvocation *invocation) {\n    SEL originalSelector = RX_selector(invocation.selector);\n\n    id<RXMessageSentObserver> messageSentObserver = objc_getAssociatedObject(self, originalSelector);\n\n    if (messageSentObserver != nil) {\n        NSArray *arguments = RX_extract_arguments(invocation);\n        [messageSentObserver messageSentWithArguments:arguments];\n    }\n\n    if ([self respondsToSelector:originalSelector]) {\n        invocation.selector = originalSelector;\n        [invocation invokeWithTarget:self];\n\n        if (messageSentObserver != nil) {\n            NSArray *arguments = RX_extract_arguments(invocation);\n            [messageSentObserver methodInvokedWithArguments:arguments];\n        }\n\n        return YES;\n    }\n\n    return NO;\n}\n\nstatic BOOL RX_responds_to_selector(id __nonnull __unsafe_unretained self, SEL selector) {\n    Class class = object_getClass(self);\n    if (class == nil) { return NO; }\n\n    Method m = class_getInstanceMethod(class, selector);\n    return m != nil;\n\n}\n\nstatic NSMethodSignatureRef RX_method_signature(id __nonnull __unsafe_unretained self, SEL selector) {\n    Class class = object_getClass(self);\n    if (class == nil) { return nil; }\n\n    Method method = class_getInstanceMethod(class, selector);\n    if (method == nil) { return nil; }\n\n    const char *encoding = method_getTypeEncoding(method);\n    if (encoding == nil) { return nil; }\n\n    return [NSMethodSignature signatureWithObjCTypes:encoding];\n}\n\nstatic NSString * __nonnull RX_method_encoding(Method __nonnull method) {\n    const char *typeEncoding = method_getTypeEncoding(method);\n    ALWAYS(typeEncoding != nil, @\"Method encoding is nil.\");\n\n    NSString *encoding = [NSString stringWithCString:typeEncoding encoding:NSASCIIStringEncoding];\n    ALWAYS(encoding != nil, @\"Can't convert encoding to NSString.\");\n    return encoding;\n}\n\n@interface RXObjCRuntime: NSObject\n\n@property (nonatomic, assign) pthread_mutex_t lock;\n\n@property (nonatomic, strong) NSMutableSet<NSValue *> *classesThatSupportObservingByForwarding;\n@property (nonatomic, strong) NSMutableDictionary<NSValue *, NSMutableSet<NSValue*> *> *forwardedSelectorsByClass;\n\n@property (nonatomic, strong) NSMutableDictionary<NSValue *, Class> *dynamicSubclassByRealClass;\n@property (nonatomic, strong) NSMutableDictionary<NSValue *, NSMutableDictionary<NSValue*, NSValue *>*> *interceptorIMPbySelectorsByClass;\n\n+(RXObjCRuntime*)instance;\n\n-(void)performLocked:(void (^)(RXObjCRuntime* __nonnull))action;\n-(IMP __nullable)ensurePrepared:(id __nonnull)target forObserving:(SEL __nonnull)selector error:(NSErrorParam)error;\n-(BOOL)ensureSwizzledSelector:(SEL __nonnull)selector\n                      ofClass:(Class __nonnull)class\n   newImplementationGenerator:(IMP(^)(void))newImplementationGenerator\nreplacementImplementationGenerator:(IMP (^)(IMP originalImplementation))replacementImplementationGenerator\n                        error:(NSErrorParam)error;\n\n\n+(void)registerOptimizedObserver:(RXInterceptWithOptimizedObserver)registration encodedAs:(SEL)selector;\n\n@end\n\n/**\n All API methods perform work on locked instance of `RXObjCRuntime`. In that way it's easy to prove\n that every action is properly locked.\n */\nIMP __nullable RX_ensure_observing(id __nonnull target, SEL __nonnull selector, NSErrorParam error) {\n    __block IMP targetImplementation = nil;\n    // Target is the second object that needs to be synchronized to TRY to make sure other swizzling framework\n    // won't do something in parallel.\n    // Even though this is too fine grained locking and more coarse grained locks should exist, this is just in case\n    // someone calls this method directly without any external lock.\n    @synchronized(target) {\n        // The only other resource that all other swizzling libraries have in common without introducing external\n        // dependencies is class object.\n        //\n        // It is polite to try to synchronize it in hope other unknown entities will also attempt to do so.\n        // It's like trying to figure out how to communicate with aliens without actually communicating,\n        // save for the fact that aliens are people, programmers, authors of swizzling libraries.\n        @synchronized([target class]) {\n            [[RXObjCRuntime instance] performLocked:^(RXObjCRuntime * __nonnull self) {\n                targetImplementation = [self ensurePrepared:target\n                                               forObserving:selector\n                                                      error:error];\n            }];\n        }\n    }\n\n    return targetImplementation;\n}\n\nIMP __nonnull RX_default_target_implementation(void) {\n    return _objc_msgForward;\n}\n\n// bodies\n\n#define FORWARD_BODY(invocation)                        if (RX_forward_invocation(self, NAME_CAT(_, 0, invocation))) { return; }\n\n#define RESPONDS_TO_SELECTOR_BODY(selector)             if (RX_responds_to_selector(self, NAME_CAT(_, 0, selector))) return YES;\n\n#define CLASS_BODY(...)                                 return actAsClass;\n\n#define METHOD_SIGNATURE_FOR_SELECTOR_BODY(selector)                                            \\\n    NSMethodSignatureRef methodSignature = RX_method_signature(self, NAME_CAT(_, 0, selector)); \\\n    if (methodSignature != nil) {                                                               \\\n        return methodSignature;                                                                 \\\n    }\n\n#define DEALLOCATING_BODY(...)                                                        \\\n    id<RXDeallocatingObserver> observer = objc_getAssociatedObject(self, rxSelector); \\\n    if (observer != nil && observer.targetImplementation == thisIMP) {                \\\n        [observer deallocating];                                                      \\\n    }\n\n#define OBSERVE_BODY(...)                                                              \\\n    id<RXMessageSentObserver> observer = objc_getAssociatedObject(self, rxSelector);   \\\n                                                                                       \\\n    if (observer != nil && observer.targetImplementation == thisIMP) {                 \\\n        [observer messageSentWithArguments:@[COMMA_DELIMITED_ARGUMENTS(__VA_ARGS__)]]; \\\n    }                                                                                  \\\n\n\n#define OBSERVE_INVOKED_BODY(...)                                                        \\\n    if (observer != nil && observer.targetImplementation == thisIMP) {                   \\\n        [observer methodInvokedWithArguments:@[COMMA_DELIMITED_ARGUMENTS(__VA_ARGS__)]]; \\\n    }                                                                                    \\\n\n\n#define BUILD_ARG_WRAPPER(type)                   RX_ARG_ ## type                                                     //RX_ARG_ ## type\n\n#define CAT(_1, _2, head, tail)                   RX_CAT2(head, tail)\n#define SEPARATE_BY_COMMA(_1, _2, head, tail)     head, tail\n#define SEPARATE_BY_SPACE(_1, _2, head, tail)     head tail\n#define SEPARATE_BY_UNDERSCORE(head, tail)        RX_CAT2(RX_CAT2(head, _), tail)\n\n#define UNDERSCORE_TYPE_CAT(_1, index, type)      RX_CAT2(_, type)                                                    // generates -> _type\n#define NAME_CAT(_1, index, type)                 SEPARATE_BY_UNDERSCORE(type, index)                                 // generates -> type_0\n#define TYPE_AND_NAME_CAT(_1, index, type)        type SEPARATE_BY_UNDERSCORE(type, index)                            // generates -> type type_0\n#define NOT_NULL_ARGUMENT_CAT(_1, index, type)    BUILD_ARG_WRAPPER(type)(NAME_CAT(_1, index, type))                  // generates -> ((id)(type_0) ?: [NSNull null])\n#define EXAMPLE_PARAMETER(_1, index, type)        RX_CAT2(_, type):(type)SEPARATE_BY_UNDERSCORE(type, index)          // generates -> _type:(type)type_0\n#define SELECTOR_PART(_1, index, type)            RX_CAT2(_, type:)                                                   // generates -> _type:\n\n#define COMMA_DELIMITED_ARGUMENTS(...)            RX_FOREACH(_, SEPARATE_BY_COMMA, NOT_NULL_ARGUMENT_CAT, ## __VA_ARGS__)\n#define ARGUMENTS(...)                            RX_FOREACH_COMMA(_, NAME_CAT, ## __VA_ARGS__)\n#define DECLARE_ARGUMENTS(...)                    RX_FOREACH_COMMA(_, TYPE_AND_NAME_CAT, ## __VA_ARGS__)\n\n// optimized observe methods\n\n#define GENERATE_METHOD_IDENTIFIER(...)          RX_CAT2(swizzle, RX_FOREACH(_, CAT, UNDERSCORE_TYPE_CAT, ## __VA_ARGS__))\n\n#define GENERATE_OBSERVE_METHOD_DECLARATION(...)                                 \\\n    -(BOOL)GENERATE_METHOD_IDENTIFIER(__VA_ARGS__):(Class __nonnull)class        \\\n                                          selector:(SEL)selector                 \\\n                                             error:(NSErrorParam)error {         \\\n\n\n#define BUILD_EXAMPLE_METHOD(return_value, ...) \\\n    +(return_value)RX_CAT2(RX_CAT2(example_, return_value), RX_FOREACH(_, SEPARATE_BY_SPACE, EXAMPLE_PARAMETER, ## __VA_ARGS__)) {}\n\n#define BUILD_EXAMPLE_METHOD_SELECTOR(return_value, ...) \\\n    RX_CAT2(RX_CAT2(example_, return_value), RX_FOREACH(_, SEPARATE_BY_SPACE, SELECTOR_PART, ## __VA_ARGS__))\n\n#define SWIZZLE_OBSERVE_METHOD(return_value, ...)                                                                                                       \\\n    @interface RXObjCRuntime (GENERATE_METHOD_IDENTIFIER(return_value, ## __VA_ARGS__))                                                                 \\\n    @end                                                                                                                                                \\\n                                                                                                                                                        \\\n    @implementation RXObjCRuntime(GENERATE_METHOD_IDENTIFIER(return_value, ## __VA_ARGS__))                                                             \\\n    BUILD_EXAMPLE_METHOD(return_value, ## __VA_ARGS__)                                                                                                  \\\n    SWIZZLE_METHOD(return_value, GENERATE_OBSERVE_METHOD_DECLARATION(return_value, ## __VA_ARGS__), OBSERVE_BODY, OBSERVE_INVOKED_BODY, ## __VA_ARGS__) \\\n                                                                                                                                                        \\\n    +(void)load {                                                                                                                                       \\\n       __unused SEL exampleSelector = @selector(BUILD_EXAMPLE_METHOD_SELECTOR(return_value, ## __VA_ARGS__));                                           \\\n       [self registerOptimizedObserver:^BOOL(RXObjCRuntime * __nonnull self, Class __nonnull class,                                                     \\\n            SEL __nonnull selector, NSErrorParam error) {                                                                                               \\\n            return [self GENERATE_METHOD_IDENTIFIER(return_value, ## __VA_ARGS__):class selector:selector error:error];                                 \\\n       } encodedAs:exampleSelector];                                                                                                                    \\\n    }                                                                                                                                                   \\\n                                                                                                                                                        \\\n    @end                                                                                                                                                \\\n\n// infrastructure method\n\n#define NO_BODY(...)\n\n#define SWIZZLE_INFRASTRUCTURE_METHOD(return_value, method_name, parameters, method_selector, body, ...)               \\\n    SWIZZLE_METHOD(return_value, -(BOOL)method_name:(Class __nonnull)class parameters error:(NSErrorParam)error        \\\n        {                                                                                                              \\\n            SEL selector = method_selector; , body, NO_BODY, __VA_ARGS__)                                              \\\n\n\n// common base\n\n#define SWIZZLE_METHOD(return_value, method_prototype, body, invoked_body, ...)                                          \\\nmethod_prototype                                                                                                         \\\n    __unused SEL rxSelector = RX_selector(selector);                                                                     \\\n    IMP (^newImplementationGenerator)(void) = ^() {                                                                          \\\n        __block IMP thisIMP = nil;                                                                                       \\\n        id newImplementation = ^return_value(__unsafe_unretained id self DECLARE_ARGUMENTS(__VA_ARGS__)) {               \\\n            body(__VA_ARGS__)                                                                                            \\\n                                                                                                                         \\\n            struct objc_super superInfo = {                                                                              \\\n                .receiver = self,                                                                                        \\\n                .super_class = class_getSuperclass(class)                                                                \\\n            };                                                                                                           \\\n                                                                                                                         \\\n            return_value (*msgSend)(struct objc_super *, SEL DECLARE_ARGUMENTS(__VA_ARGS__))                             \\\n                = (__typeof__(msgSend))objc_msgSendSuper;                                                                \\\n            @try {                                                                                                       \\\n              return msgSend(&superInfo, selector ARGUMENTS(__VA_ARGS__));                                               \\\n            }                                                                                                            \\\n            @finally { invoked_body(__VA_ARGS__) }                                                                       \\\n        };                                                                                                               \\\n                                                                                                                         \\\n        thisIMP = imp_implementationWithBlock(newImplementation);                                                        \\\n        return thisIMP;                                                                                                  \\\n    };                                                                                                                   \\\n                                                                                                                         \\\n    IMP (^replacementImplementationGenerator)(IMP) = ^(IMP originalImplementation) {                                     \\\n        __block return_value (*originalImplementationTyped)(__unsafe_unretained id, SEL DECLARE_ARGUMENTS(__VA_ARGS__) ) \\\n            = (__typeof__(originalImplementationTyped))(originalImplementation);                                         \\\n                                                                                                                         \\\n        __block IMP thisIMP = nil;                                                                                       \\\n        id implementationReplacement = ^return_value(__unsafe_unretained id self DECLARE_ARGUMENTS(__VA_ARGS__) ) {      \\\n            body(__VA_ARGS__)                                                                                            \\\n            @try {                                                                                                       \\\n                return originalImplementationTyped(self, selector ARGUMENTS(__VA_ARGS__));                               \\\n            }                                                                                                            \\\n            @finally { invoked_body(__VA_ARGS__) }                                                                       \\\n        };                                                                                                               \\\n                                                                                                                         \\\n        thisIMP = imp_implementationWithBlock(implementationReplacement);                                                \\\n        return thisIMP;                                                                                                  \\\n    };                                                                                                                   \\\n                                                                                                                         \\\n    return [self ensureSwizzledSelector:selector                                                                         \\\n                                ofClass:class                                                                            \\\n             newImplementationGenerator:newImplementationGenerator                                                       \\\n     replacementImplementationGenerator:replacementImplementationGenerator                                               \\\n                                  error:error];                                                                          \\\n }                                                                                                                       \\\n\n\n@interface RXObjCRuntime (InfrastructureMethods)\n@end\n\n// MARK: Infrastructure Methods\n\n@implementation RXObjCRuntime (InfrastructureMethods)\n\nSWIZZLE_INFRASTRUCTURE_METHOD(\n    void,\n    swizzleForwardInvocation,\n    ,\n    @selector(forwardInvocation:),\n    FORWARD_BODY,\n    NSInvocationRef\n)\nSWIZZLE_INFRASTRUCTURE_METHOD(\n    BOOL,\n    swizzleRespondsToSelector,\n    ,\n    @selector(respondsToSelector:),\n    RESPONDS_TO_SELECTOR_BODY,\n    SEL\n)\nSWIZZLE_INFRASTRUCTURE_METHOD(\n    Class __nonnull,\n    swizzleClass,\n    toActAs:(Class)actAsClass,\n    @selector(class),\n    CLASS_BODY\n)\nSWIZZLE_INFRASTRUCTURE_METHOD(\n    NSMethodSignatureRef,\n    swizzleMethodSignatureForSelector,\n    ,\n    @selector(methodSignatureForSelector:),\n    METHOD_SIGNATURE_FOR_SELECTOR_BODY,\n    SEL\n)\nSWIZZLE_INFRASTRUCTURE_METHOD(\n    void,\n    swizzleDeallocating,\n    ,\n    deallocSelector,\n    DEALLOCATING_BODY\n)\n\n@end\n\n// MARK: Optimized intercepting methods for specific combination of parameter types\n\nSWIZZLE_OBSERVE_METHOD(void)\n\nSWIZZLE_OBSERVE_METHOD(void, id)\nSWIZZLE_OBSERVE_METHOD(void, char)\nSWIZZLE_OBSERVE_METHOD(void, short)\nSWIZZLE_OBSERVE_METHOD(void, int)\nSWIZZLE_OBSERVE_METHOD(void, long)\nSWIZZLE_OBSERVE_METHOD(void, rx_uchar)\nSWIZZLE_OBSERVE_METHOD(void, rx_ushort)\nSWIZZLE_OBSERVE_METHOD(void, rx_uint)\nSWIZZLE_OBSERVE_METHOD(void, rx_ulong)\nSWIZZLE_OBSERVE_METHOD(void, rx_block)\nSWIZZLE_OBSERVE_METHOD(void, float)\nSWIZZLE_OBSERVE_METHOD(void, double)\nSWIZZLE_OBSERVE_METHOD(void, SEL)\n\nSWIZZLE_OBSERVE_METHOD(void, id, id)\nSWIZZLE_OBSERVE_METHOD(void, id, char)\nSWIZZLE_OBSERVE_METHOD(void, id, short)\nSWIZZLE_OBSERVE_METHOD(void, id, int)\nSWIZZLE_OBSERVE_METHOD(void, id, long)\nSWIZZLE_OBSERVE_METHOD(void, id, rx_uchar)\nSWIZZLE_OBSERVE_METHOD(void, id, rx_ushort)\nSWIZZLE_OBSERVE_METHOD(void, id, rx_uint)\nSWIZZLE_OBSERVE_METHOD(void, id, rx_ulong)\nSWIZZLE_OBSERVE_METHOD(void, id, rx_block)\nSWIZZLE_OBSERVE_METHOD(void, id, float)\nSWIZZLE_OBSERVE_METHOD(void, id, double)\nSWIZZLE_OBSERVE_METHOD(void, id, SEL)\n\n// MARK: RXObjCRuntime\n\n@implementation RXObjCRuntime\n\nstatic RXObjCRuntime *_instance = nil;\nstatic NSMutableDictionary<NSString *, RXInterceptWithOptimizedObserver> *optimizedObserversByMethodEncoding = nil;\n\n+(RXObjCRuntime*)instance {\n    return _instance;\n}\n\n+(void)initialize {\n    _instance = [[RXObjCRuntime alloc] init];\n    defaultTypeID = CFGetTypeID((CFTypeRef)RXObjCRuntime.class); // just need a reference of some object not from CF\n    deallocSelector = NSSelectorFromString(@\"dealloc\");\n    NSAssert(_instance != nil, @\"Failed to initialize swizzling\");\n}\n\n-(instancetype)init {\n    self = [super init];\n    if (!self) return nil;\n\n    self.classesThatSupportObservingByForwarding = [NSMutableSet set];\n    self.forwardedSelectorsByClass = [NSMutableDictionary dictionary];\n\n    self.dynamicSubclassByRealClass = [NSMutableDictionary dictionary];\n    self.interceptorIMPbySelectorsByClass = [NSMutableDictionary dictionary];\n\n    pthread_mutexattr_t lock_attr;\n    pthread_mutexattr_init(&lock_attr);\n    pthread_mutexattr_settype(&lock_attr, PTHREAD_MUTEX_RECURSIVE);\n    pthread_mutex_init(&_lock, &lock_attr);\n    pthread_mutexattr_destroy(&lock_attr);\n    \n    return self;\n}\n\n-(void)performLocked:(void (^)(RXObjCRuntime* __nonnull))action {\n    pthread_mutex_lock(&_lock);\n    action(self);\n    pthread_mutex_unlock(&_lock);\n}\n\n+(void)registerOptimizedObserver:(RXInterceptWithOptimizedObserver)registration encodedAs:(SEL)selector {\n    Method exampleEncodingMethod = class_getClassMethod(self, selector);\n    ALWAYS(exampleEncodingMethod != nil, @\"Example encoding method is nil.\");\n\n    NSString *methodEncoding = RX_method_encoding(exampleEncodingMethod);\n\n    if (optimizedObserversByMethodEncoding == nil) {\n        optimizedObserversByMethodEncoding = [NSMutableDictionary dictionary];\n    }\n\n    DLOG(@\"Added optimized method: %@ (%@)\", methodEncoding, NSStringFromSelector(selector));\n    ALWAYS(optimizedObserversByMethodEncoding[methodEncoding] == nil, @\"Optimized observer already registered\")\n    optimizedObserversByMethodEncoding[methodEncoding] = registration;\n}\n\n/**\n This is the main entry point for observing messages sent to arbitrary objects.\n */\n-(IMP __nullable)ensurePrepared:(id __nonnull)target forObserving:(SEL __nonnull)selector error:(NSErrorParam)error {\n    Method instanceMethod = class_getInstanceMethod([target class], selector);\n    if (instanceMethod == nil) {\n        RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain\n                                           code:RXObjCRuntimeErrorSelectorNotImplemented\n                                       userInfo:nil], nil);\n    }\n\n    if (selector == @selector(class)\n    ||  selector == @selector(forwardingTargetForSelector:)\n    ||  selector == @selector(methodSignatureForSelector:)\n    ||  selector == @selector(respondsToSelector:)) {\n        RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain\n                                           code:RXObjCRuntimeErrorObservingPerformanceSensitiveMessages\n                                       userInfo:nil], nil);\n    }\n\n    // For `dealloc` message, original implementation will be swizzled.\n    // This is a special case because observing `dealloc` message is performed when `observeWeakly` is used.\n    //\n    // Some toll free bridged classes don't handle `object_setClass` well and cause crashes.\n    //\n    // To make `deallocating` as robust as possible, original implementation will be replaced.\n    if (selector == deallocSelector) {\n        Class __nonnull deallocSwizzingTarget = [target class];\n        IMP interceptorIMPForSelector = [self interceptorImplementationForSelector:selector forClass:deallocSwizzingTarget];\n        if (interceptorIMPForSelector != nil) {\n            return interceptorIMPForSelector;\n        }\n\n        if (![self swizzleDeallocating:deallocSwizzingTarget error:error]) {\n            return nil;\n        }\n\n        interceptorIMPForSelector = [self interceptorImplementationForSelector:selector forClass:deallocSwizzingTarget];\n        if (interceptorIMPForSelector != nil) {\n            return interceptorIMPForSelector;\n        }\n    }\n    else {\n        Class __nullable swizzlingImplementorClass = [self prepareTargetClassForObserving:target error:error];\n        if (swizzlingImplementorClass == nil) {\n            return nil;\n        }\n\n        NSString *methodEncoding = RX_method_encoding(instanceMethod);\n        RXInterceptWithOptimizedObserver optimizedIntercept = optimizedObserversByMethodEncoding[methodEncoding];\n\n        if (!RX_method_has_supported_return_type(instanceMethod)) {\n            RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain\n                                               code:RXObjCRuntimeErrorObservingMessagesWithUnsupportedReturnType\n                                           userInfo:nil], nil);\n        }\n\n        // optimized interception method\n        if (optimizedIntercept != nil) {\n            IMP interceptorIMPForSelector = [self interceptorImplementationForSelector:selector forClass:swizzlingImplementorClass];\n            if (interceptorIMPForSelector != nil) {\n                return interceptorIMPForSelector;\n            }\n\n            if (!optimizedIntercept(self, swizzlingImplementorClass, selector, error)) {\n                return nil;\n            }\n\n            interceptorIMPForSelector = [self interceptorImplementationForSelector:selector forClass:swizzlingImplementorClass];\n            if (interceptorIMPForSelector != nil) {\n                return interceptorIMPForSelector;\n            }\n        }\n        // default fallback to observing by forwarding messages\n        else {\n            if ([self forwardingSelector:selector forClass:swizzlingImplementorClass]) {\n                return RX_default_target_implementation();\n            }\n\n            if (![self observeByForwardingMessages:swizzlingImplementorClass\n                                          selector:selector\n                                            target:target\n                                             error:error]) {\n                return nil;\n            }\n\n            if ([self forwardingSelector:selector forClass:swizzlingImplementorClass]) {\n                return RX_default_target_implementation();\n            }\n        }\n    }\n\n    RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain\n                                       code:RXObjCRuntimeErrorUnknown\n                                   userInfo:nil], nil);\n}\n\n-(Class __nullable)prepareTargetClassForObserving:(id __nonnull)target error:(NSErrorParam)error {\n    Class swizzlingClass = objc_getAssociatedObject(target, &RxSwizzlingTargetClassKey);\n    if (swizzlingClass != nil) {\n        return swizzlingClass;\n    }\n\n    Class __nonnull wannaBeClass = [target class];\n    /**\n     Core Foundation classes are usually toll free bridged. Those classes crash the program in case\n     `object_setClass` is performed on them.\n\n     There is a possibility to just swizzle methods on original object, but since those won't be usual use\n     cases for this library, then an error will just be reported for now.\n     */\n    BOOL isThisTollFreeFoundationClass = CFGetTypeID((CFTypeRef)target) != defaultTypeID;\n\n    if (isThisTollFreeFoundationClass) {\n        RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain\n                                           code:RXObjCRuntimeErrorCantInterceptCoreFoundationTollFreeBridgedObjects\n                                       userInfo:nil], nil);\n    }\n\n    /**\n     If the object is reporting a different class then what it's real class, that means that there is probably\n     already some interception mechanism in place or something weird is happening.\n     \n     Most common case when this would happen is when using KVO (`observe`) and `sentMessage`.\n\n     This error is easily resolved by just using `sentMessage` observing before `observe`.\n     \n     The reason why other way around could create issues is because KVO will unregister it's interceptor \n     class and restore original class. Unfortunately that will happen no matter was there another interceptor\n     subclass registered in hierarchy or not.\n     \n     Failure scenario:\n     * KVO sets class to be `__KVO__OriginalClass` (subclass of `OriginalClass`)\n     * `sentMessage` sets object class to be `_RX_namespace___KVO__OriginalClass` (subclass of `__KVO__OriginalClass`)\n     * then unobserving with KVO will restore class to be `OriginalClass` -> failure point\n\n     The reason why changing order of observing works is because any interception method should return\n     object's original real class (if that doesn't happen then it's really easy to argue that's a bug\n     in that other library).\n     \n     This library won't remove registered interceptor even if there aren't any observers left because\n     it's highly unlikely it would have any benefit in real world use cases, and it's even more\n     dangerous.\n     */\n    if ([target class] != object_getClass(target)) {\n        BOOL isKVO = [target respondsToSelector:NSSelectorFromString(@\"_isKVOA\")];\n\n        RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain\n                                           code:RXObjCRuntimeErrorObjectMessagesAlreadyBeingIntercepted\n                                       userInfo:@{\n                                                  RXObjCRuntimeErrorIsKVOKey : @(isKVO)\n                                                  }], nil);\n    }\n\n    Class __nullable dynamicFakeSubclass = [self ensureHasDynamicFakeSubclass:wannaBeClass error:error];\n\n    if (dynamicFakeSubclass == nil) {\n        return nil;\n    }\n\n    Class previousClass = object_setClass(target, dynamicFakeSubclass);\n    if (previousClass != wannaBeClass) {\n        THREADING_HAZARD(wannaBeClass);\n        RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain\n                                           code:RXObjCRuntimeErrorThreadingCollisionWithOtherInterceptionMechanism\n                                       userInfo:nil], nil);\n    }\n\n    objc_setAssociatedObject(target, &RxSwizzlingTargetClassKey, dynamicFakeSubclass, OBJC_ASSOCIATION_RETAIN_NONATOMIC);\n    return dynamicFakeSubclass;\n}\n\n\n-(BOOL)forwardingSelector:(SEL)selector forClass:(Class __nonnull)class {\n    return [self.forwardedSelectorsByClass[CLASS_VALUE(class)] containsObject:SEL_VALUE(selector)];\n}\n\n-(void)registerForwardedSelector:(SEL)selector forClass:(Class __nonnull)class {\n    NSValue *classValue = CLASS_VALUE(class);\n\n    NSMutableSet<NSValue *> *forwardedSelectors = self.forwardedSelectorsByClass[classValue];\n\n    if (forwardedSelectors == nil) {\n        forwardedSelectors = [NSMutableSet set];\n        self.forwardedSelectorsByClass[classValue] = forwardedSelectors;\n    }\n\n    [forwardedSelectors addObject:SEL_VALUE(selector)];\n}\n\n-(BOOL)observeByForwardingMessages:(Class __nonnull)swizzlingImplementorClass\n                          selector:(SEL)selector\n                            target:(id __nonnull)target\n                             error:(NSErrorParam)error {\n    if (![self ensureForwardingMethodsAreSwizzled:swizzlingImplementorClass error:error]) {\n        return NO;\n    }\n\n    ALWAYS(![self forwardingSelector:selector forClass:swizzlingImplementorClass], @\"Already observing selector for class\");\n\n#if TRACE_RESOURCES\n    OSAtomicIncrement32Barrier(&numberOfForwardedMethods);\n#endif\n    SEL rxSelector = RX_selector(selector);\n\n    Method instanceMethod = class_getInstanceMethod(swizzlingImplementorClass, selector);\n    ALWAYS(instanceMethod != nil, @\"Instance method is nil\");\n\n    const char* methodEncoding = method_getTypeEncoding(instanceMethod);\n    ALWAYS(methodEncoding != nil, @\"Method encoding is nil.\");\n    NSMethodSignature *methodSignature = [NSMethodSignature signatureWithObjCTypes:methodEncoding];\n    ALWAYS(methodSignature != nil, @\"Method signature is invalid.\");\n\n    IMP implementation = method_getImplementation(instanceMethod);\n\n    if (implementation == nil) {\n        RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain\n                                           code:RXObjCRuntimeErrorSelectorNotImplemented\n                                       userInfo:nil], NO);\n    }\n\n    if (!class_addMethod(swizzlingImplementorClass, rxSelector, implementation, methodEncoding)) {\n        RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain\n                                           code:RXObjCRuntimeErrorSavingOriginalForwardingMethodFailed\n                                       userInfo:nil], NO);\n    }\n\n    if (!class_addMethod(swizzlingImplementorClass, selector, _objc_msgForward, methodEncoding)) {\n        if (implementation != method_setImplementation(instanceMethod, _objc_msgForward)) {\n            THREADING_HAZARD(swizzlingImplementorClass);\n            RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain\n                                               code:RXObjCRuntimeErrorReplacingMethodWithForwardingImplementation\n                                           userInfo:nil], NO);\n        }\n    }\n\n    DLOG(@\"Rx uses forwarding to observe `%@` for `%@`.\", NSStringFromSelector(selector), swizzlingImplementorClass);\n    [self registerForwardedSelector:selector forClass:swizzlingImplementorClass];\n\n    return YES;\n}\n\n/**\n If object don't have some weird behavior, claims it's the same class that runtime shows,\n then dynamic subclass is created (only this instance will have performance hit).\n \n In case something weird is detected, then original base class is being swizzled and all instances\n will have somewhat reduced performance.\n \n This is especially handy optimization for weak KVO. Nobody will swizzle for example `NSString`,\n but to know when instance of a `NSString` was deallocated, performance hit will be only felt on a \n single instance of `NSString`, not all instances of `NSString`s.\n */\n-(Class __nullable)ensureHasDynamicFakeSubclass:(Class __nonnull)class error:(NSErrorParam)error {\n    Class dynamicFakeSubclass = self.dynamicSubclassByRealClass[CLASS_VALUE(class)];\n    if (dynamicFakeSubclass != nil) {\n        return dynamicFakeSubclass;\n    }\n\n    NSString *dynamicFakeSubclassName = [RX_PREFIX stringByAppendingString:NSStringFromClass(class)];\n    const char *dynamicFakeSubclassNameRaw = dynamicFakeSubclassName.UTF8String;\n    dynamicFakeSubclass = objc_allocateClassPair(class, dynamicFakeSubclassNameRaw, 0);\n    ALWAYS(dynamicFakeSubclass != nil, @\"Class not generated\");\n\n    if (![self swizzleClass:dynamicFakeSubclass toActAs:class error:error]) {\n        return nil;\n    }\n\n    objc_registerClassPair(dynamicFakeSubclass);\n\n    [self.dynamicSubclassByRealClass setObject:dynamicFakeSubclass forKey:CLASS_VALUE(class)];\n    ALWAYS(self.dynamicSubclassByRealClass[CLASS_VALUE(class)] != nil, @\"Class not registered\");\n\n    return dynamicFakeSubclass;\n}\n\n-(BOOL)ensureForwardingMethodsAreSwizzled:(Class __nonnull)class error:(NSErrorParam)error {\n    NSValue *classValue = CLASS_VALUE(class);\n    if ([self.classesThatSupportObservingByForwarding containsObject:classValue]) {\n        return YES;\n    }\n\n    if (![self swizzleForwardInvocation:class error:error]) { return NO; }\n    if (![self swizzleMethodSignatureForSelector:class error:error]) { return NO; }\n    if (![self swizzleRespondsToSelector:class error:error]) { return NO; }\n\n    [self.classesThatSupportObservingByForwarding addObject:classValue];\n\n    return YES;\n}\n\n-(void)registerInterceptedSelector:(SEL)selector implementation:(IMP)implementation forClass:(Class)class {\n    NSValue * __nonnull classValue = CLASS_VALUE(class);\n    NSValue * __nonnull selectorValue = SEL_VALUE(selector);\n\n    NSMutableDictionary *swizzledIMPBySelectorsForClass = self.interceptorIMPbySelectorsByClass[classValue];\n\n    if (swizzledIMPBySelectorsForClass == nil) {\n        swizzledIMPBySelectorsForClass = [NSMutableDictionary dictionary];\n        self.interceptorIMPbySelectorsByClass[classValue] = swizzledIMPBySelectorsForClass;\n    }\n\n    swizzledIMPBySelectorsForClass[selectorValue] = IMP_VALUE(implementation);\n\n    ALWAYS([self interceptorImplementationForSelector:selector forClass:class] != nil, @\"Class should have been swizzled\");\n}\n\n-(IMP)interceptorImplementationForSelector:(SEL)selector forClass:(Class)class {\n    NSValue * __nonnull classValue = CLASS_VALUE(class);\n    NSValue * __nonnull selectorValue = SEL_VALUE(selector);\n\n    NSMutableDictionary *swizzledIMPBySelectorForClass = self.interceptorIMPbySelectorsByClass[classValue];\n\n    NSValue *impValue = swizzledIMPBySelectorForClass[selectorValue];\n    return impValue.pointerValue;\n}\n\n-(BOOL)ensureSwizzledSelector:(SEL __nonnull)selector\n                      ofClass:(Class __nonnull)class\n   newImplementationGenerator:(IMP(^)(void))newImplementationGenerator\nreplacementImplementationGenerator:(IMP (^)(IMP originalImplementation))replacementImplementationGenerator\n                        error:(NSErrorParam)error {\n    if ([self interceptorImplementationForSelector:selector forClass:class] != nil) {\n        DLOG(@\"Trying to register same intercept at least once, this sounds like a possible bug\");\n        return YES;\n    }\n\n#if TRACE_RESOURCES\n    OSAtomicIncrement32Barrier(&numberOInterceptedMethods);\n#endif\n    \n    DLOG(@\"Rx is swizzling `%@` for `%@`\", NSStringFromSelector(selector), class);\n\n    Method existingMethod = class_getInstanceMethod(class, selector);\n    ALWAYS(existingMethod != nil, @\"Method doesn't exist\");\n\n    const char *encoding = method_getTypeEncoding(existingMethod);\n    ALWAYS(encoding != nil, @\"Encoding is nil\");\n\n    IMP newImplementation = newImplementationGenerator();\n\n    if (class_addMethod(class, selector, newImplementation, encoding)) {\n        // new method added, job done\n        [self registerInterceptedSelector:selector implementation:newImplementation forClass:class];\n\n        return YES;\n    }\n\n    imp_removeBlock(newImplementation);\n\n    // if add fails, that means that method already exists on targetClass\n    Method existingMethodOnTargetClass = existingMethod;\n\n    IMP originalImplementation = method_getImplementation(existingMethodOnTargetClass);\n    ALWAYS(originalImplementation != nil, @\"Method must exist.\");\n    IMP implementationReplacementIMP = replacementImplementationGenerator(originalImplementation);\n    ALWAYS(implementationReplacementIMP != nil, @\"Method must exist.\");\n    IMP originalImplementationAfterChange = method_setImplementation(existingMethodOnTargetClass, implementationReplacementIMP);\n    ALWAYS(originalImplementation != nil, @\"Method must exist.\");\n\n    // If method replacing failed, who knows what happened, better not trying again, otherwise program can get\n    // corrupted.\n    [self registerInterceptedSelector:selector implementation:implementationReplacementIMP forClass:class];\n\n    // ¯\\_(ツ)_/¯\n    if (originalImplementationAfterChange != originalImplementation) {\n        THREADING_HAZARD(class);\n        return NO;\n    }\n\n    return YES;\n}\n\n@end\n\n#if TRACE_RESOURCES\n\nNSInteger RX_number_of_dynamic_subclasses() {\n    __block NSInteger count = 0;\n    [[RXObjCRuntime instance] performLocked:^(RXObjCRuntime * __nonnull self) {\n        count = self.dynamicSubclassByRealClass.count;\n    }];\n\n    return count;\n}\n\nNSInteger RX_number_of_forwarding_enabled_classes() {\n    __block NSInteger count = 0;\n    [[RXObjCRuntime instance] performLocked:^(RXObjCRuntime * __nonnull self) {\n        count = self.classesThatSupportObservingByForwarding.count;\n    }];\n\n    return count;\n}\n\nNSInteger RX_number_of_intercepting_classes() {\n    __block NSInteger count = 0;\n    [[RXObjCRuntime instance] performLocked:^(RXObjCRuntime * __nonnull self) {\n        count = self.interceptorIMPbySelectorsByClass.count;\n    }];\n\n    return count;\n}\n\nNSInteger RX_number_of_forwarded_methods() {\n    return numberOfForwardedMethods;\n}\n\nNSInteger RX_number_of_swizzled_methods() {\n    return numberOInterceptedMethods;\n}\n\n#endif\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Runtime/include/RxCocoaRuntime.h",
    "content": "//\n//  RxCocoaRuntime.h\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 2/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import \"_RX.h\"\n#import \"_RXDelegateProxy.h\"\n#import \"_RXKVOObserver.h\"\n#import \"_RXObjCRuntime.h\"\n\n//! Project version number for RxCocoa.\nFOUNDATION_EXPORT double RxCocoaVersionNumber;\n\n//! Project version string for RxCocoa.\nFOUNDATION_EXPORT const unsigned char RxCocoaVersionString[];\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Runtime/include/_RX.h",
    "content": "//\n//  _RX.h\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 7/12/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <objc/runtime.h>\n\n/**\n ################################################################################\n This file is part of RX private API\n ################################################################################\n */\n\n#if        TRACE_RESOURCES >= 2\n#   define DLOG(...)         NSLog(__VA_ARGS__)\n#else\n#   define DLOG(...)\n#endif\n\n#if        DEBUG\n#   define ABORT_IN_DEBUG    abort();\n#else\n#   define ABORT_IN_DEBUG\n#endif\n\n\n#define SEL_VALUE(x)      [NSValue valueWithPointer:(x)]\n#define CLASS_VALUE(x)    [NSValue valueWithNonretainedObject:(x)]\n#define IMP_VALUE(x)      [NSValue valueWithPointer:(x)]\n\n/**\n Checks that the local `error` instance exists before assigning it's value by reference.\n This macro exists to work around static analysis warnings — `NSError` is always assumed to be `nullable`, even though we explicitly define the method parameter as `nonnull`. See http://www.openradar.me/21766176 for more details.\n */\n#define RX_THROW_ERROR(errorValue, returnValue) if (error != nil) { *error = (errorValue); } return (returnValue);\n\n#define RX_CAT2(_1, _2) _RX_CAT2(_1, _2)\n#define _RX_CAT2(_1, _2) _1 ## _2\n\n#define RX_ELEMENT_AT(n, ...) RX_CAT2(_RX_ELEMENT_AT_, n)(__VA_ARGS__)\n#define _RX_ELEMENT_AT_0(x, ...) x\n#define _RX_ELEMENT_AT_1(_0, x, ...) x\n#define _RX_ELEMENT_AT_2(_0, _1, x, ...) x\n#define _RX_ELEMENT_AT_3(_0, _1, _2, x, ...) x\n#define _RX_ELEMENT_AT_4(_0, _1, _2, _3, x, ...) x\n#define _RX_ELEMENT_AT_5(_0, _1, _2, _3, _4, x, ...) x\n#define _RX_ELEMENT_AT_6(_0, _1, _2, _3, _4, _5, x, ...) x\n\n#define RX_COUNT(...) RX_ELEMENT_AT(6, ## __VA_ARGS__, 6, 5, 4, 3, 2, 1, 0)\n#define RX_EMPTY(...) RX_ELEMENT_AT(6, ## __VA_ARGS__, 0, 0, 0, 0, 0, 0, 1)\n\n/**\n #define SUM(context, index, head, tail) head + tail\n #define MAP(context, index, element) (context)[index] * (element)\n\n RX_FOR(numbers, SUM, MAP, b0, b1, b2);\n\n (numbers)[0] * (b0) + (numbers)[1] * (b1) + (numbers[2]) * (b2)\n */\n\n#define RX_FOREACH(context, concat, map, ...) RX_FOR_MAX(RX_COUNT(__VA_ARGS__), _RX_FOREACH_CONCAT, _RX_FOREACH_MAP, context, concat, map, __VA_ARGS__)\n#define _RX_FOREACH_CONCAT(index, head, tail, context, concat, map, ...) concat(context, index, head, tail)\n#define _RX_FOREACH_MAP(index, context, concat, map, ...) map(context, index, RX_ELEMENT_AT(index, __VA_ARGS__))\n\n/**\n #define MAP(context, index, item) (context)[index] * (item)\n\n RX_FOR_COMMA(numbers, MAP, b0, b1);\n\n ,(numbers)[0] * b0, (numbers)[1] * b1\n */\n#define RX_FOREACH_COMMA(context, map, ...) RX_CAT2(_RX_FOREACH_COMMA_EMPTY_, RX_EMPTY(__VA_ARGS__))(context, map, ## __VA_ARGS__)\n#define _RX_FOREACH_COMMA_EMPTY_1(context, map, ...)\n#define _RX_FOREACH_COMMA_EMPTY_0(context, map, ...) , RX_FOR_MAX(RX_COUNT(__VA_ARGS__), _RX_FOREACH_COMMA_CONCAT, _RX_FOREACH_COMMA_MAP, context, map, __VA_ARGS__)\n#define _RX_FOREACH_COMMA_CONCAT(index, head, tail, context, map, ...) head, tail\n#define _RX_FOREACH_COMMA_MAP(index, context, map, ...) map(context, index, RX_ELEMENT_AT(index, __VA_ARGS__))\n\n// rx for\n\n#define RX_FOR_MAX(max, concat, map, ...) RX_CAT2(RX_FOR_, max)(concat, map, ## __VA_ARGS__)\n\n#define RX_FOR_0(concat, map, ...)\n#define RX_FOR_1(concat, map, ...) map(0, __VA_ARGS__)\n#define RX_FOR_2(concat, map, ...) concat(1, RX_FOR_1(concat, map, ## __VA_ARGS__), map(1, __VA_ARGS__), __VA_ARGS__)\n#define RX_FOR_3(concat, map, ...) concat(2, RX_FOR_2(concat, map, ## __VA_ARGS__), map(2, __VA_ARGS__), __VA_ARGS__)\n#define RX_FOR_4(concat, map, ...) concat(3, RX_FOR_3(concat, map, ## __VA_ARGS__), map(3, __VA_ARGS__), __VA_ARGS__)\n#define RX_FOR_5(concat, map, ...) concat(4, RX_FOR_4(concat, map, ## __VA_ARGS__), map(4, __VA_ARGS__), __VA_ARGS__)\n#define RX_FOR_6(concat, map, ...) concat(5, RX_FOR_5(concat, map, ## __VA_ARGS__), map(5, __VA_ARGS__), __VA_ARGS__)\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Runtime/include/_RXDelegateProxy.h",
    "content": "//\n//  _RXDelegateProxy.h\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 7/4/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface _RXDelegateProxy : NSObject\n\n@property (nonatomic, weak, readonly) id _forwardToDelegate;\n\n-(void)_setForwardToDelegate:(id __nullable)forwardToDelegate retainDelegate:(BOOL)retainDelegate NS_SWIFT_NAME(_setForwardToDelegate(_:retainDelegate:)) ;\n\n-(BOOL)hasWiredImplementationForSelector:(SEL)selector;\n-(BOOL)voidDelegateMethodsContain:(SEL)selector;\n\n-(void)_sentMessage:(SEL)selector withArguments:(NSArray*)arguments;\n-(void)_methodInvoked:(SEL)selector withArguments:(NSArray*)arguments;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Runtime/include/_RXKVOObserver.h",
    "content": "//\n//  _RXKVOObserver.h\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 7/11/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n/**\n ################################################################################\n This file is part of RX private API\n ################################################################################\n */\n\n// Exists because if written in Swift, reading unowned is disabled during dealloc process\n@interface _RXKVOObserver : NSObject\n\n-(instancetype)initWithTarget:(id)target\n                 retainTarget:(BOOL)retainTarget\n                      keyPath:(NSString*)keyPath\n                      options:(NSKeyValueObservingOptions)options\n                     callback:(void (^)(id))callback;\n\n-(void)dispose;\n\n@end\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Runtime/include/_RXObjCRuntime.h",
    "content": "//\n//  _RXObjCRuntime.h\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 7/11/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n\n#if !DISABLE_SWIZZLING\n\n/**\n ################################################################################\n This file is part of RX private API\n ################################################################################\n */\n\n/**\n This flag controls `RELEASE` configuration behavior in case race was detecting while modifying\n ObjC runtime.\n\n In case this value is set to `YES`, after runtime race is detected, `abort()` will be called.\n Otherwise, only error will be reported using normal error reporting mechanism.\n\n In `DEBUG` mode `abort` will be always called in case race is detected.\n \n Races can't happen in case this is the only library modifying ObjC runtime, but in case there are multiple libraries\n changing ObjC runtime, race conditions can occur because there is no way to synchronize multiple libraries unaware of\n each other.\n\n To help remedy this situation this library will use `synchronized` on target object and it's meta-class, but\n there aren't any guarantees of how other libraries will behave.\n\n Default value is `NO`.\n\n */\nextern BOOL RXAbortOnThreadingHazard;\n\n/// Error domain for RXObjCRuntime.\nextern NSString * __nonnull const RXObjCRuntimeErrorDomain;\n\n/// `userInfo` key with additional information is interceptor probably KVO.\nextern NSString * __nonnull const RXObjCRuntimeErrorIsKVOKey;\n\ntypedef NS_ENUM(NSInteger, RXObjCRuntimeError) {\n    RXObjCRuntimeErrorUnknown                                           = 1,\n    RXObjCRuntimeErrorObjectMessagesAlreadyBeingIntercepted             = 2,\n    RXObjCRuntimeErrorSelectorNotImplemented                            = 3,\n    RXObjCRuntimeErrorCantInterceptCoreFoundationTollFreeBridgedObjects = 4,\n    RXObjCRuntimeErrorThreadingCollisionWithOtherInterceptionMechanism  = 5,\n    RXObjCRuntimeErrorSavingOriginalForwardingMethodFailed              = 6,\n    RXObjCRuntimeErrorReplacingMethodWithForwardingImplementation       = 7,\n    RXObjCRuntimeErrorObservingPerformanceSensitiveMessages             = 8,\n    RXObjCRuntimeErrorObservingMessagesWithUnsupportedReturnType        = 9,\n};\n\n/// Transforms normal selector into a selector with RX prefix.\nSEL _Nonnull RX_selector(SEL _Nonnull selector);\n\n/// Transforms selector into a unique pointer (because of Swift conversion rules)\nvoid * __nonnull RX_reference_from_selector(SEL __nonnull selector);\n\n/// Protocol that interception observers must implement.\n@protocol RXMessageSentObserver\n\n/// In case the same selector is being intercepted for a pair of base/sub classes,\n/// this property will differentiate between interceptors that need to fire.\n@property (nonatomic, assign, readonly) IMP __nonnull targetImplementation;\n\n-(void)messageSentWithArguments:(NSArray* __nonnull)arguments;\n-(void)methodInvokedWithArguments:(NSArray* __nonnull)arguments;\n\n@end\n\n/// Protocol that deallocating observer must implement.\n@protocol RXDeallocatingObserver\n\n/// In case the same selector is being intercepted for a pair of base/sub classes,\n/// this property will differentiate between interceptors that need to fire.\n@property (nonatomic, assign, readonly) IMP __nonnull targetImplementation;\n\n-(void)deallocating;\n\n@end\n\n/// Ensures interceptor is installed on target object.\nIMP __nullable RX_ensure_observing(id __nonnull target, SEL __nonnull selector, NSError *__autoreleasing __nullable * __nullable error);\n\n/// Extracts arguments for `invocation`.\nNSArray * __nonnull RX_extract_arguments(NSInvocation * __nonnull invocation);\n\n/// Returns `YES` in case method has `void` return type.\nBOOL RX_is_method_with_description_void(struct objc_method_description method);\n\n/// Returns `YES` in case methodSignature has `void` return type.\nBOOL RX_is_method_signature_void(NSMethodSignature * __nonnull methodSignature);\n\n/// Default value for `RXInterceptionObserver.targetImplementation`.\nIMP __nonnull RX_default_target_implementation(void);\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/RxCocoa.h",
    "content": "//\n//  RxCocoa.h\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 2/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import \"_RX.h\"\n#import \"_RXDelegateProxy.h\"\n#import \"_RXKVOObserver.h\"\n#import \"_RXObjCRuntime.h\"\n\n//! Project version number for RxCocoa.\nFOUNDATION_EXPORT double RxCocoaVersionNumber;\n\n//! Project version string for RxCocoa.\nFOUNDATION_EXPORT const unsigned char RxCocoaVersionString[];"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/RxCocoa.swift",
    "content": "//\n//  RxCocoa.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 2/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport class Foundation.NSNull\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n#if os(iOS)\n    import UIKit\n#endif\n\n/// RxCocoa errors.\npublic enum RxCocoaError\n    : Swift.Error\n    , CustomDebugStringConvertible {\n    /// Unknown error has occurred.\n    case unknown\n    /// Invalid operation was attempted.\n    case invalidOperation(object: Any)\n    /// Items are not yet bound to user interface but have been requested.\n    case itemsNotYetBound(object: Any)\n    /// Invalid KVO Path.\n    case invalidPropertyName(object: Any, propertyName: String)\n    /// Invalid object on key path.\n    case invalidObjectOnKeyPath(object: Any, sourceObject: AnyObject, propertyName: String)\n    /// Error during swizzling.\n    case errorDuringSwizzling\n    /// Casting error.\n    case castingError(object: Any, targetType: Any.Type)\n}\n\n\n// MARK: Debug descriptions\n\nextension RxCocoaError {\n    /// A textual representation of `self`, suitable for debugging.\n    public var debugDescription: String {\n        switch self {\n        case .unknown:\n            return \"Unknown error occurred.\"\n        case let .invalidOperation(object):\n            return \"Invalid operation was attempted on `\\(object)`.\"\n        case let .itemsNotYetBound(object):\n            return \"Data source is set, but items are not yet bound to user interface for `\\(object)`.\"\n        case let .invalidPropertyName(object, propertyName):\n            return \"Object `\\(object)` doesn't have a property named `\\(propertyName)`.\"\n        case let .invalidObjectOnKeyPath(object, sourceObject, propertyName):\n            return \"Unobservable object `\\(object)` was observed as `\\(propertyName)` of `\\(sourceObject)`.\"\n        case .errorDuringSwizzling:\n            return \"Error during swizzling.\"\n        case .castingError(let object, let targetType):\n            return \"Error casting `\\(object)` to `\\(targetType)`\"\n        }\n    }\n}\n\n\n\n// MARK: Error binding policies\n\nfunc bindingError(_ error: Swift.Error) {\n    let error = \"Binding error: \\(error)\"\n#if DEBUG\n    rxFatalError(error)\n#else\n    print(error)\n#endif\n}\n\n/// Swift does not implement abstract methods. This method is used as a runtime check to ensure that methods which intended to be abstract (i.e., they should be implemented in subclasses) are not called directly on the superclass.\nfunc rxAbstractMethod(message: String = \"Abstract method\", file: StaticString = #file, line: UInt = #line) -> Swift.Never {\n    rxFatalError(message, file: file, line: line)\n}\n\nfunc rxFatalError(_ lastMessage: @autoclosure () -> String, file: StaticString = #file, line: UInt = #line) -> Swift.Never  {\n    // The temptation to comment this line is great, but please don't, it's for your own good. The choice is yours.\n    fatalError(lastMessage(), file: file, line: line)\n}\n\nfunc rxFatalErrorInDebug(_ lastMessage: @autoclosure () -> String, file: StaticString = #file, line: UInt = #line) {\n    #if DEBUG\n        fatalError(lastMessage(), file: file, line: line)\n    #else\n        print(\"\\(file):\\(line): \\(lastMessage())\")\n    #endif\n}\n\n// MARK: casts or fatal error\n\n// workaround for Swift compiler bug, cheers compiler team :)\nfunc castOptionalOrFatalError<T>(_ value: Any?) -> T? {\n    if value == nil {\n        return nil\n    }\n    let v: T = castOrFatalError(value)\n    return v\n}\n\nfunc castOrThrow<T>(_ resultType: T.Type, _ object: Any) throws -> T {\n    guard let returnValue = object as? T else {\n        throw RxCocoaError.castingError(object: object, targetType: resultType)\n    }\n\n    return returnValue\n}\n\nfunc castOptionalOrThrow<T>(_ resultType: T.Type, _ object: AnyObject) throws -> T? {\n    if NSNull().isEqual(object) {\n        return nil\n    }\n\n    guard let returnValue = object as? T else {\n        throw RxCocoaError.castingError(object: object, targetType: resultType)\n    }\n\n    return returnValue\n}\n\nfunc castOrFatalError<T>(_ value: AnyObject!, message: String) -> T {\n    let maybeResult: T? = value as? T\n    guard let result = maybeResult else {\n        rxFatalError(message)\n    }\n    \n    return result\n}\n\nfunc castOrFatalError<T>(_ value: Any!) -> T {\n    let maybeResult: T? = value as? T\n    guard let result = maybeResult else {\n        rxFatalError(\"Failure converting from \\(value) to \\(T.self)\")\n    }\n    \n    return result\n}\n\n// MARK: Error messages\n\nlet dataSourceNotSet = \"DataSource not set\"\nlet delegateNotSet = \"Delegate not set\"\n\n// MARK: Shared with RxSwift\n\n#if !RX_NO_MODULE\n\nfunc rxFatalError(_ lastMessage: String) -> Never  {\n    // The temptation to comment this line is great, but please don't, it's for your own good. The choice is yours.\n    fatalError(lastMessage)\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/BehaviorRelay.swift",
    "content": "//\n//  BehaviorRelay.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 10/7/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n\n/// BehaviorRelay is a wrapper for `BehaviorSubject`.\n///\n/// Unlike `BehaviorSubject` it can't terminate with error or completed.\npublic final class BehaviorRelay<Element>: ObservableType {\n    public typealias E = Element\n\n    private let _subject: BehaviorSubject<Element>\n\n    // Accepts `event` and emits it to subscribers\n    public func accept(_ event: Element) {\n        _subject.onNext(event)\n    }\n\n    /// Current value of behavior subject\n    public var value: Element {\n        // this try! is ok because subject can't error out or be disposed\n        return try! _subject.value()\n    }\n\n    /// Initializes variable with initial value.\n    public init(value: Element) {\n        _subject = BehaviorSubject(value: value)\n    }\n\n    /// Subscribes observer\n    public func subscribe<O: ObserverType>(_ observer: O) -> Disposable where O.E == E {\n        return _subject.subscribe(observer)\n    }\n\n    /// - returns: Canonical interface for push style sequence\n    public func asObservable() -> Observable<Element> {\n        return _subject.asObservable()\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/ControlEvent.swift",
    "content": "//\n//  ControlEvent.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 8/28/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n\n/// Protocol that enables extension of `ControlEvent`.\npublic protocol ControlEventType : ObservableType {\n\n    /// - returns: `ControlEvent` interface\n    func asControlEvent() -> ControlEvent<E>\n}\n\n/**\n    Trait for `Observable`/`ObservableType` that represents event on UI element.\n\n    It's properties are:\n\n    - it never fails\n    - it won't send any initial value on subscription\n    - it will `Complete` sequence on control being deallocated\n    - it never errors out\n    - it delivers events on `MainScheduler.instance`\n\n    **The implementation of `ControlEvent` will ensure that sequence of events is being subscribed on main scheduler\n     (`subscribeOn(ConcurrentMainScheduler.instance)` behavior).**\n\n    **It is implementor's responsibility to make sure that that all other properties enumerated above are satisfied.**\n\n    **If they aren't, then using this trait communicates wrong properties and could potentially break someone's code.**\n\n    **In case `events` observable sequence that is being passed into initializer doesn't satisfy all enumerated\n     properties, please don't use this trait.**\n*/\npublic struct ControlEvent<PropertyType> : ControlEventType {\n    public typealias E = PropertyType\n\n    let _events: Observable<PropertyType>\n\n    /// Initializes control event with a observable sequence that represents events.\n    ///\n    /// - parameter events: Observable sequence that represents events.\n    /// - returns: Control event created with a observable sequence of events.\n    public init<Ev: ObservableType>(events: Ev) where Ev.E == E {\n        _events = events.subscribeOn(ConcurrentMainScheduler.instance)\n    }\n\n    /// Subscribes an observer to control events.\n    ///\n    /// - parameter observer: Observer to subscribe to events.\n    /// - returns: Disposable object that can be used to unsubscribe the observer from receiving control events.\n    public func subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == E {\n        return _events.subscribe(observer)\n    }\n\n    /// - returns: `Observable` interface.\n    public func asObservable() -> Observable<E> {\n        return _events\n    }\n\n    /// - returns: `ControlEvent` interface.\n    public func asControlEvent() -> ControlEvent<E> {\n        return self\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/ControlProperty.swift",
    "content": "//\n//  ControlProperty.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 8/28/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\n/// Protocol that enables extension of `ControlProperty`.\npublic protocol ControlPropertyType : ObservableType, ObserverType {\n\n    /// - returns: `ControlProperty` interface\n    func asControlProperty() -> ControlProperty<E>\n}\n\n/**\n    Trait for `Observable`/`ObservableType` that represents property of UI element.\n \n    Sequence of values only represents initial control value and user initiated value changes.\n    Programatic value changes won't be reported.\n\n    It's properties are:\n\n    - it never fails\n    - `shareReplay(1)` behavior\n        - it's stateful, upon subscription (calling subscribe) last element is immediately replayed if it was produced\n    - it will `Complete` sequence on control being deallocated\n    - it never errors out\n    - it delivers events on `MainScheduler.instance`\n\n    **The implementation of `ControlProperty` will ensure that sequence of values is being subscribed on main scheduler\n    (`subscribeOn(ConcurrentMainScheduler.instance)` behavior).**\n\n    **It is implementor's responsibility to make sure that that all other properties enumerated above are satisfied.**\n\n    **If they aren't, then using this trait communicates wrong properties and could potentially break someone's code.**\n\n    **In case `values` observable sequence that is being passed into initializer doesn't satisfy all enumerated\n    properties, please don't use this trait.**\n*/\npublic struct ControlProperty<PropertyType> : ControlPropertyType {\n    public typealias E = PropertyType\n\n    let _values: Observable<PropertyType>\n    let _valueSink: AnyObserver<PropertyType>\n\n    /// Initializes control property with a observable sequence that represents property values and observer that enables\n    /// binding values to property.\n    ///\n    /// - parameter values: Observable sequence that represents property values.\n    /// - parameter valueSink: Observer that enables binding values to control property.\n    /// - returns: Control property created with a observable sequence of values and an observer that enables binding values\n    /// to property.\n    public init<V: ObservableType, S: ObserverType>(values: V, valueSink: S) where E == V.E, E == S.E {\n        _values = values.subscribeOn(ConcurrentMainScheduler.instance)\n        _valueSink = valueSink.asObserver()\n    }\n\n    /// Subscribes an observer to control property values.\n    ///\n    /// - parameter observer: Observer to subscribe to property values.\n    /// - returns: Disposable object that can be used to unsubscribe the observer from receiving control property values.\n    public func subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == E {\n        return _values.subscribe(observer)\n    }\n\n    /// `ControlEvent` of user initiated value changes. Every time user updates control value change event\n    /// will be emitted from `changed` event.\n    ///\n    /// Programatic changes to control value won't be reported.\n    ///\n    /// It contains all control property values except for first one.\n    ///\n    /// The name only implies that sequence element will be generated once user changes a value and not that\n    /// adjacent sequence values need to be different (e.g. because of interaction between programatic and user updates,\n    /// or for any other reason).\n    public var changed: ControlEvent<PropertyType> {\n        get {\n            return ControlEvent(events: _values.skip(1))\n        }\n    }\n\n    /// - returns: `Observable` interface.\n    public func asObservable() -> Observable<E> {\n        return _values\n    }\n\n    /// - returns: `ControlProperty` interface.\n    public func asControlProperty() -> ControlProperty<E> {\n        return self\n    }\n\n    /// Binds event to user interface.\n    ///\n    /// - In case next element is received, it is being set to control value.\n    /// - In case error is received, DEBUG buids raise fatal error, RELEASE builds log event to standard output.\n    /// - In case sequence completes, nothing happens.\n    public func on(_ event: Event<E>) {\n        switch event {\n        case .error(let error):\n            bindingError(error)\n        case .next:\n            _valueSink.on(event)\n        case .completed:\n            _valueSink.on(event)\n        }\n    }\n}\n\nextension ControlPropertyType where E == String? {\n    /// Transforms control property of type `String?` into control property of type `String`.\n    public var orEmpty: ControlProperty<String> {\n        let original: ControlProperty<String?> = self.asControlProperty()\n\n        let values: Observable<String> = original._values.map { $0 ?? \"\" }\n        let valueSink: AnyObserver<String> = original._valueSink.mapObserver { $0 }\n        return ControlProperty<String>(values: values, valueSink: valueSink)\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/Driver/BehaviorRelay+Driver.swift",
    "content": "//\n//  BehaviorRelay+Driver.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 10/7/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n\nextension BehaviorRelay {\n    /// Converts `BehaviorRelay` to `Driver`.\n    ///\n    /// - returns: Observable sequence.\n    public func asDriver() -> Driver<Element> {\n        let source = self.asObservable()\n            .observeOn(DriverSharingStrategy.scheduler)\n        return SharedSequence(source)\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/Driver/ControlEvent+Driver.swift",
    "content": "//\n//  ControlEvent+Driver.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 9/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n    \nextension ControlEvent {\n    /// Converts `ControlEvent` to `Driver` trait.\n    ///\n    /// `ControlEvent` already can't fail, so no special case needs to be handled.\n    public func asDriver() -> Driver<E> {\n        return self.asDriver { (error) -> Driver<E> in\n            #if DEBUG\n                rxFatalError(\"Somehow driver received error from a source that shouldn't fail.\")\n            #else\n                return Driver.empty()\n            #endif\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/Driver/ControlProperty+Driver.swift",
    "content": "//\n//  ControlProperty+Driver.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 9/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\nextension ControlProperty {\n    /// Converts `ControlProperty` to `Driver` trait.\n    ///\n    /// `ControlProperty` already can't fail, so no special case needs to be handled.\n    public func asDriver() -> Driver<E> {\n        return self.asDriver { (error) -> Driver<E> in\n            #if DEBUG\n                rxFatalError(\"Somehow driver received error from a source that shouldn't fail.\")\n            #else\n                return Driver.empty()\n            #endif\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/Driver/Driver+Subscription.swift",
    "content": "//\n//  Driver+Subscription.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 9/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\nprivate let errorMessage = \"`drive*` family of methods can be only called from `MainThread`.\\n\" +\n\"This is required to ensure that the last replayed `Driver` element is delivered on `MainThread`.\\n\"\n\nextension SharedSequenceConvertibleType where SharingStrategy == DriverSharingStrategy {\n    /**\n    Creates new subscription and sends elements to observer.\n    This method can be only called from `MainThread`.\n\n    In this form it's equivalent to `subscribe` method, but it communicates intent better.\n\n    - parameter observer: Observer that receives events.\n    - returns: Disposable object that can be used to unsubscribe the observer from the subject.\n    */\n    public func drive<O: ObserverType>(_ observer: O) -> Disposable where O.E == E {\n        MainScheduler.ensureExecutingOnScheduler(errorMessage: errorMessage)\n        return self.asSharedSequence().asObservable().subscribe(observer)\n    }\n\n    /**\n     Creates new subscription and sends elements to observer.\n     This method can be only called from `MainThread`.\n\n     In this form it's equivalent to `subscribe` method, but it communicates intent better.\n\n     - parameter observer: Observer that receives events.\n     - returns: Disposable object that can be used to unsubscribe the observer from the subject.\n     */\n    public func drive<O: ObserverType>(_ observer: O) -> Disposable where O.E == E? {\n        MainScheduler.ensureExecutingOnScheduler(errorMessage: errorMessage)\n        return self.asSharedSequence().asObservable().map { $0 as E? }.subscribe(observer)\n    }\n\n    /**\n    Creates new subscription and sends elements to `BehaviorRelay`.\n    This method can be only called from `MainThread`.\n\n    - parameter variable: Target variable for sequence elements.\n    - returns: Disposable object that can be used to unsubscribe the observer from the variable.\n    */\n    public func drive(_ relay: BehaviorRelay<E>) -> Disposable {\n        MainScheduler.ensureExecutingOnScheduler(errorMessage: errorMessage)\n        return drive(onNext: { e in\n            relay.accept(e)\n        })\n    }\n\n    /**\n     Creates new subscription and sends elements to variable.\n     This method can be only called from `MainThread`.\n\n     - parameter variable: Target variable for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer from the variable.\n     */\n    public func drive(_ relay: BehaviorRelay<E?>) -> Disposable {\n        MainScheduler.ensureExecutingOnScheduler(errorMessage: errorMessage)\n        return drive(onNext: { e in\n            relay.accept(e)\n        })\n    }\n\n    /**\n    Subscribes to observable sequence using custom binder function.\n    This method can be only called from `MainThread`.\n\n    - parameter with: Function used to bind elements from `self`.\n    - returns: Object representing subscription.\n    */\n    public func drive<R>(_ transformation: (Observable<E>) -> R) -> R {\n        MainScheduler.ensureExecutingOnScheduler(errorMessage: errorMessage)\n        return transformation(self.asObservable())\n    }\n\n    /**\n    Subscribes to observable sequence using custom binder function and final parameter passed to binder function\n    after `self` is passed.\n\n        public func drive<R1, R2>(with: Self -> R1 -> R2, curriedArgument: R1) -> R2 {\n            return with(self)(curriedArgument)\n        }\n\n    This method can be only called from `MainThread`.\n\n    - parameter with: Function used to bind elements from `self`.\n    - parameter curriedArgument: Final argument passed to `binder` to finish binding process.\n    - returns: Object representing subscription.\n    */\n    public func drive<R1, R2>(_ with: (Observable<E>) -> (R1) -> R2, curriedArgument: R1) -> R2 {\n        MainScheduler.ensureExecutingOnScheduler(errorMessage: errorMessage)\n        return with(self.asObservable())(curriedArgument)\n    }\n    \n    /**\n    Subscribes an element handler, a completion handler and disposed handler to an observable sequence.\n    This method can be only called from `MainThread`.\n    \n    Error callback is not exposed because `Driver` can't error out.\n    \n    - parameter onNext: Action to invoke for each element in the observable sequence.\n    - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.\n    gracefully completed, errored, or if the generation is canceled by disposing subscription)\n    - parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has\n    gracefully completed, errored, or if the generation is canceled by disposing subscription)\n    - returns: Subscription object used to unsubscribe from the observable sequence.\n    */\n    public func drive(onNext: ((E) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onDisposed: (() -> Void)? = nil) -> Disposable {\n        MainScheduler.ensureExecutingOnScheduler(errorMessage: errorMessage)\n        return self.asObservable().subscribe(onNext: onNext, onCompleted: onCompleted, onDisposed: onDisposed)\n    }\n}\n\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/Driver/Driver.swift",
    "content": "//\n//  Driver.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 9/26/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n\n\n/**\n Trait that represents observable sequence with following properties:\n\n - it never fails\n - it delivers events on `MainScheduler.instance`\n - `share(replay: 1, scope: .whileConnected)` sharing strategy\n \n Additional explanation:\n - all observers share sequence computation resources\n - it's stateful, upon subscription (calling subscribe) last element is immediately replayed if it was produced\n - computation of elements is reference counted with respect to the number of observers\n - if there are no subscribers, it will release sequence computation resources\n\n In case trait that models event bus is required, please check `Signal`.\n\n `Driver<Element>` can be considered a builder pattern for observable sequences that drive the application.\n\n If observable sequence has produced at least one element, after new subscription is made last produced element will be\n immediately replayed on the same thread on which the subscription was made.\n\n When using `drive*`, `subscribe*` and `bind*` family of methods, they should always be called from main thread.\n\n If `drive*`, `subscribe*` and `bind*` are called from background thread, it is possible that initial replay\n will happen on background thread, and subsequent events will arrive on main thread.\n\n To find out more about traits and how to use them, please visit `Documentation/Traits.md`.\n */\npublic typealias Driver<E> = SharedSequence<DriverSharingStrategy, E>\n\npublic struct DriverSharingStrategy: SharingStrategyProtocol {\n    public static var scheduler: SchedulerType { return SharingScheduler.make() }\n    public static func share<E>(_ source: Observable<E>) -> Observable<E> {\n        return source.share(replay: 1, scope: .whileConnected)\n    }\n}\n\nextension SharedSequenceConvertibleType where SharingStrategy == DriverSharingStrategy {\n    /// Adds `asDriver` to `SharingSequence` with `DriverSharingStrategy`.\n    public func asDriver() -> Driver<E> {\n        return self.asSharedSequence()\n    }\n}\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/Driver/ObservableConvertibleType+Driver.swift",
    "content": "//\n//  ObservableConvertibleType+Driver.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 9/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\nextension ObservableConvertibleType {\n    /**\n    Converts observable sequence to `Driver` trait.\n    \n    - parameter onErrorJustReturn: Element to return in case of error and after that complete the sequence.\n    - returns: Driver trait.\n    */\n    public func asDriver(onErrorJustReturn: E) -> Driver<E> {\n        let source = self\n            .asObservable()\n            .observeOn(DriverSharingStrategy.scheduler)\n            .catchErrorJustReturn(onErrorJustReturn)\n        return Driver(source)\n    }\n    \n    /**\n    Converts observable sequence to `Driver` trait.\n    \n    - parameter onErrorDriveWith: Driver that continues to drive the sequence in case of error.\n    - returns: Driver trait.\n    */\n    public func asDriver(onErrorDriveWith: Driver<E>) -> Driver<E> {\n        let source = self\n            .asObservable()\n            .observeOn(DriverSharingStrategy.scheduler)\n            .catchError { _ in\n                onErrorDriveWith.asObservable()\n            }\n        return Driver(source)\n    }\n\n    /**\n    Converts observable sequence to `Driver` trait.\n    \n    - parameter onErrorRecover: Calculates driver that continues to drive the sequence in case of error.\n    - returns: Driver trait.\n    */\n    public func asDriver(onErrorRecover: @escaping (_ error: Swift.Error) -> Driver<E>) -> Driver<E> {\n        let source = self\n            .asObservable()\n            .observeOn(DriverSharingStrategy.scheduler)\n            .catchError { error in\n                onErrorRecover(error).asObservable()\n            }\n        return Driver(source)\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/PublishRelay.swift",
    "content": "//\n//  PublishRelay.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 3/28/15.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n\n/// PublishRelay is a wrapper for `PublishSubject`.\n///\n/// Unlike `PublishSubject` it can't terminate with error or completed.\npublic final class PublishRelay<Element>: ObservableType {\n    public typealias E = Element\n\n    private let _subject: PublishSubject<Element>\n    \n    // Accepts `event` and emits it to subscribers\n    public func accept(_ event: Element) {\n        _subject.onNext(event)\n    }\n    \n    /// Initializes variable with initial value.\n    public init() {\n        _subject = PublishSubject()\n    }\n\n    /// Subscribes observer\n    public func subscribe<O: ObserverType>(_ observer: O) -> Disposable where O.E == E {\n        return _subject.subscribe(observer)\n    }\n    \n    /// - returns: Canonical interface for push style sequence\n    public func asObservable() -> Observable<Element> {\n        return _subject.asObservable()\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SchedulerType+SharedSequence.swift",
    "content": "//\n//  SchedulerType+SharedSequence.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 8/27/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nimport RxSwift\n\npublic enum SharingScheduler {\n    /// Default scheduler used in SharedSequence based traits.\n    public private(set) static var make: () -> SchedulerType = { MainScheduler() }\n\n    /**\n     This method can be used in unit tests to ensure that built in shared sequences are using mock schedulers instead\n     of main schedulers.\n\n     **This shouldn't be used in normal release builds.**\n    */\n    static public func mock(scheduler: SchedulerType, action: () -> ()) {\n        return mock(makeScheduler: { scheduler }, action: action)\n    }\n\n    /**\n     This method can be used in unit tests to ensure that built in shared sequences are using mock schedulers instead\n     of main schedulers.\n\n     **This shouldn't be used in normal release builds.**\n     */\n    static public func mock(makeScheduler: @escaping () -> SchedulerType, action: () -> ()) {\n        let originalMake = make\n        make = makeScheduler\n\n        action()\n\n        // If you remove this line , compiler buggy optimizations will change behavior of this code\n        _forceCompilerToStopDoingInsaneOptimizationsThatBreakCode(makeScheduler)\n        // Scary, I know\n\n        make = originalMake\n    }\n}\n\n#if os(Linux)\n    import Glibc\n#else\n    import func Foundation.arc4random\n#endif\n\nfunc _forceCompilerToStopDoingInsaneOptimizationsThatBreakCode(_ scheduler: () -> SchedulerType) {\n    let a: Int32 = 1\n#if os(Linux)\n    let b = 314 + Int32(Glibc.random() & 1)\n#else\n    let b = 314 + Int32(arc4random() & 1)\n#endif\n    if a == b {\n        print(scheduler())\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SharedSequence+Operators+arity.swift",
    "content": "// This file is autogenerated. Take a look at `Preprocessor` target in RxSwift project \n//\n//  SharedSequence+Operators+arity.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 10/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\n\n\n// 2\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, resultSelector: @escaping (O1.E, O2.E) throws -> E)\n        -> SharedSequence<O1.SharingStrategy, E> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(),\n            resultSelector: resultSelector\n        )\n\n        return SharedSequence<SharingStrategy, E>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2)\n        -> SharedSequence<O1.SharingStrategy, (O1.E, O2.E)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable()\n        )\n\n        return SharedSequence<SharingStrategy, (O1.E, O2.E)>(source)\n    }\n}\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, resultSelector: @escaping (O1.E, O2.E) throws -> E)\n        -> SharedSequence<SharingStrategy, E> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(),\n                resultSelector: resultSelector\n            )\n\n        return SharedSequence<O1.SharingStrategy, E>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever any of the observable sequences produces an element.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2)\n        -> SharedSequence<SharingStrategy, (O1.E, O2.E)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable()\n            )\n\n        return SharedSequence<O1.SharingStrategy, (O1.E, O2.E)>(source)\n    }\n}\n\n\n\n// 3\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, resultSelector: @escaping (O1.E, O2.E, O3.E) throws -> E)\n        -> SharedSequence<O1.SharingStrategy, E> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(),\n            resultSelector: resultSelector\n        )\n\n        return SharedSequence<SharingStrategy, E>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3)\n        -> SharedSequence<O1.SharingStrategy, (O1.E, O2.E, O3.E)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable()\n        )\n\n        return SharedSequence<SharingStrategy, (O1.E, O2.E, O3.E)>(source)\n    }\n}\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, resultSelector: @escaping (O1.E, O2.E, O3.E) throws -> E)\n        -> SharedSequence<SharingStrategy, E> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(),\n                resultSelector: resultSelector\n            )\n\n        return SharedSequence<O1.SharingStrategy, E>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever any of the observable sequences produces an element.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3)\n        -> SharedSequence<SharingStrategy, (O1.E, O2.E, O3.E)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable()\n            )\n\n        return SharedSequence<O1.SharingStrategy, (O1.E, O2.E, O3.E)>(source)\n    }\n}\n\n\n\n// 4\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E) throws -> E)\n        -> SharedSequence<O1.SharingStrategy, E> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(),\n            resultSelector: resultSelector\n        )\n\n        return SharedSequence<SharingStrategy, E>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4)\n        -> SharedSequence<O1.SharingStrategy, (O1.E, O2.E, O3.E, O4.E)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable()\n        )\n\n        return SharedSequence<SharingStrategy, (O1.E, O2.E, O3.E, O4.E)>(source)\n    }\n}\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E) throws -> E)\n        -> SharedSequence<SharingStrategy, E> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(),\n                resultSelector: resultSelector\n            )\n\n        return SharedSequence<O1.SharingStrategy, E>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever any of the observable sequences produces an element.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4)\n        -> SharedSequence<SharingStrategy, (O1.E, O2.E, O3.E, O4.E)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable()\n            )\n\n        return SharedSequence<O1.SharingStrategy, (O1.E, O2.E, O3.E, O4.E)>(source)\n    }\n}\n\n\n\n// 5\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E) throws -> E)\n        -> SharedSequence<O1.SharingStrategy, E> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(),\n            resultSelector: resultSelector\n        )\n\n        return SharedSequence<SharingStrategy, E>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5)\n        -> SharedSequence<O1.SharingStrategy, (O1.E, O2.E, O3.E, O4.E, O5.E)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable()\n        )\n\n        return SharedSequence<SharingStrategy, (O1.E, O2.E, O3.E, O4.E, O5.E)>(source)\n    }\n}\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E) throws -> E)\n        -> SharedSequence<SharingStrategy, E> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(),\n                resultSelector: resultSelector\n            )\n\n        return SharedSequence<O1.SharingStrategy, E>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever any of the observable sequences produces an element.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5)\n        -> SharedSequence<SharingStrategy, (O1.E, O2.E, O3.E, O4.E, O5.E)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable()\n            )\n\n        return SharedSequence<O1.SharingStrategy, (O1.E, O2.E, O3.E, O4.E, O5.E)>(source)\n    }\n}\n\n\n\n// 6\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType, O6: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E) throws -> E)\n        -> SharedSequence<O1.SharingStrategy, E> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy,\n            SharingStrategy == O6.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(),\n            resultSelector: resultSelector\n        )\n\n        return SharedSequence<SharingStrategy, E>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType, O6: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6)\n        -> SharedSequence<O1.SharingStrategy, (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy,\n            SharingStrategy == O6.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable()\n        )\n\n        return SharedSequence<SharingStrategy, (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E)>(source)\n    }\n}\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType, O6: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E) throws -> E)\n        -> SharedSequence<SharingStrategy, E> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy,\n            SharingStrategy == O6.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(),\n                resultSelector: resultSelector\n            )\n\n        return SharedSequence<O1.SharingStrategy, E>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever any of the observable sequences produces an element.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType, O6: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6)\n        -> SharedSequence<SharingStrategy, (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy,\n            SharingStrategy == O6.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable()\n            )\n\n        return SharedSequence<O1.SharingStrategy, (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E)>(source)\n    }\n}\n\n\n\n// 7\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType, O6: SharedSequenceConvertibleType, O7: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E) throws -> E)\n        -> SharedSequence<O1.SharingStrategy, E> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy,\n            SharingStrategy == O6.SharingStrategy,\n            SharingStrategy == O7.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable(),\n            resultSelector: resultSelector\n        )\n\n        return SharedSequence<SharingStrategy, E>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType, O6: SharedSequenceConvertibleType, O7: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7)\n        -> SharedSequence<O1.SharingStrategy, (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy,\n            SharingStrategy == O6.SharingStrategy,\n            SharingStrategy == O7.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable()\n        )\n\n        return SharedSequence<SharingStrategy, (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E)>(source)\n    }\n}\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType, O6: SharedSequenceConvertibleType, O7: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E) throws -> E)\n        -> SharedSequence<SharingStrategy, E> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy,\n            SharingStrategy == O6.SharingStrategy,\n            SharingStrategy == O7.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable(),\n                resultSelector: resultSelector\n            )\n\n        return SharedSequence<O1.SharingStrategy, E>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever any of the observable sequences produces an element.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType, O6: SharedSequenceConvertibleType, O7: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7)\n        -> SharedSequence<SharingStrategy, (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy,\n            SharingStrategy == O6.SharingStrategy,\n            SharingStrategy == O7.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable()\n            )\n\n        return SharedSequence<O1.SharingStrategy, (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E)>(source)\n    }\n}\n\n\n\n// 8\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType, O6: SharedSequenceConvertibleType, O7: SharedSequenceConvertibleType, O8: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E) throws -> E)\n        -> SharedSequence<O1.SharingStrategy, E> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy,\n            SharingStrategy == O6.SharingStrategy,\n            SharingStrategy == O7.SharingStrategy,\n            SharingStrategy == O8.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable(), source8.asSharedSequence().asObservable(),\n            resultSelector: resultSelector\n        )\n\n        return SharedSequence<SharingStrategy, E>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType, O6: SharedSequenceConvertibleType, O7: SharedSequenceConvertibleType, O8: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8)\n        -> SharedSequence<O1.SharingStrategy, (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy,\n            SharingStrategy == O6.SharingStrategy,\n            SharingStrategy == O7.SharingStrategy,\n            SharingStrategy == O8.SharingStrategy {\n        let source = Observable.zip(\n            source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable(), source8.asSharedSequence().asObservable()\n        )\n\n        return SharedSequence<SharingStrategy, (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E)>(source)\n    }\n}\n\nextension SharedSequence {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType, O6: SharedSequenceConvertibleType, O7: SharedSequenceConvertibleType, O8: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E) throws -> E)\n        -> SharedSequence<SharingStrategy, E> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy,\n            SharingStrategy == O6.SharingStrategy,\n            SharingStrategy == O7.SharingStrategy,\n            SharingStrategy == O8.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable(), source8.asSharedSequence().asObservable(),\n                resultSelector: resultSelector\n            )\n\n        return SharedSequence<O1.SharingStrategy, E>(source)\n    }\n}\n\nextension SharedSequenceConvertibleType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of element tuples whenever any of the observable sequences produces an element.\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: SharedSequenceConvertibleType, O2: SharedSequenceConvertibleType, O3: SharedSequenceConvertibleType, O4: SharedSequenceConvertibleType, O5: SharedSequenceConvertibleType, O6: SharedSequenceConvertibleType, O7: SharedSequenceConvertibleType, O8: SharedSequenceConvertibleType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8)\n        -> SharedSequence<SharingStrategy, (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E)> where SharingStrategy == O1.SharingStrategy,\n            SharingStrategy == O2.SharingStrategy,\n            SharingStrategy == O3.SharingStrategy,\n            SharingStrategy == O4.SharingStrategy,\n            SharingStrategy == O5.SharingStrategy,\n            SharingStrategy == O6.SharingStrategy,\n            SharingStrategy == O7.SharingStrategy,\n            SharingStrategy == O8.SharingStrategy {\n        let source = Observable.combineLatest(\n                source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable(), source8.asSharedSequence().asObservable()\n            )\n\n        return SharedSequence<O1.SharingStrategy, (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E)>(source)\n    }\n}\n\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SharedSequence+Operators.swift",
    "content": "//\n//  SharedSequence+Operators.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 9/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\n// MARK: map\nextension SharedSequenceConvertibleType {\n    \n    /**\n    Projects each element of an observable sequence into a new form.\n    \n    - parameter selector: A transform function to apply to each source element.\n    - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source.\n    */\n    public func map<R>(_ selector: @escaping (E) -> R) -> SharedSequence<SharingStrategy, R> {\n        let source = self\n            .asObservable()\n            .map(selector)\n        return SharedSequence<SharingStrategy, R>(source)\n    }\n}\n\n// MARK: filter\nextension SharedSequenceConvertibleType {\n    /**\n    Filters the elements of an observable sequence based on a predicate.\n    \n    - parameter predicate: A function to test each source element for a condition.\n    - returns: An observable sequence that contains elements from the input sequence that satisfy the condition.\n    */\n    public func filter(_ predicate: @escaping (E) -> Bool) -> SharedSequence<SharingStrategy, E> {\n        let source = self\n            .asObservable()\n            .filter(predicate)\n        return SharedSequence(source)\n    }\n}\n\n// MARK: switchLatest\nextension SharedSequenceConvertibleType where E : SharedSequenceConvertibleType {\n    \n    /**\n    Transforms an observable sequence of observable sequences into an observable sequence\n    producing values only from the most recent observable sequence.\n    \n    Each time a new inner observable sequence is received, unsubscribe from the\n    previous inner observable sequence.\n    \n    - returns: The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n    */\n    public func switchLatest() -> SharedSequence<E.SharingStrategy, E.E> {\n        let source: Observable<E.E> = self\n            .asObservable()\n            .map { $0.asSharedSequence() }\n            .switchLatest()\n        return SharedSequence<E.SharingStrategy, E.E>(source)\n    }\n}\n\n// MARK: flatMapLatest\nextension SharedSequenceConvertibleType {\n    /**\n     Projects each element of an observable sequence into a new sequence of observable sequences and then\n     transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n\n     It is a combination of `map` + `switchLatest` operator\n\n     - parameter selector: A transform function to apply to each element.\n     - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source producing an\n     Observable of Observable sequences and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n     */\n    public func flatMapLatest<Sharing, R>(_ selector: @escaping (E) -> SharedSequence<Sharing, R>)\n        -> SharedSequence<Sharing, R> {\n        let source: Observable<R> = self\n            .asObservable()\n            .flatMapLatest(selector)\n        return SharedSequence<Sharing, R>(source)\n    }\n}\n\n// MARK: flatMapFirst\nextension SharedSequenceConvertibleType {\n\n    /**\n     Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n     If element is received while there is some projected observable sequence being merged it will simply be ignored.\n\n     - parameter selector: A transform function to apply to element that was observed while no observable is executing in parallel.\n     - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence that was received while no other sequence was being calculated.\n     */\n    public func flatMapFirst<Sharing, R>(_ selector: @escaping (E) -> SharedSequence<Sharing, R>)\n        -> SharedSequence<Sharing, R> {\n        let source: Observable<R> = self\n            .asObservable()\n            .flatMapFirst(selector)\n        return SharedSequence<Sharing, R>(source)\n    }\n}\n\n// MARK: do\nextension SharedSequenceConvertibleType {\n    /**\n     Invokes an action for each event in the observable sequence, and propagates all observer messages through the result sequence.\n\n     - parameter onNext: Action to invoke for each element in the observable sequence.\n     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.\n     - parameter onSubscribe: Action to invoke before subscribing to source observable sequence.\n     - parameter onSubscribed: Action to invoke after subscribing to source observable sequence.\n     - parameter onDispose: Action to invoke after subscription to source observable has been disposed for any reason. It can be either because sequence terminates for some reason or observer subscription being disposed.\n     - returns: The source sequence with the side-effecting behavior applied.\n     */\n    public func `do`(onNext: ((E) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onSubscribe: (() -> ())? = nil, onSubscribed: (() -> ())? = nil, onDispose: (() -> ())? = nil)\n        -> SharedSequence<SharingStrategy, E> {\n        let source = self.asObservable()\n            .do(onNext: onNext, onCompleted: onCompleted, onSubscribe: onSubscribe, onSubscribed: onSubscribed, onDispose: onDispose)\n\n        return SharedSequence(source)\n    }\n}\n\n// MARK: debug\nextension SharedSequenceConvertibleType {\n    \n    /**\n    Prints received events for all observers on standard output.\n    \n    - parameter identifier: Identifier that is printed together with event description to standard output.\n    - returns: An observable sequence whose events are printed to standard output.\n    */\n    public func debug(_ identifier: String? = nil, trimOutput: Bool = false, file: String = #file, line: UInt = #line, function: String = #function) -> SharedSequence<SharingStrategy, E> {\n        let source = self.asObservable()\n            .debug(identifier, trimOutput: trimOutput, file: file, line: line, function: function)\n        return SharedSequence(source)\n    }\n}\n\n// MARK: distinctUntilChanged\nextension SharedSequenceConvertibleType where E: Equatable {\n    \n    /**\n    Returns an observable sequence that contains only distinct contiguous elements according to equality operator.\n    \n    - returns: An observable sequence only containing the distinct contiguous elements, based on equality operator, from the source sequence.\n    */\n    public func distinctUntilChanged()\n        -> SharedSequence<SharingStrategy, E> {\n        let source = self.asObservable()\n            .distinctUntilChanged({ $0 }, comparer: { ($0 == $1) })\n            \n        return SharedSequence(source)\n    }\n}\n\nextension SharedSequenceConvertibleType {\n    \n    /**\n    Returns an observable sequence that contains only distinct contiguous elements according to the `keySelector`.\n    \n    - parameter keySelector: A function to compute the comparison key for each element.\n    - returns: An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n    */\n    public func distinctUntilChanged<K: Equatable>(_ keySelector: @escaping (E) -> K) -> SharedSequence<SharingStrategy, E> {\n        let source = self.asObservable()\n            .distinctUntilChanged(keySelector, comparer: { $0 == $1 })\n        return SharedSequence(source)\n    }\n   \n    /**\n    Returns an observable sequence that contains only distinct contiguous elements according to the `comparer`.\n    \n    - parameter comparer: Equality comparer for computed key values.\n    - returns: An observable sequence only containing the distinct contiguous elements, based on `comparer`, from the source sequence.\n    */\n    public func distinctUntilChanged(_ comparer: @escaping (E, E) -> Bool) -> SharedSequence<SharingStrategy, E> {\n        let source = self.asObservable()\n            .distinctUntilChanged({ $0 }, comparer: comparer)\n        return SharedSequence<SharingStrategy, E>(source)\n    }\n    \n    /**\n    Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer.\n    \n    - parameter keySelector: A function to compute the comparison key for each element.\n    - parameter comparer: Equality comparer for computed key values.\n    - returns: An observable sequence only containing the distinct contiguous elements, based on a computed key value and the comparer, from the source sequence.\n    */\n    public func distinctUntilChanged<K>(_ keySelector: @escaping (E) -> K, comparer: @escaping (K, K) -> Bool) -> SharedSequence<SharingStrategy, E> {\n        let source = self.asObservable()\n            .distinctUntilChanged(keySelector, comparer: comparer)\n        return SharedSequence<SharingStrategy, E>(source)\n    }\n}\n\n\n// MARK: flatMap\nextension SharedSequenceConvertibleType {\n    \n    /**\n    Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n    \n    - parameter selector: A transform function to apply to each element.\n    - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.\n    */\n    public func flatMap<Sharing, R>(_ selector: @escaping (E) -> SharedSequence<Sharing, R>) -> SharedSequence<Sharing, R> {\n        let source = self.asObservable()\n            .flatMap(selector)\n        \n        return SharedSequence(source)\n    }\n}\n\n// MARK: merge\nextension SharedSequenceConvertibleType {\n    /**\n     Merges elements from all observable sequences from collection into a single observable sequence.\n\n     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)\n\n     - parameter sources: Collection of observable sequences to merge.\n     - returns: The observable sequence that merges the elements of the observable sequences.\n     */\n    public static func merge<C: Collection>(_ sources: C) -> SharedSequence<SharingStrategy, E>\n        where C.Iterator.Element == SharedSequence<SharingStrategy, E> {\n        let source = Observable.merge(sources.map { $0.asObservable() })\n        return SharedSequence<SharingStrategy, E>(source)\n    }\n\n    /**\n     Merges elements from all observable sequences from array into a single observable sequence.\n\n     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)\n\n     - parameter sources: Array of observable sequences to merge.\n     - returns: The observable sequence that merges the elements of the observable sequences.\n     */\n    public static func merge(_ sources: [SharedSequence<SharingStrategy, E>]) -> SharedSequence<SharingStrategy, E> {\n        let source = Observable.merge(sources.map { $0.asObservable() })\n        return SharedSequence<SharingStrategy, E>(source)\n    }\n\n    /**\n     Merges elements from all observable sequences into a single observable sequence.\n\n     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)\n\n     - parameter sources: Collection of observable sequences to merge.\n     - returns: The observable sequence that merges the elements of the observable sequences.\n     */\n    public static func merge(_ sources: SharedSequence<SharingStrategy, E>...) -> SharedSequence<SharingStrategy, E> {\n        let source = Observable.merge(sources.map { $0.asObservable() })\n        return SharedSequence<SharingStrategy, E>(source)\n    }\n    \n}\n\n// MARK: merge\nextension SharedSequenceConvertibleType where E : SharedSequenceConvertibleType {\n    /**\n    Merges elements from all observable sequences in the given enumerable sequence into a single observable sequence.\n    \n    - returns: The observable sequence that merges the elements of the observable sequences.\n    */\n    public func merge() -> SharedSequence<E.SharingStrategy, E.E> {\n        let source = self.asObservable()\n            .map { $0.asSharedSequence() }\n            .merge()\n        return SharedSequence<E.SharingStrategy, E.E>(source)\n    }\n    \n    /**\n    Merges elements from all inner observable sequences into a single observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n    \n    - parameter maxConcurrent: Maximum number of inner observable sequences being subscribed to concurrently.\n    - returns: The observable sequence that merges the elements of the inner sequences.\n    */\n    public func merge(maxConcurrent: Int)\n        -> SharedSequence<E.SharingStrategy, E.E> {\n        let source = self.asObservable()\n            .map { $0.asSharedSequence() }\n            .merge(maxConcurrent: maxConcurrent)\n        return SharedSequence<E.SharingStrategy, E.E>(source)\n    }\n}\n\n// MARK: throttle\nextension SharedSequenceConvertibleType {\n    \n    /**\n     Returns an Observable that emits the first and the latest item emitted by the source Observable during sequential time windows of a specified duration.\n\n     This operator makes sure that no two elements are emitted in less then dueTime.\n\n     - seealso: [debounce operator on reactivex.io](http://reactivex.io/documentation/operators/debounce.html)\n\n     - parameter dueTime: Throttling duration for each element.\n     - parameter latest: Should latest element received in a dueTime wide time window since last element emission be emitted.\n     - returns: The throttled sequence.\n    */\n    public func throttle(_ dueTime: RxTimeInterval, latest: Bool = true)\n        -> SharedSequence<SharingStrategy, E> {\n        let source = self.asObservable()\n            .throttle(dueTime, latest: latest, scheduler: SharingStrategy.scheduler)\n\n        return SharedSequence(source)\n    }\n\n    /**\n    Ignores elements from an observable sequence which are followed by another element within a specified relative time duration, using the specified scheduler to run throttling timers.\n    \n    - parameter dueTime: Throttling duration for each element.\n    - returns: The throttled sequence.\n    */\n    public func debounce(_ dueTime: RxTimeInterval)\n        -> SharedSequence<SharingStrategy, E> {\n        let source = self.asObservable()\n            .debounce(dueTime, scheduler: SharingStrategy.scheduler)\n\n        return SharedSequence(source)\n    }\n}\n\n// MARK: scan\nextension SharedSequenceConvertibleType {\n    /**\n    Applies an accumulator function over an observable sequence and returns each intermediate result. The specified seed value is used as the initial accumulator value.\n    \n    For aggregation behavior with no intermediate results, see `reduce`.\n    \n    - parameter seed: The initial accumulator value.\n    - parameter accumulator: An accumulator function to be invoked on each element.\n    - returns: An observable sequence containing the accumulated values.\n    */\n    public func scan<A>(_ seed: A, accumulator: @escaping (A, E) -> A)\n        -> SharedSequence<SharingStrategy, A> {\n        let source = self.asObservable()\n            .scan(seed, accumulator: accumulator)\n        return SharedSequence<SharingStrategy, A>(source)\n    }\n}\n\n// MARK: concat\n\nextension SharedSequence {\n    /**\n     Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully.\n\n     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.\n     */\n    public static func concat<S: Sequence>(_ sequence: S) -> SharedSequence<SharingStrategy, Element>\n        where S.Iterator.Element == SharedSequence<SharingStrategy, Element> {\n            let source = Observable.concat(sequence.lazy.map { $0.asObservable() })\n            return SharedSequence<SharingStrategy, Element>(source)\n    }\n\n    /**\n     Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully.\n\n     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.\n     */\n    public static func concat<C: Collection>(_ collection: C) -> SharedSequence<SharingStrategy, Element>\n        where C.Iterator.Element == SharedSequence<SharingStrategy, Element> {\n        let source = Observable.concat(collection.map { $0.asObservable() })\n        return SharedSequence<SharingStrategy, Element>(source)\n    }\n}\n\n// MARK: zip\n\nextension SharedSequence {\n    /**\n     Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n     - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n     - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n     */\n    public static func zip<C: Collection, R>(_ collection: C, _ resultSelector: @escaping ([Element]) throws -> R) -> SharedSequence<SharingStrategy, R>\n        where C.Iterator.Element == SharedSequence<SharingStrategy, Element> {\n        let source = Observable.zip(collection.map { $0.asSharedSequence().asObservable() }, resultSelector)\n        return SharedSequence<SharingStrategy, R>(source)\n    }\n\n    /**\n     Merges the specified observable sequences into one observable sequence all of the observable sequences have produced an element at a corresponding index.\n\n     - returns: An observable sequence containing the result of combining elements of the sources.\n     */\n    public static func zip<C: Collection>(_ collection: C) -> SharedSequence<SharingStrategy, [Element]>\n        where C.Iterator.Element == SharedSequence<SharingStrategy, Element> {\n            let source = Observable.zip(collection.map { $0.asSharedSequence().asObservable() })\n            return SharedSequence<SharingStrategy, [Element]>(source)\n    }\n}\n\n// MARK: combineLatest\n\nextension SharedSequence {\n    /**\n     Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n     - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n     - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n     */\n    public static func combineLatest<C: Collection, R>(_ collection: C, _ resultSelector: @escaping ([Element]) throws -> R) -> SharedSequence<SharingStrategy, R>\n        where C.Iterator.Element == SharedSequence<SharingStrategy, Element> {\n        let source = Observable.combineLatest(collection.map { $0.asObservable() }, resultSelector)\n        return SharedSequence<SharingStrategy, R>(source)\n    }\n\n    /**\n     Merges the specified observable sequences into one observable sequence whenever any of the observable sequences produces an element.\n\n     - returns: An observable sequence containing the result of combining elements of the sources.\n     */\n    public static func combineLatest<C: Collection>(_ collection: C) -> SharedSequence<SharingStrategy, [Element]>\n        where C.Iterator.Element == SharedSequence<SharingStrategy, Element> {\n        let source = Observable.combineLatest(collection.map { $0.asObservable() })\n        return SharedSequence<SharingStrategy, [Element]>(source)\n    }\n}\n\n// MARK: withLatestFrom\nextension SharedSequenceConvertibleType {\n\n    /**\n    Merges two observable sequences into one observable sequence by combining each element from self with the latest element from the second source, if any.\n\n    - parameter second: Second observable source.\n    - parameter resultSelector: Function to invoke for each element from the self combined with the latest element from the second source, if any.\n    - returns: An observable sequence containing the result of combining each element of the self  with the latest element from the second source, if any, using the specified result selector function.\n    */\n    public func withLatestFrom<SecondO: SharedSequenceConvertibleType, ResultType>(_ second: SecondO, resultSelector: @escaping (E, SecondO.E) -> ResultType) -> SharedSequence<SharingStrategy, ResultType> where SecondO.SharingStrategy == SharingStrategy {\n        let source = self.asObservable()\n            .withLatestFrom(second.asSharedSequence(), resultSelector: resultSelector)\n\n        return SharedSequence<SharingStrategy, ResultType>(source)\n    }\n\n    /**\n    Merges two observable sequences into one observable sequence by using latest element from the second sequence every time when `self` emits an element.\n\n    - parameter second: Second observable source.\n    - returns: An observable sequence containing the result of combining each element of the self  with the latest element from the second source, if any, using the specified result selector function.\n    */\n    public func withLatestFrom<SecondO: SharedSequenceConvertibleType>(_ second: SecondO) -> SharedSequence<SharingStrategy, SecondO.E> {\n        let source = self.asObservable()\n            .withLatestFrom(second.asSharedSequence())\n\n        return SharedSequence<SharingStrategy, SecondO.E>(source)\n    }\n}\n\n// MARK: skip\nextension SharedSequenceConvertibleType {\n\n    /**\n     Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n\n     - seealso: [skip operator on reactivex.io](http://reactivex.io/documentation/operators/skip.html)\n\n     - parameter count: The number of elements to skip before returning the remaining elements.\n     - returns: An observable sequence that contains the elements that occur after the specified index in the input sequence.\n     */\n    public func skip(_ count: Int)\n        -> SharedSequence<SharingStrategy, E> {\n        let source = self.asObservable()\n            .skip(count)\n        return SharedSequence(source)\n    }\n}\n\n// MARK: startWith\nextension SharedSequenceConvertibleType {\n    \n    /**\n    Prepends a value to an observable sequence.\n\n    - seealso: [startWith operator on reactivex.io](http://reactivex.io/documentation/operators/startwith.html)\n    \n    - parameter element: Element to prepend to the specified sequence.\n    - returns: The source sequence prepended with the specified values.\n    */\n    public func startWith(_ element: E)\n        -> SharedSequence<SharingStrategy, E> {\n        let source = self.asObservable()\n                .startWith(element)\n\n        return SharedSequence(source)\n    }\n}\n\n// MARK: delay\nextension SharedSequenceConvertibleType {\n\n    /**\n     Returns an observable sequence by the source observable sequence shifted forward in time by a specified delay. Error events from the source observable sequence are not delayed.\n\n     - seealso: [delay operator on reactivex.io](http://reactivex.io/documentation/operators/delay.html)\n\n     - parameter dueTime: Relative time shift of the source by.\n     - parameter scheduler: Scheduler to run the subscription delay timer on.\n     - returns: the source Observable shifted in time by the specified delay.\n     */\n    public func delay(_ dueTime: RxTimeInterval)\n        -> SharedSequence<SharingStrategy, E> {\n        let source = self.asObservable()\n            .delay(dueTime, scheduler: SharingStrategy.scheduler)\n\n        return SharedSequence(source)\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/SharedSequence/SharedSequence.swift",
    "content": "//\n//  SharedSequence.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 8/27/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n\n/**\n    Trait that represents observable sequence that shares computation resources with following properties:\n\n    - it never fails\n    - it delivers events on `SharingStrategy.scheduler`\n    - sharing strategy is customizable using `SharingStrategy.share` behavior\n\n    `SharedSequence<Element>` can be considered a builder pattern for observable sequences that share computation resources.\n\n    To find out more about units and how to use them, please visit `Documentation/Traits.md`.\n*/\npublic struct SharedSequence<S: SharingStrategyProtocol, Element> : SharedSequenceConvertibleType {\n    public typealias E = Element\n    public typealias SharingStrategy = S\n\n    let _source: Observable<E>\n\n    init(_ source: Observable<E>) {\n        self._source = S.share(source)\n    }\n\n    init(raw: Observable<E>) {\n        self._source = raw\n    }\n\n    #if EXPANDABLE_SHARED_SEQUENCE\n    /**\n     This method is extension hook in case this unit needs to extended from outside the library.\n     \n     By defining `EXPANDABLE_SHARED_SEQUENCE` one agrees that it's up to him to ensure shared sequence\n     properties are preserved after extension.\n    */\n    public static func createUnsafe<O: ObservableType>(source: O) -> SharedSequence<S, O.E> {\n        return SharedSequence<S, O.E>(raw: source.asObservable())\n    }\n    #endif\n\n    /**\n    - returns: Built observable sequence.\n    */\n    public func asObservable() -> Observable<E> {\n        return _source\n    }\n\n    /**\n    - returns: `self`\n    */\n    public func asSharedSequence() -> SharedSequence<SharingStrategy, E> {\n        return self\n    }\n}\n\n/**\n Different `SharedSequence` sharing strategies must conform to this protocol.\n */\npublic protocol SharingStrategyProtocol {\n    /**\n     Scheduled on which all sequence events will be delivered.\n    */\n    static var scheduler: SchedulerType { get }\n\n    /**\n     Computation resources sharing strategy for multiple sequence observers.\n     \n     E.g. One can choose `share(replay:scope:)`\n     as sequence event sharing strategies, but also do something more exotic, like\n     implementing promises or lazy loading chains.\n    */\n    static func share<E>(_ source: Observable<E>) -> Observable<E>\n}\n\n/**\nA type that can be converted to `SharedSequence`.\n*/\npublic protocol SharedSequenceConvertibleType : ObservableConvertibleType {\n    associatedtype SharingStrategy: SharingStrategyProtocol\n\n    /**\n    Converts self to `SharedSequence`.\n    */\n    func asSharedSequence() -> SharedSequence<SharingStrategy, E>\n}\n\nextension SharedSequenceConvertibleType {\n    public func asObservable() -> Observable<E> {\n        return asSharedSequence().asObservable()\n    }\n}\n\n\nextension SharedSequence {\n\n    /**\n    Returns an empty observable sequence, using the specified scheduler to send out the single `Completed` message.\n\n    - returns: An observable sequence with no elements.\n    */\n    public static func empty() -> SharedSequence<S, E> {\n        return SharedSequence(raw: Observable.empty().subscribeOn(S.scheduler))\n    }\n\n    /**\n    Returns a non-terminating observable sequence, which can be used to denote an infinite duration.\n\n    - returns: An observable sequence whose observers will never get called.\n    */\n    public static func never() -> SharedSequence<S, E> {\n        return SharedSequence(raw: Observable.never())\n    }\n\n    /**\n    Returns an observable sequence that contains a single element.\n\n    - parameter element: Single element in the resulting observable sequence.\n    - returns: An observable sequence containing the single specified element.\n    */\n    public static func just(_ element: E) -> SharedSequence<S, E> {\n        return SharedSequence(raw: Observable.just(element).subscribeOn(S.scheduler))\n    }\n\n    /**\n     Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n\n     - parameter observableFactory: Observable factory function to invoke for each observer that subscribes to the resulting sequence.\n     - returns: An observable sequence whose observers trigger an invocation of the given observable factory function.\n     */\n    public static func deferred(_ observableFactory: @escaping () -> SharedSequence<S, E>)\n        -> SharedSequence<S, E> {\n        return SharedSequence(Observable.deferred { observableFactory().asObservable() })\n    }\n\n    /**\n    This method creates a new Observable instance with a variable number of elements.\n\n    - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)\n\n    - parameter elements: Elements to generate.\n    - returns: The observable sequence whose elements are pulled from the given arguments.\n    */\n    public static func of(_ elements: E ...) -> SharedSequence<S, E> {\n        let source = Observable.from(elements, scheduler: S.scheduler)\n        return SharedSequence(raw: source)\n    }\n}\n\nextension SharedSequence {\n    \n    /**\n    This method converts an array to an observable sequence.\n     \n    - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)\n     \n    - returns: The observable sequence whose elements are pulled from the given enumerable sequence.\n     */\n    public static func from(_ array: [E]) -> SharedSequence<S, E> {\n        let source = Observable.from(array, scheduler: S.scheduler)\n        return SharedSequence(raw: source)\n    }\n    \n    /**\n     This method converts a sequence to an observable sequence.\n     \n     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)\n     \n     - returns: The observable sequence whose elements are pulled from the given enumerable sequence.\n    */\n    public static func from<S: Sequence>(_ sequence: S) -> SharedSequence<SharingStrategy, E> where S.Iterator.Element == E {\n        let source = Observable.from(sequence, scheduler: SharingStrategy.scheduler)\n        return SharedSequence(raw: source)\n    }\n    \n    /**\n     This method converts a optional to an observable sequence.\n     \n     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)\n     \n     - parameter optional: Optional element in the resulting observable sequence.\n     \n     - returns: An observable sequence containing the wrapped value or not from given optional.\n     */\n    public static func from(optional: E?) -> SharedSequence<S, E> {\n        let source = Observable.from(optional: optional, scheduler: S.scheduler)\n        return SharedSequence(raw: source)\n    }\n}\n\nextension SharedSequence where Element : RxAbstractInteger {\n    /**\n     Returns an observable sequence that produces a value after each period, using the specified scheduler to run timers and to send out observer messages.\n\n     - seealso: [interval operator on reactivex.io](http://reactivex.io/documentation/operators/interval.html)\n\n     - parameter period: Period for producing the values in the resulting sequence.\n     - returns: An observable sequence that produces a value after each period.\n     */\n    public static func interval(_ period: RxTimeInterval)\n        -> SharedSequence<S, E> {\n        return SharedSequence(Observable.interval(period, scheduler: S.scheduler))\n    }\n}\n\n// MARK: timer\n\nextension SharedSequence where Element: RxAbstractInteger {\n    /**\n     Returns an observable sequence that periodically produces a value after the specified initial relative due time has elapsed, using the specified scheduler to run timers.\n\n     - seealso: [timer operator on reactivex.io](http://reactivex.io/documentation/operators/timer.html)\n\n     - parameter dueTime: Relative time at which to produce the first value.\n     - parameter period: Period to produce subsequent values.\n     - returns: An observable sequence that produces a value after due time has elapsed and then each period.\n     */\n    public static func timer(_ dueTime: RxTimeInterval, period: RxTimeInterval)\n        -> SharedSequence<S, E> {\n        return SharedSequence(Observable.timer(dueTime, period: period, scheduler: S.scheduler))\n    }\n}\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/Signal/ObservableConvertibleType+Signal.swift",
    "content": "//\n//  ObservableConvertibleType+Signal.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 9/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n\nextension ObservableConvertibleType {\n    /**\n     Converts observable sequence to `Signal` trait.\n\n     - parameter onErrorJustReturn: Element to return in case of error and after that complete the sequence.\n     - returns: Signal trait.\n     */\n    public func asSignal(onErrorJustReturn: E) -> Signal<E> {\n        let source = self\n            .asObservable()\n            .observeOn(SignalSharingStrategy.scheduler)\n            .catchErrorJustReturn(onErrorJustReturn)\n        return Signal(source)\n    }\n\n    /**\n     Converts observable sequence to `Driver` trait.\n\n     - parameter onErrorDriveWith: Driver that continues to drive the sequence in case of error.\n     - returns: Signal trait.\n     */\n    public func asSignal(onErrorSignalWith: Signal<E>) -> Signal<E> {\n        let source = self\n            .asObservable()\n            .observeOn(SignalSharingStrategy.scheduler)\n            .catchError { _ in\n                onErrorSignalWith.asObservable()\n            }\n        return Signal(source)\n    }\n\n    /**\n     Converts observable sequence to `Driver` trait.\n\n     - parameter onErrorRecover: Calculates driver that continues to drive the sequence in case of error.\n     - returns: Signal trait.\n     */\n    public func asSignal(onErrorRecover: @escaping (_ error: Swift.Error) -> Signal<E>) -> Signal<E> {\n        let source = self\n            .asObservable()\n            .observeOn(SignalSharingStrategy.scheduler)\n            .catchError { error in\n                onErrorRecover(error).asObservable()\n            }\n        return Signal(source)\n    }\n}\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/Signal/PublishRelay+Signal.swift",
    "content": "//\n//  PublishRelay+Signal.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 12/28/15.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n\nextension PublishRelay {\n    /// Converts `PublishRelay` to `Signal`.\n    ///\n    /// - returns: Observable sequence.\n    public func asSignal() -> Signal<Element> {\n        let source = self.asObservable()\n            .observeOn(SignalSharingStrategy.scheduler)\n        return SharedSequence(source)\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/Signal/Signal+Subscription.swift",
    "content": "//\n//  Signal+Subscription.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 9/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n\nextension SharedSequenceConvertibleType where SharingStrategy == SignalSharingStrategy {\n    /**\n     Creates new subscription and sends elements to observer.\n\n     In this form it's equivalent to `subscribe` method, but it communicates intent better.\n\n     - parameter to: Observer that receives events.\n     - returns: Disposable object that can be used to unsubscribe the observer from the subject.\n     */\n    public func emit<O: ObserverType>(to observer: O) -> Disposable where O.E == E {\n        return self.asSharedSequence().asObservable().subscribe(observer)\n    }\n\n    /**\n     Creates new subscription and sends elements to observer.\n\n     In this form it's equivalent to `subscribe` method, but it communicates intent better.\n\n     - parameter to: Observer that receives events.\n     - returns: Disposable object that can be used to unsubscribe the observer from the subject.\n     */\n    public func emit<O: ObserverType>(to observer: O) -> Disposable where O.E == E? {\n        return self.asSharedSequence().asObservable().map { $0 as E? }.subscribe(observer)\n    }\n\n    /**\n     Creates new subscription and sends elements to variable.\n\n     - parameter relay: Target relay for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer from the variable.\n     */\n    public func emit(to relay: PublishRelay<E>) -> Disposable {\n        return emit(onNext: { e in\n            relay.accept(e)\n        })\n    }\n\n    /**\n     Creates new subscription and sends elements to variable.\n\n     - parameter to: Target relay for sequence elements.\n     - returns: Disposable object that can be used to unsubscribe the observer from the variable.\n     */\n    public func emit(to relay: PublishRelay<E?>) -> Disposable {\n        return emit(onNext: { e in\n            relay.accept(e)\n        })\n    }\n\n    /**\n     Subscribes an element handler, a completion handler and disposed handler to an observable sequence.\n\n     Error callback is not exposed because `Signal` can't error out.\n\n     - parameter onNext: Action to invoke for each element in the observable sequence.\n     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.\n     gracefully completed, errored, or if the generation is canceled by disposing subscription)\n     - parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has\n     gracefully completed, errored, or if the generation is canceled by disposing subscription)\n     - returns: Subscription object used to unsubscribe from the observable sequence.\n     */\n    public func emit(onNext: ((E) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onDisposed: (() -> Void)? = nil) -> Disposable {\n        return self.asObservable().subscribe(onNext: onNext, onCompleted: onCompleted, onDisposed: onDisposed)\n    }\n}\n\n\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/Traits/Signal/Signal.swift",
    "content": "//\n//  Signal.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 9/26/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n\n/**\n Trait that represents observable sequence with following properties:\n \n - it never fails\n - it delivers events on `MainScheduler.instance`\n - `share(scope: .whileConnected)` sharing strategy\n\n Additional explanation:\n - all observers share sequence computation resources\n - there is no replaying of sequence elements on new observer subscription\n - computation of elements is reference counted with respect to the number of observers\n - if there are no subscribers, it will release sequence computation resources\n\n In case trait that models state propagation is required, please check `Driver`.\n\n `Signal<Element>` can be considered a builder pattern for observable sequences that model imperative events part of the application.\n \n To find out more about units and how to use them, please visit `Documentation/Traits.md`.\n */\npublic typealias Signal<E> = SharedSequence<SignalSharingStrategy, E>\n\npublic struct SignalSharingStrategy : SharingStrategyProtocol {\n    public static var scheduler: SchedulerType { return SharingScheduler.make() }\n    \n    public static func share<E>(_ source: Observable<E>) -> Observable<E> {\n        return source.share(scope: .whileConnected)\n    }\n}\n\nextension SharedSequenceConvertibleType where SharingStrategy == SignalSharingStrategy {\n    /// Adds `asPublisher` to `SharingSequence` with `PublishSharingStrategy`.\n    public func asSignal() -> Signal<E> {\n        return asSharedSequence()\n    }\n}\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/DataSources/RxCollectionViewReactiveArrayDataSource.swift",
    "content": "//\n//  RxCollectionViewReactiveArrayDataSource.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 6/29/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\n// objc monkey business\nclass _RxCollectionViewReactiveArrayDataSource\n    : NSObject\n    , UICollectionViewDataSource {\n    \n    @objc(numberOfSectionsInCollectionView:)\n    func numberOfSections(in: UICollectionView) -> Int {\n        return 1\n    }\n\n    func _collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {\n        return 0\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {\n        return _collectionView(collectionView, numberOfItemsInSection: section)\n    }\n\n    fileprivate func _collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {\n        rxAbstractMethod()\n    }\n\n    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {\n        return _collectionView(collectionView, cellForItemAt: indexPath)\n    }\n}\n\nclass RxCollectionViewReactiveArrayDataSourceSequenceWrapper<S: Sequence>\n    : RxCollectionViewReactiveArrayDataSource<S.Iterator.Element>\n    , RxCollectionViewDataSourceType {\n    typealias Element = S\n\n    override init(cellFactory: @escaping CellFactory) {\n        super.init(cellFactory: cellFactory)\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, observedEvent: Event<S>) {\n        Binder(self) { collectionViewDataSource, sectionModels in\n            let sections = Array(sectionModels)\n            collectionViewDataSource.collectionView(collectionView, observedElements: sections)\n        }.on(observedEvent)\n    }\n}\n\n\n// Please take a look at `DelegateProxyType.swift`\nclass RxCollectionViewReactiveArrayDataSource<Element>\n    : _RxCollectionViewReactiveArrayDataSource\n    , SectionedViewDataSourceType {\n    \n    typealias CellFactory = (UICollectionView, Int, Element) -> UICollectionViewCell\n    \n    var itemModels: [Element]? = nil\n    \n    func modelAtIndex(_ index: Int) -> Element? {\n        return itemModels?[index]\n    }\n\n    func model(at indexPath: IndexPath) throws -> Any {\n        precondition(indexPath.section == 0)\n        guard let item = itemModels?[indexPath.item] else {\n            throw RxCocoaError.itemsNotYetBound(object: self)\n        }\n        return item\n    }\n    \n    var cellFactory: CellFactory\n    \n    init(cellFactory: @escaping CellFactory) {\n        self.cellFactory = cellFactory\n    }\n    \n    // data source\n    \n    override func _collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {\n        return itemModels?.count ?? 0\n    }\n    \n    override func _collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {\n        return cellFactory(collectionView, indexPath.item, itemModels![indexPath.item])\n    }\n    \n    // reactive\n    \n    func collectionView(_ collectionView: UICollectionView, observedElements: [Element]) {\n        self.itemModels = observedElements\n        \n        collectionView.reloadData()\n\n        // workaround for http://stackoverflow.com/questions/39867325/ios-10-bug-uicollectionview-received-layout-attributes-for-a-cell-with-an-index\n        collectionView.collectionViewLayout.invalidateLayout()\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/DataSources/RxPickerViewAdapter.swift",
    "content": "//\n//  RxPickerViewAdapter.swift\n//  RxCocoa\n//\n//  Created by Sergey Shulga on 12/07/2017.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n    import UIKit\n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n\nclass RxPickerViewArrayDataSource<T>: NSObject, UIPickerViewDataSource, SectionedViewDataSourceType {\n    fileprivate var items: [T] = []\n    \n    func model(at indexPath: IndexPath) throws -> Any {\n        guard items.indices ~= indexPath.row else {\n            throw RxCocoaError.itemsNotYetBound(object: self)\n        }\n        return items[indexPath.row]\n    }\n\n    func numberOfComponents(in pickerView: UIPickerView) -> Int {\n        return 1\n    }\n    \n    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {\n        return items.count\n    }\n}\n\nclass RxPickerViewSequenceDataSource<S: Sequence>\n    : RxPickerViewArrayDataSource<S.Iterator.Element>\n    , RxPickerViewDataSourceType {\n    typealias Element = S\n\n    func pickerView(_ pickerView: UIPickerView, observedEvent: Event<S>) {\n        Binder(self) { dataSource, items in\n            dataSource.items = items\n            pickerView.reloadAllComponents()\n        }\n        .on(observedEvent.map(Array.init))\n    }\n}\n\nfinal class RxStringPickerViewAdapter<S: Sequence>\n    : RxPickerViewSequenceDataSource<S>\n    , UIPickerViewDelegate {\n    \n    typealias TitleForRow = (Int, S.Iterator.Element) -> String?\n    private let titleForRow: TitleForRow\n    \n    init(titleForRow: @escaping TitleForRow) {\n        self.titleForRow = titleForRow\n        super.init()\n    }\n    \n    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {\n        return titleForRow(row, items[row])\n    }\n}\n\nfinal class RxAttributedStringPickerViewAdapter<S: Sequence>: RxPickerViewSequenceDataSource<S>, UIPickerViewDelegate {\n    typealias AttributedTitleForRow = (Int, S.Iterator.Element) -> NSAttributedString?\n    private let attributedTitleForRow: AttributedTitleForRow\n    \n    init(attributedTitleForRow: @escaping AttributedTitleForRow) {\n        self.attributedTitleForRow = attributedTitleForRow\n        super.init()\n    }\n    \n    func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {\n        return attributedTitleForRow(row, items[row])\n    }\n}\n\nfinal class RxPickerViewAdapter<S: Sequence>: RxPickerViewSequenceDataSource<S>, UIPickerViewDelegate {\n    typealias ViewForRow = (Int, S.Iterator.Element, UIView?) -> UIView\n    private let viewForRow: ViewForRow\n    \n    init(viewForRow: @escaping ViewForRow) {\n        self.viewForRow = viewForRow\n        super.init()\n    }\n    \n    func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {\n        return viewForRow(row, items[row], view)\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/DataSources/RxTableViewReactiveArrayDataSource.swift",
    "content": "//\n//  RxTableViewReactiveArrayDataSource.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 6/26/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\n// objc monkey business\nclass _RxTableViewReactiveArrayDataSource\n    : NSObject\n    , UITableViewDataSource {\n    \n    func numberOfSections(in tableView: UITableView) -> Int {\n        return 1\n    }\n   \n    func _tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return 0\n    }\n    \n    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return _tableView(tableView, numberOfRowsInSection: section)\n    }\n\n    fileprivate func _tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        rxAbstractMethod()\n    }\n\n    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        return _tableView(tableView, cellForRowAt: indexPath)\n    }\n}\n\n\nclass RxTableViewReactiveArrayDataSourceSequenceWrapper<S: Sequence>\n    : RxTableViewReactiveArrayDataSource<S.Iterator.Element>\n    , RxTableViewDataSourceType {\n    typealias Element = S\n\n    override init(cellFactory: @escaping CellFactory) {\n        super.init(cellFactory: cellFactory)\n    }\n\n    func tableView(_ tableView: UITableView, observedEvent: Event<S>) {\n        Binder(self) { tableViewDataSource, sectionModels in\n            let sections = Array(sectionModels)\n            tableViewDataSource.tableView(tableView, observedElements: sections)\n        }.on(observedEvent)\n    }\n}\n\n// Please take a look at `DelegateProxyType.swift`\nclass RxTableViewReactiveArrayDataSource<Element>\n    : _RxTableViewReactiveArrayDataSource\n    , SectionedViewDataSourceType {\n    typealias CellFactory = (UITableView, Int, Element) -> UITableViewCell\n    \n    var itemModels: [Element]? = nil\n    \n    func modelAtIndex(_ index: Int) -> Element? {\n        return itemModels?[index]\n    }\n\n    func model(at indexPath: IndexPath) throws -> Any {\n        precondition(indexPath.section == 0)\n        guard let item = itemModels?[indexPath.item] else {\n            throw RxCocoaError.itemsNotYetBound(object: self)\n        }\n        return item\n    }\n\n    let cellFactory: CellFactory\n    \n    init(cellFactory: @escaping CellFactory) {\n        self.cellFactory = cellFactory\n    }\n    \n    override func _tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return itemModels?.count ?? 0\n    }\n    \n    override func _tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        return cellFactory(tableView, indexPath.item, itemModels![indexPath.row])\n    }\n    \n    // reactive\n    \n    func tableView(_ tableView: UITableView, observedElements: [Element]) {\n        self.itemModels = observedElements\n        \n        tableView.reloadData()\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Events/ItemEvents.swift",
    "content": "//\n//  ItemEvents.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 6/20/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\nimport UIKit\n\npublic typealias ItemMovedEvent = (sourceIndex: IndexPath, destinationIndex: IndexPath)\npublic typealias WillDisplayCellEvent = (cell: UITableViewCell, indexPath: IndexPath)\npublic typealias DidEndDisplayingCellEvent = (cell: UITableViewCell, indexPath: IndexPath)\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/NSTextStorage+Rx.swift",
    "content": "//\n//  NSTextStorage+Rx.swift\n//  RxCocoa\n//\n//  Created by Segii Shulga on 12/30/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n    import UIKit\n    \n    extension Reactive where Base: NSTextStorage {\n\n        /// Reactive wrapper for `delegate`.\n        ///\n        /// For more information take a look at `DelegateProxyType` protocol documentation.\n        public var delegate: DelegateProxy<NSTextStorage, NSTextStorageDelegate> {\n            return RxTextStorageDelegateProxy.proxy(for: base)\n        }\n\n        /// Reactive wrapper for `delegate` message.\n        public var didProcessEditingRangeChangeInLength: Observable<(editedMask:NSTextStorageEditActions, editedRange:NSRange, delta:Int)> {\n            return delegate\n                .methodInvoked(#selector(NSTextStorageDelegate.textStorage(_:didProcessEditing:range:changeInLength:)))\n                .map { a in\n                    let editedMask = NSTextStorageEditActions(rawValue: try castOrThrow(UInt.self, a[1]) )\n                    let editedRange = try castOrThrow(NSValue.self, a[2]).rangeValue\n                    let delta = try castOrThrow(Int.self, a[3])\n                    \n                    return (editedMask, editedRange, delta)\n                }\n        }\n    }\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Protocols/RxCollectionViewDataSourceType.swift",
    "content": "//\n//  RxCollectionViewDataSourceType.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 6/29/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\n/// Marks data source as `UICollectionView` reactive data source enabling it to be used with one of the `bindTo` methods.\npublic protocol RxCollectionViewDataSourceType /*: UICollectionViewDataSource*/ {\n    \n    /// Type of elements that can be bound to collection view.\n    associatedtype Element\n    \n    /// New observable sequence event observed.\n    ///\n    /// - parameter collectionView: Bound collection view.\n    /// - parameter observedEvent: Event\n    func collectionView(_ collectionView: UICollectionView, observedEvent: Event<Element>) -> Void\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Protocols/RxPickerViewDataSourceType.swift",
    "content": "//\n//  RxPickerViewDataSourceType.swift\n//  RxCocoa\n//\n//  Created by Sergey Shulga on 05/07/2017.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n    \n    import UIKit\n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n\n/// Marks data source as `UIPickerView` reactive data source enabling it to be used with one of the `bindTo` methods.\npublic protocol RxPickerViewDataSourceType {\n    /// Type of elements that can be bound to picker view.\n    associatedtype Element\n    \n    /// New observable sequence event observed.\n    ///\n    /// - parameter pickerView: Bound picker view.\n    /// - parameter observedEvent: Event\n    func pickerView(_ pickerView: UIPickerView, observedEvent: Event<Element>)\n}\n    \n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Protocols/RxTableViewDataSourceType.swift",
    "content": "//\n//  RxTableViewDataSourceType.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 6/26/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\n/// Marks data source as `UITableView` reactive data source enabling it to be used with one of the `bindTo` methods.\npublic protocol RxTableViewDataSourceType /*: UITableViewDataSource*/ {\n    \n    /// Type of elements that can be bound to table view.\n    associatedtype Element\n    \n    /// New observable sequence event observed.\n    ///\n    /// - parameter tableView: Bound table view.\n    /// - parameter observedEvent: Event\n    func tableView(_ tableView: UITableView, observedEvent: Event<Element>) -> Void\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxCollectionViewDataSourceProxy.swift",
    "content": "//\n//  RxCollectionViewDataSourceProxy.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 6/29/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\nextension UICollectionView: HasDataSource {\n    public typealias DataSource = UICollectionViewDataSource\n}\n\nlet collectionViewDataSourceNotSet = CollectionViewDataSourceNotSet()\n\nfinal class CollectionViewDataSourceNotSet\n    : NSObject\n    , UICollectionViewDataSource {\n\n\n    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {\n        return 0\n    }\n    \n    // The cell that is returned must be retrieved from a call to -dequeueReusableCellWithReuseIdentifier:forIndexPath:\n    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {\n        rxAbstractMethod(message: dataSourceNotSet)\n    }\n    \n}\n\n/// For more information take a look at `DelegateProxyType`.\nopen class RxCollectionViewDataSourceProxy\n    : DelegateProxy<UICollectionView, UICollectionViewDataSource>\n    , DelegateProxyType \n    , UICollectionViewDataSource {\n\n    /// Typed parent object.\n    public weak private(set) var collectionView: UICollectionView?\n\n    /// - parameter collectionView: Parent object for delegate proxy.\n    public init(collectionView: ParentObject) {\n        self.collectionView = collectionView\n        super.init(parentObject: collectionView, delegateProxy: RxCollectionViewDataSourceProxy.self)\n    }\n\n    // Register known implementations\n    public static func registerKnownImplementations() {\n        self.register { RxCollectionViewDataSourceProxy(collectionView: $0) }\n    }\n\n    private weak var _requiredMethodsDataSource: UICollectionViewDataSource? = collectionViewDataSourceNotSet\n\n    // MARK: delegate\n\n    /// Required delegate method implementation.\n    public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {\n        return (_requiredMethodsDataSource ?? collectionViewDataSourceNotSet).collectionView(collectionView, numberOfItemsInSection: section)\n    }\n    \n    /// Required delegate method implementation.\n    public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {\n        return (_requiredMethodsDataSource ?? collectionViewDataSourceNotSet).collectionView(collectionView, cellForItemAt: indexPath)\n    }\n\n    /// For more information take a look at `DelegateProxyType`.\n    open override func setForwardToDelegate(_ forwardToDelegate: UICollectionViewDataSource?, retainDelegate: Bool) {\n        _requiredMethodsDataSource = forwardToDelegate ?? collectionViewDataSourceNotSet\n        super.setForwardToDelegate(forwardToDelegate, retainDelegate: retainDelegate)\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxCollectionViewDelegateProxy.swift",
    "content": "//\n//  RxCollectionViewDelegateProxy.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 6/29/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\n/// For more information take a look at `DelegateProxyType`.\nopen class RxCollectionViewDelegateProxy\n    : RxScrollViewDelegateProxy\n    , UICollectionViewDelegate\n    , UICollectionViewDelegateFlowLayout {\n\n    /// Typed parent object.\n    public weak private(set) var collectionView: UICollectionView?\n\n    /// Initializes `RxCollectionViewDelegateProxy`\n    ///\n    /// - parameter collectionView: Parent object for delegate proxy.\n    public init(collectionView: UICollectionView) {\n        self.collectionView = collectionView\n        super.init(scrollView: collectionView)\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxNavigationControllerDelegateProxy.swift",
    "content": "//\n//  RxNavigationControllerDelegateProxy.swift\n//  RxCocoa\n//\n//  Created by Diogo on 13/04/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\n    import UIKit\n    #if !RX_NO_MODULE\n        import RxSwift\n    #endif\n\n    extension UINavigationController: HasDelegate {\n        public typealias Delegate = UINavigationControllerDelegate\n    }\n\n    /// For more information take a look at `DelegateProxyType`.\n    open class RxNavigationControllerDelegateProxy\n        : DelegateProxy<UINavigationController, UINavigationControllerDelegate>\n        , DelegateProxyType \n        , UINavigationControllerDelegate {\n\n        /// Typed parent object.\n        public weak private(set) var navigationController: UINavigationController?\n\n        /// - parameter navigationController: Parent object for delegate proxy.\n        public init(navigationController: ParentObject) {\n            self.navigationController = navigationController\n            super.init(parentObject: navigationController, delegateProxy: RxNavigationControllerDelegateProxy.self)\n        }\n\n        // Register known implementations\n        public static func registerKnownImplementations() {\n            self.register { RxNavigationControllerDelegateProxy(navigationController: $0) }\n        }\n    }\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxPickerViewDataSourceProxy.swift",
    "content": "//\n//  RxPickerViewDataSourceProxy.swift\n//  RxCocoa\n//\n//  Created by Sergey Shulga on 05/07/2017.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n\n    import UIKit\n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n\nextension UIPickerView: HasDataSource {\n    public typealias DataSource = UIPickerViewDataSource\n}\n\nfileprivate let pickerViewDataSourceNotSet = PickerViewDataSourceNotSet()\n\nfinal fileprivate class PickerViewDataSourceNotSet: NSObject, UIPickerViewDataSource {\n    func numberOfComponents(in pickerView: UIPickerView) -> Int {\n        return 0\n    }\n    \n    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {\n        return 0\n    }\n}\n\n/// For more information take a look at `DelegateProxyType`.\npublic class RxPickerViewDataSourceProxy\n    : DelegateProxy<UIPickerView, UIPickerViewDataSource>\n    , DelegateProxyType\n    , UIPickerViewDataSource {\n\n    /// Typed parent object.\n    public weak private(set) var pickerView: UIPickerView?\n\n    /// - parameter pickerView: Parent object for delegate proxy.\n    public init(pickerView: ParentObject) {\n        self.pickerView = pickerView\n        super.init(parentObject: pickerView, delegateProxy: RxPickerViewDataSourceProxy.self)\n    }\n\n    // Register known implementations\n    public static func registerKnownImplementations() {\n        self.register { RxPickerViewDataSourceProxy(pickerView: $0) }\n    }\n\n    private weak var _requiredMethodsDataSource: UIPickerViewDataSource? = pickerViewDataSourceNotSet\n\n    // MARK: UIPickerViewDataSource\n\n    /// Required delegate method implementation.\n    public func numberOfComponents(in pickerView: UIPickerView) -> Int {\n        return (_requiredMethodsDataSource ?? pickerViewDataSourceNotSet).numberOfComponents(in: pickerView)\n    }\n\n    /// Required delegate method implementation.\n    public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {\n        return (_requiredMethodsDataSource ?? pickerViewDataSourceNotSet).pickerView(pickerView, numberOfRowsInComponent: component)\n    }\n    \n    /// For more information take a look at `DelegateProxyType`.\n    public override func setForwardToDelegate(_ forwardToDelegate: UIPickerViewDataSource?, retainDelegate: Bool) {\n        _requiredMethodsDataSource = forwardToDelegate ?? pickerViewDataSourceNotSet\n        super.setForwardToDelegate(forwardToDelegate, retainDelegate: retainDelegate)\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxPickerViewDelegateProxy.swift",
    "content": "//\n//  RxPickerViewDelegateProxy.swift\n//  RxCocoa\n//\n//  Created by Segii Shulga on 5/12/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n\n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n    import UIKit\n\n    extension UIPickerView: HasDelegate {\n        public typealias Delegate = UIPickerViewDelegate\n    }\n\n    open class RxPickerViewDelegateProxy\n        : DelegateProxy<UIPickerView, UIPickerViewDelegate>\n        , DelegateProxyType \n        , UIPickerViewDelegate {\n\n        /// Typed parent object.\n        public weak private(set) var pickerView: UIPickerView?\n\n        /// - parameter pickerView: Parent object for delegate proxy.\n        public init(pickerView: ParentObject) {\n            self.pickerView = pickerView\n            super.init(parentObject: pickerView, delegateProxy: RxPickerViewDelegateProxy.self)\n        }\n\n        // Register known implementationss\n        public static func registerKnownImplementations() {\n            self.register { RxPickerViewDelegateProxy(pickerView: $0) }\n        }\n    }\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxScrollViewDelegateProxy.swift",
    "content": "//\n//  RxScrollViewDelegateProxy.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 6/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\nimport UIKit\n    \nextension UIScrollView: HasDelegate {\n    public typealias Delegate = UIScrollViewDelegate\n}\n\n/// For more information take a look at `DelegateProxyType`.\nopen class RxScrollViewDelegateProxy\n    : DelegateProxy<UIScrollView, UIScrollViewDelegate>\n    , DelegateProxyType \n    , UIScrollViewDelegate {\n\n    /// Typed parent object.\n    public weak private(set) var scrollView: UIScrollView?\n\n    /// - parameter scrollView: Parent object for delegate proxy.\n    public init(scrollView: ParentObject) {\n        self.scrollView = scrollView\n        super.init(parentObject: scrollView, delegateProxy: RxScrollViewDelegateProxy.self)\n    }\n\n    // Register known implementations\n    public static func registerKnownImplementations() {\n        self.register { RxScrollViewDelegateProxy(scrollView: $0) }\n        self.register { RxTableViewDelegateProxy(tableView: $0) }\n        self.register { RxCollectionViewDelegateProxy(collectionView: $0) }\n        self.register { RxTextViewDelegateProxy(textView: $0) }\n    }\n\n    fileprivate var _contentOffsetBehaviorSubject: BehaviorSubject<CGPoint>?\n    fileprivate var _contentOffsetPublishSubject: PublishSubject<()>?\n\n    /// Optimized version used for observing content offset changes.\n    internal var contentOffsetBehaviorSubject: BehaviorSubject<CGPoint> {\n        if let subject = _contentOffsetBehaviorSubject {\n            return subject\n        }\n\n        let subject = BehaviorSubject<CGPoint>(value: self.scrollView?.contentOffset ?? CGPoint.zero)\n        _contentOffsetBehaviorSubject = subject\n\n        return subject\n    }\n\n    /// Optimized version used for observing content offset changes.\n    internal var contentOffsetPublishSubject: PublishSubject<()> {\n        if let subject = _contentOffsetPublishSubject {\n            return subject\n        }\n\n        let subject = PublishSubject<()>()\n        _contentOffsetPublishSubject = subject\n\n        return subject\n    }\n    \n    // MARK: delegate methods\n\n    /// For more information take a look at `DelegateProxyType`.\n    public func scrollViewDidScroll(_ scrollView: UIScrollView) {\n        if let subject = _contentOffsetBehaviorSubject {\n            subject.on(.next(scrollView.contentOffset))\n        }\n        if let subject = _contentOffsetPublishSubject {\n            subject.on(.next(()))\n        }\n        self._forwardToDelegate?.scrollViewDidScroll?(scrollView)\n    }\n    \n    deinit {\n        if let subject = _contentOffsetBehaviorSubject {\n            subject.on(.completed)\n        }\n\n        if let subject = _contentOffsetPublishSubject {\n            subject.on(.completed)\n        }\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxSearchBarDelegateProxy.swift",
    "content": "//\n//  RxSearchBarDelegateProxy.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 7/4/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\nextension UISearchBar: HasDelegate {\n    public typealias Delegate = UISearchBarDelegate\n}\n\n/// For more information take a look at `DelegateProxyType`.\nopen class RxSearchBarDelegateProxy\n    : DelegateProxy<UISearchBar, UISearchBarDelegate>\n    , DelegateProxyType \n    , UISearchBarDelegate {\n\n    /// Typed parent object.\n    public weak private(set) var searchBar: UISearchBar?\n\n    /// - parameter searchBar: Parent object for delegate proxy.\n    public init(searchBar: ParentObject) {\n        self.searchBar = searchBar\n        super.init(parentObject: searchBar, delegateProxy: RxSearchBarDelegateProxy.self)\n    }\n\n    // Register known implementations\n    public static func registerKnownImplementations() {\n        self.register { RxSearchBarDelegateProxy(searchBar: $0) }\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxSearchControllerDelegateProxy.swift",
    "content": "//\n//  RxSearchControllerDelegateProxy.swift\n//  RxCocoa\n//\n//  Created by Segii Shulga on 3/17/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n   \n#if !RX_NO_MODULE\n   import RxSwift\n#endif\n   import UIKit\n\nextension UISearchController: HasDelegate {\n    public typealias Delegate = UISearchControllerDelegate\n}\n\n/// For more information take a look at `DelegateProxyType`.\n@available(iOS 8.0, *)\nopen class RxSearchControllerDelegateProxy\n    : DelegateProxy<UISearchController, UISearchControllerDelegate>\n    , DelegateProxyType \n    , UISearchControllerDelegate {\n\n    /// Typed parent object.\n    public weak private(set) var searchController: UISearchController?\n\n    /// - parameter searchController: Parent object for delegate proxy.\n    public init(searchController: UISearchController) {\n        self.searchController = searchController\n        super.init(parentObject: searchController, delegateProxy: RxSearchControllerDelegateProxy.self)\n    }\n    \n    // Register known implementations\n    public static func registerKnownImplementations() {\n        self.register { RxSearchControllerDelegateProxy(searchController: $0) }\n    }\n}\n   \n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTabBarControllerDelegateProxy.swift",
    "content": "//\n//  RxTabBarControllerDelegateProxy.swift\n//  RxCocoa\n//\n//  Created by Yusuke Kita on 2016/12/07.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\nimport UIKit\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\nextension UITabBarController: HasDelegate {\n    public typealias Delegate = UITabBarControllerDelegate\n}\n\n/// For more information take a look at `DelegateProxyType`.\nopen class RxTabBarControllerDelegateProxy\n    : DelegateProxy<UITabBarController, UITabBarControllerDelegate>\n    , DelegateProxyType \n    , UITabBarControllerDelegate {\n\n    /// Typed parent object.\n    public weak private(set) var tabBar: UITabBarController?\n\n    /// - parameter tabBar: Parent object for delegate proxy.\n    public init(tabBar: ParentObject) {\n        self.tabBar = tabBar\n        super.init(parentObject: tabBar, delegateProxy: RxTabBarControllerDelegateProxy.self)\n    }\n\n    // Register known implementations\n    public static func registerKnownImplementations() {\n        self.register { RxTabBarControllerDelegateProxy(tabBar: $0) }\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTabBarDelegateProxy.swift",
    "content": "//\n//  RxTabBarDelegateProxy.swift\n//  RxCocoa\n//\n//  Created by Jesse Farless on 5/14/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\nimport UIKit\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\nextension UITabBar: HasDelegate {\n    public typealias Delegate = UITabBarDelegate\n}\n\n/// For more information take a look at `DelegateProxyType`.\nopen class RxTabBarDelegateProxy\n    : DelegateProxy<UITabBar, UITabBarDelegate>\n    , DelegateProxyType \n    , UITabBarDelegate {\n\n    /// Typed parent object.\n    public weak private(set) var tabBar: UITabBar?\n\n    /// - parameter tabBar: Parent object for delegate proxy.\n    public init(tabBar: ParentObject) {\n        self.tabBar = tabBar\n        super.init(parentObject: tabBar, delegateProxy: RxTabBarDelegateProxy.self)\n    }\n\n    // Register known implementations\n    public static func registerKnownImplementations() {\n        self.register { RxTabBarDelegateProxy(tabBar: $0) }\n    }\n\n    /// For more information take a look at `DelegateProxyType`.\n    open class func currentDelegate(for object: ParentObject) -> UITabBarDelegate? {\n        return object.delegate\n    }\n\n    /// For more information take a look at `DelegateProxyType`.\n    open class func setCurrentDelegate(_ delegate: UITabBarDelegate?, to object: ParentObject) {\n        object.delegate = delegate\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTableViewDataSourceProxy.swift",
    "content": "//\n//  RxTableViewDataSourceProxy.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 6/15/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n    \nextension UITableView: HasDataSource {\n    public typealias DataSource = UITableViewDataSource\n}\n\nlet tableViewDataSourceNotSet = TableViewDataSourceNotSet()\n\nfinal class TableViewDataSourceNotSet\n    : NSObject\n    , UITableViewDataSource {\n\n    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return 0\n    }\n    \n    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        rxAbstractMethod(message: dataSourceNotSet)\n    }\n}\n\n/// For more information take a look at `DelegateProxyType`.\nopen class RxTableViewDataSourceProxy\n    : DelegateProxy<UITableView, UITableViewDataSource>\n    , DelegateProxyType \n    , UITableViewDataSource {\n\n    /// Typed parent object.\n    public weak private(set) var tableView: UITableView?\n\n    /// - parameter tableView: Parent object for delegate proxy.\n    public init(tableView: UITableView) {\n        self.tableView = tableView\n        super.init(parentObject: tableView, delegateProxy: RxTableViewDataSourceProxy.self)\n    }\n\n    // Register known implementations\n    public static func registerKnownImplementations() {\n        self.register { RxTableViewDataSourceProxy(tableView: $0) }\n    }\n\n    fileprivate weak var _requiredMethodsDataSource: UITableViewDataSource? = tableViewDataSourceNotSet\n\n    // MARK: delegate\n\n    /// Required delegate method implementation.\n    public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return (_requiredMethodsDataSource ?? tableViewDataSourceNotSet).tableView(tableView, numberOfRowsInSection: section)\n    }\n\n    /// Required delegate method implementation.\n    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        return (_requiredMethodsDataSource ?? tableViewDataSourceNotSet).tableView(tableView, cellForRowAt: indexPath)\n    }\n\n    /// For more information take a look at `DelegateProxyType`.\n    open override func setForwardToDelegate(_ forwardToDelegate: UITableViewDataSource?, retainDelegate: Bool) {\n        _requiredMethodsDataSource = forwardToDelegate  ?? tableViewDataSourceNotSet\n        super.setForwardToDelegate(forwardToDelegate, retainDelegate: retainDelegate)\n    }\n\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTableViewDelegateProxy.swift",
    "content": "//\n//  RxTableViewDelegateProxy.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 6/15/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\n/// For more information take a look at `DelegateProxyType`.\nopen class RxTableViewDelegateProxy\n    : RxScrollViewDelegateProxy\n    , UITableViewDelegate {\n\n    /// Typed parent object.\n    public weak private(set) var tableView: UITableView?\n\n    /// - parameter tableView: Parent object for delegate proxy.\n    public init(tableView: UITableView) {\n        self.tableView = tableView\n        super.init(scrollView: tableView)\n    }\n\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTextStorageDelegateProxy.swift",
    "content": "//\n//  RxTextStorageDelegateProxy.swift\n//  RxCocoa\n//\n//  Created by Segii Shulga on 12/30/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n    \n    #if !RX_NO_MODULE\n        import RxSwift\n    #endif\n    import UIKit\n\n    extension NSTextStorage: HasDelegate {\n        public typealias Delegate = NSTextStorageDelegate\n    }\n\n    open class RxTextStorageDelegateProxy\n        : DelegateProxy<NSTextStorage, NSTextStorageDelegate>\n        , DelegateProxyType \n        , NSTextStorageDelegate {\n\n        /// Typed parent object.\n        public weak private(set) var textStorage: NSTextStorage?\n\n        /// - parameter textStorage: Parent object for delegate proxy.\n        public init(textStorage: NSTextStorage) {\n            self.textStorage = textStorage\n            super.init(parentObject: textStorage, delegateProxy: RxTextStorageDelegateProxy.self)\n        }\n\n        // Register known implementations\n        public static func registerKnownImplementations() {\n            self.register { RxTextStorageDelegateProxy(textStorage: $0) }\n        }\n    }\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTextViewDelegateProxy.swift",
    "content": "//\n//  RxTextViewDelegateProxy.swift\n//  RxCocoa\n//\n//  Created by Yuta ToKoRo on 7/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\n/// For more information take a look at `DelegateProxyType`.\nopen class RxTextViewDelegateProxy\n    : RxScrollViewDelegateProxy\n    , UITextViewDelegate {\n\n    /// Typed parent object.\n    public weak private(set) var textView: UITextView?\n\n    /// - parameter textview: Parent object for delegate proxy.\n    public init(textView: UITextView) {\n        self.textView = textView\n        super.init(scrollView: textView)\n    }\n\n    // MARK: delegate methods\n\n    /// For more information take a look at `DelegateProxyType`.\n    @objc open func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {\n        /**\n         We've had some issues with observing text changes. This is here just in case we need the same hack in future and that \n         we wouldn't need to change the public interface.\n        */\n        let forwardToDelegate = self.forwardToDelegate() as? UITextViewDelegate\n        return forwardToDelegate?.textView?(textView,\n            shouldChangeTextIn: range,\n            replacementText: text) ?? true\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/Proxies/RxWebViewDelegateProxy.swift",
    "content": "//\n//  RxWebViewDelegateProxy.swift\n//  RxCocoa\n//\n//  Created by Andrew Breckenridge on 9/26/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\nimport UIKit\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\nextension UIWebView: HasDelegate {\n    public typealias Delegate = UIWebViewDelegate\n}\n\nopen class RxWebViewDelegateProxy\n    : DelegateProxy<UIWebView, UIWebViewDelegate>\n    , DelegateProxyType \n    , UIWebViewDelegate {\n\n    /// Typed parent object.\n    public weak private(set) var webView: UIWebView?\n\n    /// - parameter webView: Parent object for delegate proxy.\n    public init(webView: ParentObject) {\n        self.webView = webView\n        super.init(parentObject: webView, delegateProxy: RxWebViewDelegateProxy.self)\n    }\n\n    // Register known implementations\n    public static func registerKnownImplementations() {\n        self.register { RxWebViewDelegateProxy(webView: $0) }\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIActivityIndicatorView+Rx.swift",
    "content": "//\n//  UIActivityIndicatorView+Rx.swift\n//  RxCocoa\n//\n//  Created by Ivan Persidskiy on 02/12/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\nimport UIKit\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\nextension Reactive where Base: UIActivityIndicatorView {\n\n    /// Bindable sink for `startAnimating()`, `stopAnimating()` methods.\n    public var isAnimating: Binder<Bool> {\n        return Binder(self.base) { activityIndicator, active in\n            if active {\n                activityIndicator.startAnimating()\n            } else {\n                activityIndicator.stopAnimating()\n            }\n        }\n    }\n\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIAlertAction+Rx.swift",
    "content": "//\n//  UIAlertAction+Rx.swift\n//  RxCocoa\n//\n//  Created by Andrew Breckenridge on 5/7/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\n    \n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\nextension Reactive where Base: UIAlertAction {\n\n    /// Bindable sink for `enabled` property.\n    public var isEnabled: Binder<Bool> {\n        return Binder(self.base) { alertAction, value in\n            alertAction.isEnabled = value\n        }\n    }\n    \n}\n    \n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIApplication+Rx.swift",
    "content": "//\n//  UIApplication+Rx.swift\n//  RxCocoa\n//\n//  Created by Mads Bøgeskov on 18/01/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n    import UIKit\n\n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n\n    extension Reactive where Base: UIApplication {\n        \n        /// Bindable sink for `networkActivityIndicatorVisible`.\n        public var isNetworkActivityIndicatorVisible: Binder<Bool> {\n            return Binder(self.base) { application, active in\n                application.isNetworkActivityIndicatorVisible = active\n            }\n        }\n    }\n#endif\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIBarButtonItem+Rx.swift",
    "content": "//\n//  UIBarButtonItem+Rx.swift\n//  RxCocoa\n//\n//  Created by Daniel Tartaglia on 5/31/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\nfileprivate var rx_tap_key: UInt8 = 0\n\nextension Reactive where Base: UIBarButtonItem {\n    \n    /// Bindable sink for `enabled` property.\n    public var isEnabled: Binder<Bool> {\n        return Binder(self.base) { element, value in\n            element.isEnabled = value\n        }\n    }\n    \n    /// Bindable sink for `title` property.\n    public var title: Binder<String> {\n        return Binder(self.base) { element, value in\n            element.title = value\n        }\n    }\n\n    /// Reactive wrapper for target action pattern on `self`.\n    public var tap: ControlEvent<()> {\n        let source = lazyInstanceObservable(&rx_tap_key) { () -> Observable<()> in\n            Observable.create { [weak control = self.base] observer in\n                guard let control = control else {\n                    observer.on(.completed)\n                    return Disposables.create()\n                }\n                let target = BarButtonItemTarget(barButtonItem: control) {\n                    observer.on(.next(()))\n                }\n                return target\n            }\n            .takeUntil(self.deallocated)\n            .share()\n        }\n        \n        return ControlEvent(events: source)\n    }\n}\n\n\n@objc\nfinal class BarButtonItemTarget: RxTarget {\n    typealias Callback = () -> Void\n    \n    weak var barButtonItem: UIBarButtonItem?\n    var callback: Callback!\n    \n    init(barButtonItem: UIBarButtonItem, callback: @escaping () -> Void) {\n        self.barButtonItem = barButtonItem\n        self.callback = callback\n        super.init()\n        barButtonItem.target = self\n        barButtonItem.action = #selector(BarButtonItemTarget.action(_:))\n    }\n    \n    override func dispose() {\n        super.dispose()\n#if DEBUG\n        MainScheduler.ensureExecutingOnScheduler()\n#endif\n        \n        barButtonItem?.target = nil\n        barButtonItem?.action = nil\n        \n        callback = nil\n    }\n    \n    @objc func action(_ sender: AnyObject) {\n        callback()\n    }\n    \n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIButton+Rx.swift",
    "content": "//\n//  UIButton+Rx.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 3/28/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\nimport UIKit\n\nextension Reactive where Base: UIButton {\n    \n    /// Reactive wrapper for `TouchUpInside` control event.\n    public var tap: ControlEvent<Void> {\n        return controlEvent(.touchUpInside)\n    }\n}\n\n#endif\n\n#if os(tvOS)\n\n#if !RX_NO_MODULE\n    import RxSwift\n#endif\nimport UIKit\n\nextension Reactive where Base: UIButton {\n\n    /// Reactive wrapper for `PrimaryActionTriggered` control event.\n    public var primaryAction: ControlEvent<Void> {\n        return controlEvent(.primaryActionTriggered)\n    }\n\n}\n\n#endif\n\n#if os(iOS) || os(tvOS)\n\n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n    import UIKit\n\nextension Reactive where Base: UIButton {\n    \n    /// Reactive wrapper for `setTitle(_:for:)`\n    public func title(for controlState: UIControlState = []) -> Binder<String?> {\n        return Binder(self.base) { (button, title) -> () in\n            button.setTitle(title, for: controlState)\n        }\n    }\n\n    /// Reactive wrapper for `setImage(_:for:)`\n    public func image(for controlState: UIControlState = []) -> Binder<UIImage?> {\n        return Binder(self.base) { (button, image) -> () in\n            button.setImage(image, for: controlState)\n        }\n    }\n\n    /// Reactive wrapper for `setBackgroundImage(_:for:)`\n    public func backgroundImage(for controlState: UIControlState = []) -> Binder<UIImage?> {\n        return Binder(self.base) { (button, image) -> () in\n            button.setBackgroundImage(image, for: controlState)\n        }\n    }\n    \n}\n#endif\n\n#if os(iOS) || os(tvOS)\n    \n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n    import UIKit\n    \n    extension Reactive where Base: UIButton {\n        \n        /// Reactive wrapper for `setAttributedTitle(_:controlState:)`\n        public func attributedTitle(for controlState: UIControlState = []) -> Binder<NSAttributedString?> {\n            return Binder(self.base) { (button, attributedTitle) -> () in\n                button.setAttributedTitle(attributedTitle, for: controlState)\n            }\n        }\n        \n    }\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UICollectionView+Rx.swift",
    "content": "//\n//  UICollectionView+Rx.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 4/2/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\nimport UIKit\n\n// Items\n\nextension Reactive where Base: UICollectionView {\n\n    /**\n    Binds sequences of elements to collection view items.\n    \n    - parameter source: Observable sequence of items.\n    - parameter cellFactory: Transform between sequence elements and view cells.\n    - returns: Disposable object that can be used to unbind.\n     \n     Example\n    \n         let items = Observable.just([\n             1,\n             2,\n             3\n         ])\n\n         items\n         .bind(to: collectionView.rx.items) { (collectionView, row, element) in\n            let indexPath = IndexPath(row: row, section: 0)\n            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: \"Cell\", for: indexPath) as! NumberCell\n             cell.value?.text = \"\\(element) @ \\(row)\"\n             return cell\n         }\n         .disposed(by: disposeBag)\n    */\n    public func items<S: Sequence, O: ObservableType>\n        (_ source: O)\n        -> (_ cellFactory: @escaping (UICollectionView, Int, S.Iterator.Element) -> UICollectionViewCell)\n        -> Disposable where O.E == S {\n        return { cellFactory in\n            let dataSource = RxCollectionViewReactiveArrayDataSourceSequenceWrapper<S>(cellFactory: cellFactory)\n            return self.items(dataSource: dataSource)(source)\n        }\n        \n    }\n    \n    /**\n    Binds sequences of elements to collection view items.\n    \n    - parameter cellIdentifier: Identifier used to dequeue cells.\n    - parameter source: Observable sequence of items.\n    - parameter configureCell: Transform between sequence elements and view cells.\n    - parameter cellType: Type of table view cell.\n    - returns: Disposable object that can be used to unbind.\n     \n     Example\n\n         let items = Observable.just([\n             1,\n             2,\n             3\n         ])\n\n         items\n             .bind(to: collectionView.rx.items(cellIdentifier: \"Cell\", cellType: NumberCell.self)) { (row, element, cell) in\n                cell.value?.text = \"\\(element) @ \\(row)\"\n             }\n             .disposed(by: disposeBag)\n    */\n    public func items<S: Sequence, Cell: UICollectionViewCell, O : ObservableType>\n        (cellIdentifier: String, cellType: Cell.Type = Cell.self)\n        -> (_ source: O)\n        -> (_ configureCell: @escaping (Int, S.Iterator.Element, Cell) -> Void)\n        -> Disposable where O.E == S {\n        return { source in\n            return { configureCell in\n                let dataSource = RxCollectionViewReactiveArrayDataSourceSequenceWrapper<S> { (cv, i, item) in\n                    let indexPath = IndexPath(item: i, section: 0)\n                    let cell = cv.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath) as! Cell\n                    configureCell(i, item, cell)\n                    return cell\n                }\n                    \n                return self.items(dataSource: dataSource)(source)\n            }\n        }\n    }\n\n    \n    /**\n    Binds sequences of elements to collection view items using a custom reactive data used to perform the transformation.\n    \n    - parameter dataSource: Data source used to transform elements to view cells.\n    - parameter source: Observable sequence of items.\n    - returns: Disposable object that can be used to unbind.\n     \n     Example\n     \n         let dataSource = RxCollectionViewSectionedReloadDataSource<SectionModel<String, Double>>()\n\n         let items = Observable.just([\n             SectionModel(model: \"First section\", items: [\n                 1.0,\n                 2.0,\n                 3.0\n             ]),\n             SectionModel(model: \"Second section\", items: [\n                 1.0,\n                 2.0,\n                 3.0\n             ]),\n             SectionModel(model: \"Third section\", items: [\n                 1.0,\n                 2.0,\n                 3.0\n             ])\n         ])\n\n         dataSource.configureCell = { (dataSource, cv, indexPath, element) in\n             let cell = cv.dequeueReusableCell(withReuseIdentifier: \"Cell\", for: indexPath) as! NumberCell\n             cell.value?.text = \"\\(element) @ row \\(indexPath.row)\"\n             return cell\n         }\n\n         items\n            .bind(to: collectionView.rx.items(dataSource: dataSource))\n            .disposed(by: disposeBag)\n    */\n    public func items<\n            DataSource: RxCollectionViewDataSourceType & UICollectionViewDataSource,\n            O: ObservableType>\n        (dataSource: DataSource)\n        -> (_ source: O)\n        -> Disposable where DataSource.Element == O.E\n          {\n        return { source in\n            // This is called for sideeffects only, and to make sure delegate proxy is in place when\n            // data source is being bound.\n            // This is needed because theoretically the data source subscription itself might\n            // call `self.rx.delegate`. If that happens, it might cause weird side effects since\n            // setting data source will set delegate, and UICollectionView might get into a weird state.\n            // Therefore it's better to set delegate proxy first, just to be sure.\n            _ = self.delegate\n            // Strong reference is needed because data source is in use until result subscription is disposed\n            return source.subscribeProxyDataSource(ofObject: self.base, dataSource: dataSource, retainDataSource: true) { [weak collectionView = self.base] (_: RxCollectionViewDataSourceProxy, event) -> Void in\n                guard let collectionView = collectionView else {\n                    return\n                }\n                dataSource.collectionView(collectionView, observedEvent: event)\n            }\n        }\n    }\n}\n\nextension Reactive where Base: UICollectionView {\n    public typealias DisplayCollectionViewCellEvent = (cell: UICollectionViewCell, at: IndexPath)\n    public typealias DisplayCollectionViewSupplementaryViewEvent = (supplementaryView: UICollectionReusableView, elementKind: String, at: IndexPath)\n\n    /// Reactive wrapper for `dataSource`.\n    ///\n    /// For more information take a look at `DelegateProxyType` protocol documentation.\n    public var dataSource: DelegateProxy<UICollectionView, UICollectionViewDataSource> {\n        return RxCollectionViewDataSourceProxy.proxy(for: base)\n    }\n    \n    /// Installs data source as forwarding delegate on `rx.dataSource`.\n    /// Data source won't be retained.\n    ///\n    /// It enables using normal delegate mechanism with reactive delegate mechanism.\n    ///\n    /// - parameter dataSource: Data source object.\n    /// - returns: Disposable object that can be used to unbind the data source.\n    public func setDataSource(_ dataSource: UICollectionViewDataSource)\n        -> Disposable {\n        return RxCollectionViewDataSourceProxy.installForwardDelegate(dataSource, retainDelegate: false, onProxyForObject: self.base)\n    }\n   \n    /// Reactive wrapper for `delegate` message `collectionView(_:didSelectItemAtIndexPath:)`.\n    public var itemSelected: ControlEvent<IndexPath> {\n        let source = delegate.methodInvoked(#selector(UICollectionViewDelegate.collectionView(_:didSelectItemAt:)))\n            .map { a in\n                return a[1] as! IndexPath\n            }\n        \n        return ControlEvent(events: source)\n    }\n\n    /// Reactive wrapper for `delegate` message `collectionView(_:didSelectItemAtIndexPath:)`.\n    public var itemDeselected: ControlEvent<IndexPath> {\n        let source = delegate.methodInvoked(#selector(UICollectionViewDelegate.collectionView(_:didDeselectItemAt:)))\n            .map { a in\n                return a[1] as! IndexPath\n        }\n\n        return ControlEvent(events: source)\n    }\n\n    /// Reactive wrapper for `delegate` message `collectionView(_:didHighlightItemAt:)`.\n    public var itemHighlighted: ControlEvent<IndexPath> {\n        let source = delegate.methodInvoked(#selector(UICollectionViewDelegate.collectionView(_:didHighlightItemAt:)))\n            .map { a in\n                return try castOrThrow(IndexPath.self, a[1])\n            }\n        \n        return ControlEvent(events: source)\n    }\n\n    /// Reactive wrapper for `delegate` message `collectionView(_:didUnhighlightItemAt:)`.\n    public var itemUnhighlighted: ControlEvent<IndexPath> {\n        let source = delegate.methodInvoked(#selector(UICollectionViewDelegate.collectionView(_:didUnhighlightItemAt:)))\n            .map { a in\n                return try castOrThrow(IndexPath.self, a[1])\n            }\n        \n        return ControlEvent(events: source)\n    }\n\n    /// Reactive wrapper for `delegate` message `collectionView:willDisplay:forItemAt:`.\n    public var willDisplayCell: ControlEvent<DisplayCollectionViewCellEvent> {\n        let source: Observable<DisplayCollectionViewCellEvent> = self.delegate.methodInvoked(#selector(UICollectionViewDelegate.collectionView(_:willDisplay:forItemAt:)))\n            .map { a in\n                return (try castOrThrow(UICollectionViewCell.self, a[1]), try castOrThrow(IndexPath.self, a[2]))\n            }\n        \n        return ControlEvent(events: source)\n    }\n\n    /// Reactive wrapper for `delegate` message `collectionView(_:willDisplaySupplementaryView:forElementKind:at:)`.\n    public var willDisplaySupplementaryView: ControlEvent<DisplayCollectionViewSupplementaryViewEvent> {\n        let source: Observable<DisplayCollectionViewSupplementaryViewEvent> = self.delegate.methodInvoked(#selector(UICollectionViewDelegate.collectionView(_:willDisplaySupplementaryView:forElementKind:at:)))\n            .map { a in\n                return (try castOrThrow(UICollectionReusableView.self, a[1]),\n                        try castOrThrow(String.self, a[2]),\n                        try castOrThrow(IndexPath.self, a[3]))\n            }\n\n        return ControlEvent(events: source)\n    }\n\n    /// Reactive wrapper for `delegate` message `collectionView:didEndDisplaying:forItemAt:`.\n    public var didEndDisplayingCell: ControlEvent<DisplayCollectionViewCellEvent> {\n        let source: Observable<DisplayCollectionViewCellEvent> = self.delegate.methodInvoked(#selector(UICollectionViewDelegate.collectionView(_:didEndDisplaying:forItemAt:)))\n            .map { a in\n                return (try castOrThrow(UICollectionViewCell.self, a[1]), try castOrThrow(IndexPath.self, a[2]))\n            }\n\n        return ControlEvent(events: source)\n    }\n\n    /// Reactive wrapper for `delegate` message `collectionView(_:didEndDisplayingSupplementaryView:forElementOfKind:at:)`.\n    public var didEndDisplayingSupplementaryView: ControlEvent<DisplayCollectionViewSupplementaryViewEvent> {\n        let source: Observable<DisplayCollectionViewSupplementaryViewEvent> = self.delegate.methodInvoked(#selector(UICollectionViewDelegate.collectionView(_:didEndDisplayingSupplementaryView:forElementOfKind:at:)))\n            .map { a in\n                return (try castOrThrow(UICollectionReusableView.self, a[1]),\n                        try castOrThrow(String.self, a[2]),\n                        try castOrThrow(IndexPath.self, a[3]))\n            }\n\n        return ControlEvent(events: source)\n    }\n    \n    /// Reactive wrapper for `delegate` message `collectionView(_:didSelectItemAtIndexPath:)`.\n    ///\n    /// It can be only used when one of the `rx.itemsWith*` methods is used to bind observable sequence,\n    /// or any other data source conforming to `SectionedViewDataSourceType` protocol.\n    ///\n    /// ```\n    ///     collectionView.rx.modelSelected(MyModel.self)\n    ///        .map { ...\n    /// ```\n    public func modelSelected<T>(_ modelType: T.Type) -> ControlEvent<T> {\n        let source: Observable<T> = itemSelected.flatMap { [weak view = self.base as UICollectionView] indexPath -> Observable<T> in\n            guard let view = view else {\n                return Observable.empty()\n            }\n\n            return Observable.just(try view.rx.model(at: indexPath))\n        }\n        \n        return ControlEvent(events: source)\n    }\n\n    /// Reactive wrapper for `delegate` message `collectionView(_:didSelectItemAtIndexPath:)`.\n    ///\n    /// It can be only used when one of the `rx.itemsWith*` methods is used to bind observable sequence,\n    /// or any other data source conforming to `SectionedViewDataSourceType` protocol.\n    ///\n    /// ```\n    ///     collectionView.rx.modelDeselected(MyModel.self)\n    ///        .map { ...\n    /// ```\n    public func modelDeselected<T>(_ modelType: T.Type) -> ControlEvent<T> {\n        let source: Observable<T> = itemDeselected.flatMap { [weak view = self.base as UICollectionView] indexPath -> Observable<T> in\n            guard let view = view else {\n                return Observable.empty()\n            }\n\n            return Observable.just(try view.rx.model(at: indexPath))\n        }\n\n        return ControlEvent(events: source)\n    }\n    \n    /// Synchronous helper method for retrieving a model at indexPath through a reactive data source\n    public func model<T>(at indexPath: IndexPath) throws -> T {\n        let dataSource: SectionedViewDataSourceType = castOrFatalError(self.dataSource.forwardToDelegate(), message: \"This method only works in case one of the `rx.itemsWith*` methods was used.\")\n        \n        let element = try dataSource.model(at: indexPath)\n\n        return element as! T\n    }\n}\n#endif\n\n#if os(tvOS)\n\nextension Reactive where Base: UICollectionView {\n    \n    /// Reactive wrapper for `delegate` message `collectionView(_:didUpdateFocusInContext:withAnimationCoordinator:)`.\n    public var didUpdateFocusInContextWithAnimationCoordinator: ControlEvent<(context: UICollectionViewFocusUpdateContext, animationCoordinator: UIFocusAnimationCoordinator)> {\n\n        let source = delegate.methodInvoked(#selector(UICollectionViewDelegate.collectionView(_:didUpdateFocusIn:with:)))\n            .map { a -> (context: UICollectionViewFocusUpdateContext, animationCoordinator: UIFocusAnimationCoordinator) in\n                let context = a[1] as! UICollectionViewFocusUpdateContext\n                let animationCoordinator = a[2] as! UIFocusAnimationCoordinator\n                return (context: context, animationCoordinator: animationCoordinator)\n            }\n\n        return ControlEvent(events: source)\n    }\n}\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIControl+Rx.swift",
    "content": "//\n//  UIControl+Rx.swift\n//  RxCocoa\n//\n//  Created by Daniel Tartaglia on 5/23/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\nimport UIKit\n\nextension Reactive where Base: UIControl {\n    \n    /// Bindable sink for `enabled` property.\n    public var isEnabled: Binder<Bool> {\n        return Binder(self.base) { control, value in\n            control.isEnabled = value\n        }\n    }\n\n    /// Bindable sink for `selected` property.\n    public var isSelected: Binder<Bool> {\n        return Binder(self.base) { control, selected in\n            control.isSelected = selected\n        }\n    }\n\n    /// Reactive wrapper for target action pattern.\n    ///\n    /// - parameter controlEvents: Filter for observed event types.\n    public func controlEvent(_ controlEvents: UIControlEvents) -> ControlEvent<()> {\n        let source: Observable<Void> = Observable.create { [weak control = self.base] observer in\n                MainScheduler.ensureExecutingOnScheduler()\n\n                guard let control = control else {\n                    observer.on(.completed)\n                    return Disposables.create()\n                }\n\n                let controlTarget = ControlTarget(control: control, controlEvents: controlEvents) {\n                    control in\n                    observer.on(.next(()))\n                }\n\n                return Disposables.create(with: controlTarget.dispose)\n            }\n            .takeUntil(deallocated)\n\n        return ControlEvent(events: source)\n    }\n\n    /// Creates a `ControlProperty` that is triggered by target/action pattern value updates.\n    ///\n    /// - parameter controlEvents: Events that trigger value update sequence elements.\n    /// - parameter getter: Property value getter.\n    /// - parameter setter: Property value setter.\n    public func controlProperty<T>(\n        editingEvents: UIControlEvents,\n        getter: @escaping (Base) -> T,\n        setter: @escaping (Base, T) -> ()\n    ) -> ControlProperty<T> {\n        let source: Observable<T> = Observable.create { [weak weakControl = base] observer in\n                guard let control = weakControl else {\n                    observer.on(.completed)\n                    return Disposables.create()\n                }\n\n                observer.on(.next(getter(control)))\n\n                let controlTarget = ControlTarget(control: control, controlEvents: editingEvents) { _ in\n                    if let control = weakControl {\n                        observer.on(.next(getter(control)))\n                    }\n                }\n                \n                return Disposables.create(with: controlTarget.dispose)\n            }\n            .takeUntil(deallocated)\n\n        let bindingObserver = Binder(base, binding: setter)\n\n        return ControlProperty<T>(values: source, valueSink: bindingObserver)\n    }\n\n    /// This is a separate method is to better communicate to public consumers that\n    /// an `editingEvent` needs to fire for control property to be updated.\n    internal func controlPropertyWithDefaultEvents<T>(\n        editingEvents: UIControlEvents = [.allEditingEvents, .valueChanged],\n        getter: @escaping (Base) -> T,\n        setter: @escaping (Base, T) -> ()\n        ) -> ControlProperty<T> {\n        return controlProperty(\n            editingEvents: [.allEditingEvents, .valueChanged],\n            getter: getter,\n            setter: setter\n        )\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIDatePicker+Rx.swift",
    "content": "//\n//  UIDatePicker+Rx.swift\n//  RxCocoa\n//\n//  Created by Daniel Tartaglia on 5/31/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\nimport UIKit\n\nextension Reactive where Base: UIDatePicker {\n    /// Reactive wrapper for `date` property.\n    public var date: ControlProperty<Date> {\n        return value\n    }\n\n    /// Reactive wrapper for `date` property.\n    public var value: ControlProperty<Date> {\n        return base.rx.controlPropertyWithDefaultEvents(\n            getter: { datePicker in\n                datePicker.date\n            }, setter: { datePicker, value in\n                datePicker.date = value\n            }\n        )\n    }\n\n    /// Reactive wrapper for `countDownDuration` property.\n    public var countDownDuration: ControlProperty<TimeInterval> {\n        return base.rx.controlPropertyWithDefaultEvents(\n            getter: { datePicker in\n                datePicker.countDownDuration\n            }, setter: { datePicker, value in\n                datePicker.countDownDuration = value\n            }\n        )\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIGestureRecognizer+Rx.swift",
    "content": "//\n//  UIGestureRecognizer+Rx.swift\n//  RxCocoa\n//\n//  Created by Carlos García on 10/6/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\n\n// This should be only used from `MainScheduler`\nfinal class GestureTarget<Recognizer: UIGestureRecognizer>: RxTarget {\n    typealias Callback = (Recognizer) -> Void\n    \n    let selector = #selector(ControlTarget.eventHandler(_:))\n    \n    weak var gestureRecognizer: Recognizer?\n    var callback: Callback?\n    \n    init(_ gestureRecognizer: Recognizer, callback: @escaping Callback) {\n        self.gestureRecognizer = gestureRecognizer\n        self.callback = callback\n        \n        super.init()\n        \n        gestureRecognizer.addTarget(self, action: selector)\n\n        let method = self.method(for: selector)\n        if method == nil {\n            fatalError(\"Can't find method\")\n        }\n    }\n    \n    @objc func eventHandler(_ sender: UIGestureRecognizer) {\n        if let callback = self.callback, let gestureRecognizer = self.gestureRecognizer {\n            callback(gestureRecognizer)\n        }\n    }\n    \n    override func dispose() {\n        super.dispose()\n        \n        self.gestureRecognizer?.removeTarget(self, action: self.selector)\n        self.callback = nil\n    }\n}\n\nextension Reactive where Base: UIGestureRecognizer {\n    \n    /// Reactive wrapper for gesture recognizer events.\n    public var event: ControlEvent<Base> {\n        let source: Observable<Base> = Observable.create { [weak control = self.base] observer in\n            MainScheduler.ensureExecutingOnScheduler()\n\n            guard let control = control else {\n                observer.on(.completed)\n                return Disposables.create()\n            }\n            \n            let observer = GestureTarget(control) {\n                control in\n                observer.on(.next(control))\n            }\n            \n            return observer\n        }.takeUntil(deallocated)\n        \n        return ControlEvent(events: source)\n    }\n    \n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIImageView+Rx.swift",
    "content": "//\n//  UIImageView+Rx.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 4/1/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\nimport UIKit\n\nextension Reactive where Base: UIImageView {\n    \n    /// Bindable sink for `image` property.\n    public var image: Binder<UIImage?> {\n        return Binder(base) { imageView, image in\n            imageView.image = image\n        }\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UILabel+Rx.swift",
    "content": "//\n//  UILabel+Rx.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 4/1/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\nimport UIKit\n\nextension Reactive where Base: UILabel {\n    \n    /// Bindable sink for `text` property.\n    public var text: Binder<String?> {\n        return Binder(self.base) { label, text in\n            label.text = text\n        }\n    }\n\n    /// Bindable sink for `attributedText` property.\n    public var attributedText: Binder<NSAttributedString?> {\n        return Binder(self.base) { label, text in\n            label.attributedText = text\n        }\n    }\n    \n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UINavigationController+Rx.swift",
    "content": "//\n//  UINavigationController+Rx.swift\n//  RxCocoa\n//\n//  Created by Diogo on 13/04/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\nimport UIKit\n\nextension Reactive where Base: UINavigationController {\n    public typealias ShowEvent = (viewController: UIViewController, animated: Bool)\n\n    /// Reactive wrapper for `delegate`.\n    ///\n    /// For more information take a look at `DelegateProxyType` protocol documentation.\n    public var delegate: DelegateProxy<UINavigationController, UINavigationControllerDelegate> {\n        return RxNavigationControllerDelegateProxy.proxy(for: base)\n    }\n\n    /// Reactive wrapper for delegate method `navigationController(:willShow:animated:)`.\n    public var willShow: ControlEvent<ShowEvent> {\n        let source: Observable<ShowEvent> = delegate\n            .methodInvoked(#selector(UINavigationControllerDelegate.navigationController(_:willShow:animated:)))\n            .map { arg in\n                let viewController = try castOrThrow(UIViewController.self, arg[1])\n                let animated = try castOrThrow(Bool.self, arg[2])\n                return (viewController, animated)\n        }\n        return ControlEvent(events: source)\n    }\n\n    /// Reactive wrapper for delegate method `navigationController(:didShow:animated:)`.\n    public var didShow: ControlEvent<ShowEvent> {\n        let source: Observable<ShowEvent> = delegate\n            .methodInvoked(#selector(UINavigationControllerDelegate.navigationController(_:didShow:animated:)))\n            .map { arg in\n                let viewController = try castOrThrow(UIViewController.self, arg[1])\n                let animated = try castOrThrow(Bool.self, arg[2])\n                return (viewController, animated)\n        }\n        return ControlEvent(events: source)\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UINavigationItem+Rx.swift",
    "content": "//\n//  UINavigationItem+Rx.swift\n//  RxCocoa\n//\n//  Created by kumapo on 2016/05/09.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n    \nimport UIKit\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n    \nextension Reactive where Base: UINavigationItem {\n    \n    /// Bindable sink for `title` property.\n    public var title: Binder<String?> {\n        return Binder(self.base) { navigationItem, text in\n            navigationItem.title = text\n        }\n    }\n        \n}\n    \n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIPageControl+Rx.swift",
    "content": "//\n//  UIPageControl+Rx.swift\n//  RxCocoa\n//\n//  Created by Francesco Puntillo on 14/04/2016.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n    \n#if !RX_NO_MODULE\nimport RxSwift\n#endif\nimport UIKit\n    \nextension Reactive where Base: UIPageControl {\n    \n    /// Bindable sink for `currentPage` property.\n    public var currentPage: Binder<Int> {\n        return Binder(self.base) { controller, page in\n            controller.currentPage = page\n        }\n    }\n    \n    /// Bindable sink for `numberOfPages` property.\n    public var numberOfPages: Binder<Int> {\n        return Binder(self.base) { controller, page in\n            controller.numberOfPages = page\n        }\n    }\n    \n}\n    \n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIPickerView+Rx.swift",
    "content": "//\n//  UIPickerView+Rx.swift\n//  RxCocoa\n//\n//  Created by Segii Shulga on 5/12/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n    \n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n    import UIKit\n\n    extension Reactive where Base: UIPickerView {\n\n        /// Reactive wrapper for `delegate`.\n        /// For more information take a look at `DelegateProxyType` protocol documentation.\n        public var delegate: DelegateProxy<UIPickerView, UIPickerViewDelegate> {\n            return RxPickerViewDelegateProxy.proxy(for: base)\n        }\n        \n        /// Installs delegate as forwarding delegate on `delegate`.\n        /// Delegate won't be retained.\n        ///\n        /// It enables using normal delegate mechanism with reactive delegate mechanism.\n        ///\n        /// - parameter delegate: Delegate object.\n        /// - returns: Disposable object that can be used to unbind the delegate.\n        public func setDelegate(_ delegate: UIPickerViewDelegate)\n            -> Disposable {\n                return RxPickerViewDelegateProxy.installForwardDelegate(delegate, retainDelegate: false, onProxyForObject: self.base)\n        }\n        \n        /**\n         Reactive wrapper for `dataSource`.\n         \n         For more information take a look at `DelegateProxyType` protocol documentation.\n         */\n        public var dataSource: DelegateProxy<UIPickerView, UIPickerViewDataSource> {\n            return RxPickerViewDataSourceProxy.proxy(for: base)\n        }\n        \n        /**\n         Reactive wrapper for `delegate` message `pickerView:didSelectRow:inComponent:`.\n         */\n        public var itemSelected: ControlEvent<(row: Int, component: Int)> {\n            let source = delegate\n                .methodInvoked(#selector(UIPickerViewDelegate.pickerView(_:didSelectRow:inComponent:)))\n                .map {\n                    return (row: try castOrThrow(Int.self, $0[1]), component: try castOrThrow(Int.self, $0[2]))\n                }\n            return ControlEvent(events: source)\n        }\n        \n        /**\n         Reactive wrapper for `delegate` message `pickerView:didSelectRow:inComponent:`.\n         \n         It can be only used when one of the `rx.itemTitles, rx.itemAttributedTitles, items(_ source: O)` methods is used to bind observable sequence,\n         or any other data source conforming to a `ViewDataSourceType` protocol.\n         \n         ```\n         pickerView.rx.modelSelected(MyModel.self)\n         .map { ...\n         ```\n         - parameter modelType: Type of a Model which bound to the dataSource\n         */\n        public func modelSelected<T>(_ modelType: T.Type) -> ControlEvent<[T]> {\n            let source = itemSelected.flatMap { [weak view = self.base as UIPickerView] (_, component) -> Observable<[T]> in\n                guard let view = view else {\n                    return Observable.empty()\n                }\n\n                let model: [T] = try (0 ..< view.numberOfComponents).map { component in\n                    let row = view.selectedRow(inComponent: component)\n                    return try view.rx.model(at: IndexPath(row: row, section: component))\n                }\n\n                return Observable.just(model)\n            }\n            \n            return ControlEvent(events: source)\n        }\n        \n        /**\n         Binds sequences of elements to picker view rows.\n         \n         - parameter source: Observable sequence of items.\n         - parameter titleForRow: Transform between sequence elements and row titles.\n         - returns: Disposable object that can be used to unbind.\n         \n         Example:\n         \n            let items = Observable.just([\n                    \"First Item\",\n                    \"Second Item\",\n                    \"Third Item\"\n                ])\n         \n            items\n                .bind(to: pickerView.rx.itemTitles) { (row, element) in\n                    return element.title\n                }\n                .disposed(by: disposeBag)\n         \n         */\n        \n        public func itemTitles<S: Sequence, O: ObservableType>\n            (_ source: O)\n            -> (_ titleForRow: @escaping (Int, S.Iterator.Element) -> String?)\n            -> Disposable where O.E == S  {\n                return { titleForRow in\n                    let adapter = RxStringPickerViewAdapter<S>(titleForRow: titleForRow)\n                    return self.items(adapter: adapter)(source)\n                }\n        }\n        \n        /**\n         Binds sequences of elements to picker view rows.\n         \n         - parameter source: Observable sequence of items.\n         - parameter attributedTitleForRow: Transform between sequence elements and row attributed titles.\n         - returns: Disposable object that can be used to unbind.\n         \n         Example:\n         \n         let items = Observable.just([\n                \"First Item\",\n                \"Second Item\",\n                \"Third Item\"\n            ])\n         \n         items\n            .bind(to: pickerView.rx.itemAttributedTitles) { (row, element) in\n                return NSAttributedString(string: element.title)\n            }\n            .disposed(by: disposeBag)\n        \n         */\n\n        public func itemAttributedTitles<S: Sequence, O: ObservableType>\n            (_ source: O)\n            -> (_ attributedTitleForRow: @escaping (Int, S.Iterator.Element) -> NSAttributedString?)\n            -> Disposable where O.E == S  {\n                return { attributedTitleForRow in\n                    let adapter = RxAttributedStringPickerViewAdapter<S>(attributedTitleForRow: attributedTitleForRow)\n                    return self.items(adapter: adapter)(source)\n                }\n        }\n        \n        /**\n         Binds sequences of elements to picker view rows.\n         \n         - parameter source: Observable sequence of items.\n         - parameter viewForRow: Transform between sequence elements and row views.\n         - returns: Disposable object that can be used to unbind.\n         \n         Example:\n         \n         let items = Observable.just([\n                \"First Item\",\n                \"Second Item\",\n                \"Third Item\"\n            ])\n         \n         items\n            .bind(to: pickerView.rx.items) { (row, element, view) in\n                guard let myView = view as? MyView else {\n                    let view = MyView()\n                    view.configure(with: element)\n                    return view\n                }\n                myView.configure(with: element)\n                return myView\n            }\n            .disposed(by: disposeBag)\n         \n         */\n\n        public func items<S: Sequence, O: ObservableType>\n            (_ source: O)\n            -> (_ viewForRow: @escaping (Int, S.Iterator.Element, UIView?) -> UIView)\n            -> Disposable where O.E == S  {\n                return { viewForRow in\n                    let adapter = RxPickerViewAdapter<S>(viewForRow: viewForRow)\n                    return self.items(adapter: adapter)(source)\n                }\n        }\n        \n        /**\n         Binds sequences of elements to picker view rows using a custom reactive adapter used to perform the transformation.\n         This method will retain the adapter for as long as the subscription isn't disposed (result `Disposable`\n         being disposed).\n         In case `source` observable sequence terminates successfully, the adapter will present latest element\n         until the subscription isn't disposed.\n         \n         - parameter adapter: Adapter used to transform elements to picker components.\n         - parameter source: Observable sequence of items.\n         - returns: Disposable object that can be used to unbind.\n         */\n        public func items<O: ObservableType,\n                          Adapter: RxPickerViewDataSourceType & UIPickerViewDataSource & UIPickerViewDelegate>(adapter: Adapter)\n            -> (_ source: O)\n            -> Disposable where O.E == Adapter.Element {\n                return { source in\n                    let delegateSubscription = self.setDelegate(adapter)\n                    let dataSourceSubscription = source.subscribeProxyDataSource(ofObject: self.base, dataSource: adapter, retainDataSource: true, binding: { [weak pickerView = self.base] (_: RxPickerViewDataSourceProxy, event) in\n                        guard let pickerView = pickerView else { return }\n                        adapter.pickerView(pickerView, observedEvent: event)\n                    })\n                    return Disposables.create(delegateSubscription, dataSourceSubscription)\n                }\n        }\n        \n        /**\n         Synchronous helper method for retrieving a model at indexPath through a reactive data source.\n         */\n        public func model<T>(at indexPath: IndexPath) throws -> T {\n            let dataSource: SectionedViewDataSourceType = castOrFatalError(self.dataSource.forwardToDelegate(), message: \"This method only works in case one of the `rx.itemTitles, rx.itemAttributedTitles, items(_ source: O)` methods was used.\")\n            \n            return castOrFatalError(try dataSource.model(at: indexPath))\n        }\n    }\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIProgressView+Rx.swift",
    "content": "//\n//  UIProgressView+Rx.swift\n//  RxCocoa\n//\n//  Created by Samuel Bae on 2/27/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\nimport UIKit\n\nextension Reactive where Base: UIProgressView {\n\n    /// Bindable sink for `progress` property\n    public var progress: Binder<Float> {\n        return Binder(self.base) { progressView, progress in\n            progressView.progress = progress\n        }\n    }\n\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIRefreshControl+Rx.swift",
    "content": "//\n//  UIRefreshControl+Rx.swift\n//  RxCocoa\n//\n//  Created by Yosuke Ishikawa on 1/31/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\nimport UIKit\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\nextension Reactive where Base: UIRefreshControl {\n    /// Bindable sink for `beginRefreshing()`, `endRefreshing()` methods.\n    public var isRefreshing: Binder<Bool> {\n        return Binder(self.base) { refreshControl, refresh in\n            if refresh {\n                refreshControl.beginRefreshing()\n            } else {\n                refreshControl.endRefreshing()\n            }\n        }\n    }\n\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIScrollView+Rx.swift",
    "content": "//\n//  UIScrollView+Rx.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 4/3/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\n    #if !RX_NO_MODULE\n        import RxSwift\n    #endif\n\n    import UIKit\n\n    extension Reactive where Base: UIScrollView {\n        public typealias EndZoomEvent = (view: UIView?, scale: CGFloat)\n        public typealias WillEndDraggingEvent = (velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>)\n\n        /// Reactive wrapper for `delegate`.\n        ///\n        /// For more information take a look at `DelegateProxyType` protocol documentation.\n        public var delegate: DelegateProxy<UIScrollView, UIScrollViewDelegate> {\n            return RxScrollViewDelegateProxy.proxy(for: base)\n        }\n        \n        /// Reactive wrapper for `contentOffset`.\n        public var contentOffset: ControlProperty<CGPoint> {\n            let proxy = RxScrollViewDelegateProxy.proxy(for: base)\n\n            let bindingObserver = Binder(self.base) { scrollView, contentOffset in\n                scrollView.contentOffset = contentOffset\n            }\n\n            return ControlProperty(values: proxy.contentOffsetBehaviorSubject, valueSink: bindingObserver)\n        }\n\n        /// Bindable sink for `scrollEnabled` property.\n        public var isScrollEnabled: Binder<Bool> {\n            return Binder(self.base) { scrollView, scrollEnabled in\n                scrollView.isScrollEnabled = scrollEnabled\n            }\n        }\n\n        /// Reactive wrapper for delegate method `scrollViewDidScroll`\n        public var didScroll: ControlEvent<Void> {\n            let source = RxScrollViewDelegateProxy.proxy(for: base).contentOffsetPublishSubject\n            return ControlEvent(events: source)\n        }\n        \n        /// Reactive wrapper for delegate method `scrollViewWillBeginDecelerating`\n        public var willBeginDecelerating: ControlEvent<Void> {\n            let source = delegate.methodInvoked(#selector(UIScrollViewDelegate.scrollViewWillBeginDecelerating(_:))).map { _ in }\n            return ControlEvent(events: source)\n        }\n    \t\n    \t/// Reactive wrapper for delegate method `scrollViewDidEndDecelerating`\n    \tpublic var didEndDecelerating: ControlEvent<Void> {\n    \t\tlet source = delegate.methodInvoked(#selector(UIScrollViewDelegate.scrollViewDidEndDecelerating(_:))).map { _ in }\n    \t\treturn ControlEvent(events: source)\n    \t}\n    \t\n        /// Reactive wrapper for delegate method `scrollViewWillBeginDragging`\n        public var willBeginDragging: ControlEvent<Void> {\n            let source = delegate.methodInvoked(#selector(UIScrollViewDelegate.scrollViewWillBeginDragging(_:))).map { _ in }\n            return ControlEvent(events: source)\n        }\n        \n        /// Reactive wrapper for delegate method `scrollViewWillEndDragging(_:withVelocity:targetContentOffset:)`\n        public var willEndDragging: ControlEvent<WillEndDraggingEvent> {\n            let source = delegate.methodInvoked(#selector(UIScrollViewDelegate.scrollViewWillEndDragging(_:withVelocity:targetContentOffset:)))\n                .map { value -> WillEndDraggingEvent in\n                    let velocity = try castOrThrow(CGPoint.self, value[1])\n                    let targetContentOffsetValue = try castOrThrow(NSValue.self, value[2])\n\n                    guard let rawPointer = targetContentOffsetValue.pointerValue else { throw RxCocoaError.unknown }\n                    let typedPointer = rawPointer.bindMemory(to: CGPoint.self, capacity: MemoryLayout<CGPoint>.size)\n\n                    return (velocity, typedPointer)\n            }\n            return ControlEvent(events: source)\n        }\n        \n    \t/// Reactive wrapper for delegate method `scrollViewDidEndDragging(_:willDecelerate:)`\n        public var didEndDragging: ControlEvent<Bool> {\n    \t\tlet source = delegate.methodInvoked(#selector(UIScrollViewDelegate.scrollViewDidEndDragging(_:willDecelerate:))).map { value -> Bool in\n    \t\t\treturn try castOrThrow(Bool.self, value[1])\n    \t\t}\n    \t\treturn ControlEvent(events: source)\n    \t}\n\n        /// Reactive wrapper for delegate method `scrollViewDidZoom`\n        public var didZoom: ControlEvent<Void> {\n            let source = delegate.methodInvoked(#selector(UIScrollViewDelegate.scrollViewDidZoom)).map { _ in }\n            return ControlEvent(events: source)\n        }\n\n\n        /// Reactive wrapper for delegate method `scrollViewDidScrollToTop`\n        public var didScrollToTop: ControlEvent<Void> {\n            let source = delegate.methodInvoked(#selector(UIScrollViewDelegate.scrollViewDidScrollToTop(_:))).map { _ in }\n            return ControlEvent(events: source)\n        }\n        \n        /// Reactive wrapper for delegate method `scrollViewDidEndScrollingAnimation`\n        public var didEndScrollingAnimation: ControlEvent<Void> {\n            let source = delegate.methodInvoked(#selector(UIScrollViewDelegate.scrollViewDidEndScrollingAnimation(_:))).map { _ in }\n            return ControlEvent(events: source)\n        }\n        \n        /// Reactive wrapper for delegate method `scrollViewWillBeginZooming(_:with:)`\n        public var willBeginZooming: ControlEvent<UIView?> {\n            let source = delegate.methodInvoked(#selector(UIScrollViewDelegate.scrollViewWillBeginZooming(_:with:))).map { value -> UIView? in\n                return try castOptionalOrThrow(UIView.self, value[1] as AnyObject)\n            }\n            return ControlEvent(events: source)\n        }\n        \n        /// Reactive wrapper for delegate method `scrollViewDidEndZooming(_:with:atScale:)`\n        public var didEndZooming: ControlEvent<EndZoomEvent> {\n            let source = delegate.methodInvoked(#selector(UIScrollViewDelegate.scrollViewDidEndZooming(_:with:atScale:))).map { value -> EndZoomEvent in\n                return (try castOptionalOrThrow(UIView.self, value[1] as AnyObject), try castOrThrow(CGFloat.self, value[2]))\n            }\n            return ControlEvent(events: source)\n        }\n\n        /// Installs delegate as forwarding delegate on `delegate`.\n        /// Delegate won't be retained.\n        ///\n        /// It enables using normal delegate mechanism with reactive delegate mechanism.\n        ///\n        /// - parameter delegate: Delegate object.\n        /// - returns: Disposable object that can be used to unbind the delegate.\n        public func setDelegate(_ delegate: UIScrollViewDelegate)\n            -> Disposable {\n            return RxScrollViewDelegateProxy.installForwardDelegate(delegate, retainDelegate: false, onProxyForObject: self.base)\n        }\n    }\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UISearchBar+Rx.swift",
    "content": "//\n//  UISearchBar+Rx.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 3/28/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\nimport UIKit\n\nextension Reactive where Base: UISearchBar {\n\n    /// Reactive wrapper for `delegate`.\n    ///\n    /// For more information take a look at `DelegateProxyType` protocol documentation.\n    public var delegate: DelegateProxy<UISearchBar, UISearchBarDelegate> {\n        return RxSearchBarDelegateProxy.proxy(for: base)\n    }\n\n    /// Reactive wrapper for `text` property.\n    public var text: ControlProperty<String?> {\n        return value\n    }\n    \n    /// Reactive wrapper for `text` property.\n    public var value: ControlProperty<String?> {\n        let source: Observable<String?> = Observable.deferred { [weak searchBar = self.base as UISearchBar] () -> Observable<String?> in\n            let text = searchBar?.text\n            \n            return (searchBar?.rx.delegate.methodInvoked(#selector(UISearchBarDelegate.searchBar(_:textDidChange:))) ?? Observable.empty())\n                    .map { a in\n                        return a[1] as? String\n                    }\n                    .startWith(text)\n        }\n\n        let bindingObserver = Binder(self.base) { (searchBar, text: String?) in\n            searchBar.text = text\n        }\n        \n        return ControlProperty(values: source, valueSink: bindingObserver)\n    }\n    \n    /// Reactive wrapper for `selectedScopeButtonIndex` property.\n    public var selectedScopeButtonIndex: ControlProperty<Int> {\n        let source: Observable<Int> = Observable.deferred { [weak source = self.base as UISearchBar] () -> Observable<Int> in\n            let index = source?.selectedScopeButtonIndex ?? 0\n            \n            return (source?.rx.delegate.methodInvoked(#selector(UISearchBarDelegate.searchBar(_:selectedScopeButtonIndexDidChange:))) ?? Observable.empty())\n                .map { a in\n                    return try castOrThrow(Int.self, a[1])\n                }\n                .startWith(index)\n        }\n        \n        let bindingObserver = Binder(self.base) { (searchBar, index: Int) in\n            searchBar.selectedScopeButtonIndex = index\n        }\n        \n        return ControlProperty(values: source, valueSink: bindingObserver)\n    }\n    \n#if os(iOS)\n    /// Reactive wrapper for delegate method `searchBarCancelButtonClicked`.\n    public var cancelButtonClicked: ControlEvent<Void> {\n        let source: Observable<Void> = self.delegate.methodInvoked(#selector(UISearchBarDelegate.searchBarCancelButtonClicked(_:)))\n            .map { _ in\n                return ()\n            }\n        return ControlEvent(events: source)\n    }\n\n\t/// Reactive wrapper for delegate method `searchBarBookmarkButtonClicked`.\n\tpublic var bookmarkButtonClicked: ControlEvent<Void> {\n\t\tlet source: Observable<Void> = self.delegate.methodInvoked(#selector(UISearchBarDelegate.searchBarBookmarkButtonClicked(_:)))\n\t\t\t.map { _ in\n\t\t\t\treturn ()\n\t\t\t}\n\t\treturn ControlEvent(events: source)\n\t}\n\n\t/// Reactive wrapper for delegate method `searchBarResultsListButtonClicked`.\n\tpublic var resultsListButtonClicked: ControlEvent<Void> {\n\t\tlet source: Observable<Void> = self.delegate.methodInvoked(#selector(UISearchBarDelegate.searchBarResultsListButtonClicked(_:)))\n\t\t\t.map { _ in\n\t\t\t\treturn ()\n\t\t}\n\t\treturn ControlEvent(events: source)\n\t}\n#endif\n\t\n    /// Reactive wrapper for delegate method `searchBarSearchButtonClicked`.\n    public var searchButtonClicked: ControlEvent<Void> {\n        let source: Observable<Void> = self.delegate.methodInvoked(#selector(UISearchBarDelegate.searchBarSearchButtonClicked(_:)))\n            .map { _ in\n                return ()\n        }\n        return ControlEvent(events: source)\n    }\n\t\n\t/// Reactive wrapper for delegate method `searchBarTextDidBeginEditing`.\n\tpublic var textDidBeginEditing: ControlEvent<Void> {\n\t\tlet source: Observable<Void> = self.delegate.methodInvoked(#selector(UISearchBarDelegate.searchBarTextDidBeginEditing(_:)))\n\t\t\t.map { _ in\n\t\t\t\treturn ()\n\t\t}\n\t\treturn ControlEvent(events: source)\n\t}\n\t\n\t/// Reactive wrapper for delegate method `searchBarTextDidEndEditing`.\n\tpublic var textDidEndEditing: ControlEvent<Void> {\n\t\tlet source: Observable<Void> = self.delegate.methodInvoked(#selector(UISearchBarDelegate.searchBarTextDidEndEditing(_:)))\n\t\t\t.map { _ in\n\t\t\t\treturn ()\n\t\t}\n\t\treturn ControlEvent(events: source)\n\t}\n\t\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UISearchController+Rx.swift",
    "content": "//\n//  UISearchController+Rx.swift\n//  RxCocoa\n//\n//  Created by Segii Shulga on 3/17/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n    \n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n    import UIKit\n    \n    @available(iOS 8.0, *)\n    extension Reactive where Base: UISearchController {\n        /// Reactive wrapper for `delegate`.\n        /// For more information take a look at `DelegateProxyType` protocol documentation.\n        public var delegate: DelegateProxy<UISearchController, UISearchControllerDelegate> {\n            return RxSearchControllerDelegateProxy.proxy(for: base)\n        }\n\n        /// Reactive wrapper for `delegate` message.\n        public var didDismiss: Observable<Void> {\n            return delegate\n                .methodInvoked( #selector(UISearchControllerDelegate.didDismissSearchController(_:)))\n                .map {_ in}\n        }\n\n        /// Reactive wrapper for `delegate` message.\n        public var didPresent: Observable<Void> {\n            return delegate\n                .methodInvoked(#selector(UISearchControllerDelegate.didPresentSearchController(_:)))\n                .map {_ in}\n        }\n\n        /// Reactive wrapper for `delegate` message.\n        public var present: Observable<Void> {\n            return delegate\n                .methodInvoked( #selector(UISearchControllerDelegate.presentSearchController(_:)))\n                .map {_ in}\n        }\n\n        /// Reactive wrapper for `delegate` message.\n        public var willDismiss: Observable<Void> {\n            return delegate\n                .methodInvoked(#selector(UISearchControllerDelegate.willDismissSearchController(_:)))\n                .map {_ in}\n        }\n        \n        /// Reactive wrapper for `delegate` message.\n        public var willPresent: Observable<Void> {\n            return delegate\n                .methodInvoked( #selector(UISearchControllerDelegate.willPresentSearchController(_:)))\n                .map {_ in}\n        }\n        \n    }\n    \n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UISegmentedControl+Rx.swift",
    "content": "//\n//  UISegmentedControl+Rx.swift\n//  RxCocoa\n//\n//  Created by Carlos García on 8/7/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\n\nextension Reactive where Base: UISegmentedControl {\n    /// Reactive wrapper for `selectedSegmentIndex` property.\n    public var selectedSegmentIndex: ControlProperty<Int> {\n        return value\n    }\n    \n    /// Reactive wrapper for `selectedSegmentIndex` property.\n    public var value: ControlProperty<Int> {\n        return base.rx.controlPropertyWithDefaultEvents(\n            getter: { segmentedControl in\n                segmentedControl.selectedSegmentIndex\n            }, setter: { segmentedControl, value in\n                segmentedControl.selectedSegmentIndex = value\n            }\n        )\n    }\n    \n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UISlider+Rx.swift",
    "content": "//\n//  UISlider+Rx.swift\n//  RxCocoa\n//\n//  Created by Alexander van der Werff on 28/05/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\nimport UIKit\n\nextension Reactive where Base: UISlider {\n    \n    /// Reactive wrapper for `value` property.\n    public var value: ControlProperty<Float> {\n        return base.rx.controlPropertyWithDefaultEvents(\n            getter: { slider in\n                slider.value\n            }, setter: { slider, value in\n                slider.value = value\n            }\n        )\n    }\n    \n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIStepper+Rx.swift",
    "content": "//\n//  UIStepper+Rx.swift\n//  RxCocoa\n//\n//  Created by Yuta ToKoRo on 9/1/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n\nimport UIKit\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\nextension Reactive where Base: UIStepper {\n    \n    /// Reactive wrapper for `value` property.\n    public var value: ControlProperty<Double> {\n        return base.rx.controlPropertyWithDefaultEvents(\n            getter: { stepper in\n                stepper.value\n            }, setter: { stepper, value in\n                stepper.value = value\n            }\n        )\n    }\n    \n}\n\n#endif\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UISwitch+Rx.swift",
    "content": "//\n//  UISwitch+Rx.swift\n//  RxCocoa\n//\n//  Created by Carlos García on 8/7/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n\nimport UIKit\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\n\nextension Reactive where Base: UISwitch {\n\n    /// Reactive wrapper for `isOn` property.\n    public var isOn: ControlProperty<Bool> {\n        return value\n    }\n    \n    /**\n    Reactive wrapper for `isOn` property.\n    \n    **⚠️ Versions prior to iOS 10.2 were leaking `UISwitch`s, so on those versions\n     underlying observable sequence won't complete when nothing holds a strong reference\n     to UISwitch.⚠️**\n    */\n    public var value: ControlProperty<Bool> {\n        return base.rx.controlPropertyWithDefaultEvents(\n            getter: { uiSwitch in\n                uiSwitch.isOn\n            }, setter: { uiSwitch, value in\n                uiSwitch.isOn = value\n            }\n        )\n    }\n    \n}\n\n#endif\n\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UITabBar+Rx.swift",
    "content": "//\n//  UITabBar+Rx.swift\n//  RxCocoa\n//\n//  Created by Jesse Farless on 5/13/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\nimport UIKit\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\n/**\n iOS only\n */\n#if os(iOS)\nextension Reactive where Base: UITabBar {\n\n    /// Reactive wrapper for `delegate` message `tabBar(_:willBeginCustomizing:)`.\n    public var willBeginCustomizing: ControlEvent<[UITabBarItem]> {\n        \n        let source = delegate.methodInvoked(#selector(UITabBarDelegate.tabBar(_:willBeginCustomizing:)))\n            .map { a in\n                return try castOrThrow([UITabBarItem].self, a[1])\n            }\n\n        return ControlEvent(events: source)\n    }\n\n    /// Reactive wrapper for `delegate` message `tabBar(_:didBeginCustomizing:)`.\n    public var didBeginCustomizing: ControlEvent<[UITabBarItem]> {\n        let source = delegate.methodInvoked(#selector(UITabBarDelegate.tabBar(_:didBeginCustomizing:)))\n            .map { a in\n                return try castOrThrow([UITabBarItem].self, a[1])\n            }\n\n        return ControlEvent(events: source)\n    }\n\n    /// Reactive wrapper for `delegate` message `tabBar(_:willEndCustomizing:changed:)`.\n    public var willEndCustomizing: ControlEvent<([UITabBarItem], Bool)> {\n        let source = delegate.methodInvoked(#selector(UITabBarDelegate.tabBar(_:willEndCustomizing:changed:)))\n            .map { (a: [Any]) -> (([UITabBarItem], Bool)) in\n                let items = try castOrThrow([UITabBarItem].self, a[1])\n                let changed = try castOrThrow(Bool.self, a[2])\n                return (items, changed)\n            }\n\n        return ControlEvent(events: source)\n    }\n\n    /// Reactive wrapper for `delegate` message `tabBar(_:didEndCustomizing:changed:)`.\n    public var didEndCustomizing: ControlEvent<([UITabBarItem], Bool)> {\n        let source = delegate.methodInvoked(#selector(UITabBarDelegate.tabBar(_:didEndCustomizing:changed:)))\n            .map { (a: [Any]) -> (([UITabBarItem], Bool)) in\n                let items = try castOrThrow([UITabBarItem].self, a[1])\n                let changed = try castOrThrow(Bool.self, a[2])\n                return (items, changed)\n            }\n\n        return ControlEvent(events: source)\n    }\n\n}\n#endif\n\n/**\n iOS and tvOS\n */\n    \nextension Reactive where Base: UITabBar {\n    /// Reactive wrapper for `delegate`.\n    ///\n    /// For more information take a look at `DelegateProxyType` protocol documentation.\n    public var delegate: DelegateProxy<UITabBar, UITabBarDelegate> {\n        return RxTabBarDelegateProxy.proxy(for: base)\n    }\n\n    /// Reactive wrapper for `delegate` message `tabBar(_:didSelect:)`.\n    public var didSelectItem: ControlEvent<UITabBarItem> {\n        let source = delegate.methodInvoked(#selector(UITabBarDelegate.tabBar(_:didSelect:)))\n            .map { a in\n                return try castOrThrow(UITabBarItem.self, a[1])\n            }\n\n        return ControlEvent(events: source)\n    }\n\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UITabBarController+Rx.swift",
    "content": "//\n//  UITabBarController+Rx.swift\n//  RxCocoa\n//\n//  Created by Yusuke Kita on 2016/12/07.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\nimport UIKit\n    \n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n    \n/**\n iOS only\n */\n#if os(iOS)\nextension Reactive where Base: UITabBarController {\n    \n    /// Reactive wrapper for `delegate` message `tabBarController:willBeginCustomizing:`.\n    public var willBeginCustomizing: ControlEvent<[UIViewController]> {\n        let source = delegate.methodInvoked(#selector(UITabBarControllerDelegate.tabBarController(_:willBeginCustomizing:)))\n            .map { a in\n                return try castOrThrow([UIViewController].self, a[1])\n        }\n        \n        return ControlEvent(events: source)\n    }\n    \n    /// Reactive wrapper for `delegate` message `tabBarController:willEndCustomizing:changed:`.\n    public var willEndCustomizing: ControlEvent<(viewControllers: [UIViewController], changed: Bool)> {\n        let source = delegate.methodInvoked(#selector(UITabBarControllerDelegate.tabBarController(_:willEndCustomizing:changed:)))\n            .map { (a: [Any]) -> (viewControllers: [UIViewController], changed: Bool) in\n                let viewControllers = try castOrThrow([UIViewController].self, a[1])\n                let changed = try castOrThrow(Bool.self, a[2])\n                return (viewControllers, changed)\n        }\n        \n        return ControlEvent(events: source)\n    }\n    \n    /// Reactive wrapper for `delegate` message `tabBarController:didEndCustomizing:changed:`.\n    public var didEndCustomizing: ControlEvent<(viewControllers: [UIViewController], changed: Bool)> {\n        let source = delegate.methodInvoked(#selector(UITabBarControllerDelegate.tabBarController(_:didEndCustomizing:changed:)))\n            .map { (a: [Any]) -> (viewControllers: [UIViewController], changed: Bool) in\n                let viewControllers = try castOrThrow([UIViewController].self, a[1])\n                let changed = try castOrThrow(Bool.self, a[2])\n                return (viewControllers, changed)\n        }\n        \n        return ControlEvent(events: source)\n    }\n}\n#endif\n    \n/**\n iOS and tvOS\n */\n\n    extension Reactive where Base: UITabBarController {\n    /// Reactive wrapper for `delegate`.\n    ///\n    /// For more information take a look at `DelegateProxyType` protocol documentation.\n    public var delegate: DelegateProxy<UITabBarController, UITabBarControllerDelegate> {\n        return RxTabBarControllerDelegateProxy.proxy(for: base)\n    }\n    \n    /// Reactive wrapper for `delegate` message `tabBarController:didSelect:`.\n    public var didSelect: ControlEvent<UIViewController> {\n        let source = delegate.methodInvoked(#selector(UITabBarControllerDelegate.tabBarController(_:didSelect:)))\n            .map { a in\n                return try castOrThrow(UIViewController.self, a[1])\n        }\n        \n        return ControlEvent(events: source)\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UITabBarItem+Rx.swift",
    "content": "//\n//  UITabBarItem+Rx.swift\n//  RxCocoa\n//\n//  Created by Mateusz Derks on 04/03/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n    \n    import UIKit\n#if !RX_NO_MODULE\n    import RxSwift\n#endif\n    \nextension Reactive where Base: UITabBarItem {\n    \n    /// Bindable sink for `badgeValue` property.\n    public var badgeValue: Binder<String?> {\n        return Binder(self.base) { tabBarItem, badgeValue in\n            tabBarItem.badgeValue = badgeValue\n        }\n    }\n    \n}\n    \n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UITableView+Rx.swift",
    "content": "//\n//  UITableView+Rx.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 4/2/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\nimport UIKit\n\n// Items\n\nextension Reactive where Base: UITableView {\n\n    /**\n    Binds sequences of elements to table view rows.\n    \n    - parameter source: Observable sequence of items.\n    - parameter cellFactory: Transform between sequence elements and view cells.\n    - returns: Disposable object that can be used to unbind.\n     \n     Example:\n    \n         let items = Observable.just([\n             \"First Item\",\n             \"Second Item\",\n             \"Third Item\"\n         ])\n\n         items\n         .bind(to: tableView.rx.items) { (tableView, row, element) in\n             let cell = tableView.dequeueReusableCell(withIdentifier: \"Cell\")!\n             cell.textLabel?.text = \"\\(element) @ row \\(row)\"\n             return cell\n         }\n         .disposed(by: disposeBag)\n\n     */\n    public func items<S: Sequence, O: ObservableType>\n        (_ source: O)\n        -> (_ cellFactory: @escaping (UITableView, Int, S.Iterator.Element) -> UITableViewCell)\n        -> Disposable\n        where O.E == S {\n            return { cellFactory in\n                let dataSource = RxTableViewReactiveArrayDataSourceSequenceWrapper<S>(cellFactory: cellFactory)\n                return self.items(dataSource: dataSource)(source)\n            }\n    }\n\n    /**\n    Binds sequences of elements to table view rows.\n    \n    - parameter cellIdentifier: Identifier used to dequeue cells.\n    - parameter source: Observable sequence of items.\n    - parameter configureCell: Transform between sequence elements and view cells.\n    - parameter cellType: Type of table view cell.\n    - returns: Disposable object that can be used to unbind.\n     \n     Example:\n\n         let items = Observable.just([\n             \"First Item\",\n             \"Second Item\",\n             \"Third Item\"\n         ])\n\n         items\n             .bind(to: tableView.rx.items(cellIdentifier: \"Cell\", cellType: UITableViewCell.self)) { (row, element, cell) in\n                cell.textLabel?.text = \"\\(element) @ row \\(row)\"\n             }\n             .disposed(by: disposeBag)\n    */\n    public func items<S: Sequence, Cell: UITableViewCell, O : ObservableType>\n        (cellIdentifier: String, cellType: Cell.Type = Cell.self)\n        -> (_ source: O)\n        -> (_ configureCell: @escaping (Int, S.Iterator.Element, Cell) -> Void)\n        -> Disposable\n        where O.E == S {\n        return { source in\n            return { configureCell in\n                let dataSource = RxTableViewReactiveArrayDataSourceSequenceWrapper<S> { (tv, i, item) in\n                    let indexPath = IndexPath(item: i, section: 0)\n                    let cell = tv.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! Cell\n                    configureCell(i, item, cell)\n                    return cell\n                }\n                return self.items(dataSource: dataSource)(source)\n            }\n        }\n    }\n\n\n    /**\n    Binds sequences of elements to table view rows using a custom reactive data used to perform the transformation.\n    This method will retain the data source for as long as the subscription isn't disposed (result `Disposable` \n    being disposed).\n    In case `source` observable sequence terminates successfully, the data source will present latest element\n    until the subscription isn't disposed.\n    \n    - parameter dataSource: Data source used to transform elements to view cells.\n    - parameter source: Observable sequence of items.\n    - returns: Disposable object that can be used to unbind.\n     \n     Example \n\n        let dataSource = RxTableViewSectionedReloadDataSource<SectionModel<String, Double>>()\n\n        let items = Observable.just([\n            SectionModel(model: \"First section\", items: [\n                1.0,\n                2.0,\n                3.0\n                ]),\n            SectionModel(model: \"Second section\", items: [\n                1.0,\n                2.0,\n                3.0\n                ]),\n            SectionModel(model: \"Third section\", items: [\n                1.0,\n                2.0,\n                3.0\n                ])\n            ])\n\n        dataSource.configureCell = { (dataSource, tv, indexPath, element) in\n            let cell = tv.dequeueReusableCell(withIdentifier: \"Cell\")!\n            cell.textLabel?.text = \"\\(element) @ row \\(indexPath.row)\"\n            return cell\n        }\n\n        items\n            .bind(to: tableView.rx.items(dataSource: dataSource))\n            .disposed(by: disposeBag)\n    */\n    public func items<\n            DataSource: RxTableViewDataSourceType & UITableViewDataSource,\n            O: ObservableType>\n        (dataSource: DataSource)\n        -> (_ source: O)\n        -> Disposable\n        where DataSource.Element == O.E {\n        return { source in\n            // This is called for sideeffects only, and to make sure delegate proxy is in place when\n            // data source is being bound.\n            // This is needed because theoretically the data source subscription itself might\n            // call `self.rx.delegate`. If that happens, it might cause weird side effects since\n            // setting data source will set delegate, and UITableView might get into a weird state.\n            // Therefore it's better to set delegate proxy first, just to be sure.\n            _ = self.delegate\n            // Strong reference is needed because data source is in use until result subscription is disposed\n            return source.subscribeProxyDataSource(ofObject: self.base, dataSource: dataSource as UITableViewDataSource, retainDataSource: true) { [weak tableView = self.base] (_: RxTableViewDataSourceProxy, event) -> Void in\n                guard let tableView = tableView else {\n                    return\n                }\n                dataSource.tableView(tableView, observedEvent: event)\n            }\n        }\n    }\n\n}\n\nextension Reactive where Base: UITableView {\n    /**\n    Reactive wrapper for `dataSource`.\n    \n    For more information take a look at `DelegateProxyType` protocol documentation.\n    */\n    public var dataSource: DelegateProxy<UITableView, UITableViewDataSource> {\n        return RxTableViewDataSourceProxy.proxy(for: base)\n    }\n   \n    /**\n    Installs data source as forwarding delegate on `rx.dataSource`.\n    Data source won't be retained.\n    \n    It enables using normal delegate mechanism with reactive delegate mechanism.\n     \n    - parameter dataSource: Data source object.\n    - returns: Disposable object that can be used to unbind the data source.\n    */\n    public func setDataSource(_ dataSource: UITableViewDataSource)\n        -> Disposable {\n        return RxTableViewDataSourceProxy.installForwardDelegate(dataSource, retainDelegate: false, onProxyForObject: self.base)\n    }\n    \n    // events\n    \n    /**\n    Reactive wrapper for `delegate` message `tableView:didSelectRowAtIndexPath:`.\n    */\n    public var itemSelected: ControlEvent<IndexPath> {\n        let source = self.delegate.methodInvoked(#selector(UITableViewDelegate.tableView(_:didSelectRowAt:)))\n            .map { a in\n                return try castOrThrow(IndexPath.self, a[1])\n            }\n\n        return ControlEvent(events: source)\n    }\n\n    /**\n     Reactive wrapper for `delegate` message `tableView:didDeselectRowAtIndexPath:`.\n     */\n    public var itemDeselected: ControlEvent<IndexPath> {\n        let source = self.delegate.methodInvoked(#selector(UITableViewDelegate.tableView(_:didDeselectRowAt:)))\n            .map { a in\n                return try castOrThrow(IndexPath.self, a[1])\n            }\n\n        return ControlEvent(events: source)\n    }\n\n    /**\n     Reactive wrapper for `delegate` message `tableView:accessoryButtonTappedForRowWithIndexPath:`.\n     */\n    public var itemAccessoryButtonTapped: ControlEvent<IndexPath> {\n        let source: Observable<IndexPath> = self.delegate.methodInvoked(#selector(UITableViewDelegate.tableView(_:accessoryButtonTappedForRowWith:)))\n            .map { a in\n                return try castOrThrow(IndexPath.self, a[1])\n            }\n        \n        return ControlEvent(events: source)\n    }\n    \n    /**\n    Reactive wrapper for `delegate` message `tableView:commitEditingStyle:forRowAtIndexPath:`.\n    */\n    public var itemInserted: ControlEvent<IndexPath> {\n        let source = self.dataSource.methodInvoked(#selector(UITableViewDataSource.tableView(_:commit:forRowAt:)))\n            .filter { a in\n                return UITableViewCellEditingStyle(rawValue: (try castOrThrow(NSNumber.self, a[1])).intValue) == .insert\n            }\n            .map { a in\n                return (try castOrThrow(IndexPath.self, a[2]))\n        }\n        \n        return ControlEvent(events: source)\n    }\n    \n    /**\n    Reactive wrapper for `delegate` message `tableView:commitEditingStyle:forRowAtIndexPath:`.\n    */\n    public var itemDeleted: ControlEvent<IndexPath> {\n        let source = self.dataSource.methodInvoked(#selector(UITableViewDataSource.tableView(_:commit:forRowAt:)))\n            .filter { a in\n                return UITableViewCellEditingStyle(rawValue: (try castOrThrow(NSNumber.self, a[1])).intValue) == .delete\n            }\n            .map { a in\n                return try castOrThrow(IndexPath.self, a[2])\n            }\n        \n        return ControlEvent(events: source)\n    }\n    \n    /**\n    Reactive wrapper for `delegate` message `tableView:moveRowAtIndexPath:toIndexPath:`.\n    */\n    public var itemMoved: ControlEvent<ItemMovedEvent> {\n        let source: Observable<ItemMovedEvent> = self.dataSource.methodInvoked(#selector(UITableViewDataSource.tableView(_:moveRowAt:to:)))\n            .map { a in\n                return (try castOrThrow(IndexPath.self, a[1]), try castOrThrow(IndexPath.self, a[2]))\n            }\n        \n        return ControlEvent(events: source)\n    }\n\n    /**\n    Reactive wrapper for `delegate` message `tableView:willDisplayCell:forRowAtIndexPath:`.\n    */\n    public var willDisplayCell: ControlEvent<WillDisplayCellEvent> {\n        let source: Observable<WillDisplayCellEvent> = self.delegate.methodInvoked(#selector(UITableViewDelegate.tableView(_:willDisplay:forRowAt:)))\n            .map { a in\n                return (try castOrThrow(UITableViewCell.self, a[1]), try castOrThrow(IndexPath.self, a[2]))\n            }\n\n        return ControlEvent(events: source)\n    }\n\n    /**\n    Reactive wrapper for `delegate` message `tableView:didEndDisplayingCell:forRowAtIndexPath:`.\n    */\n    public var didEndDisplayingCell: ControlEvent<DidEndDisplayingCellEvent> {\n        let source: Observable<DidEndDisplayingCellEvent> = self.delegate.methodInvoked(#selector(UITableViewDelegate.tableView(_:didEndDisplaying:forRowAt:)))\n            .map { a in\n                return (try castOrThrow(UITableViewCell.self, a[1]), try castOrThrow(IndexPath.self, a[2]))\n            }\n\n        return ControlEvent(events: source)\n    }\n\n    /**\n    Reactive wrapper for `delegate` message `tableView:didSelectRowAtIndexPath:`.\n    \n    It can be only used when one of the `rx.itemsWith*` methods is used to bind observable sequence,\n    or any other data source conforming to `SectionedViewDataSourceType` protocol.\n    \n     ```\n        tableView.rx.modelSelected(MyModel.self)\n            .map { ...\n     ```\n    */\n    public func modelSelected<T>(_ modelType: T.Type) -> ControlEvent<T> {\n        let source: Observable<T> = self.itemSelected.flatMap { [weak view = self.base as UITableView] indexPath -> Observable<T> in\n            guard let view = view else {\n                return Observable.empty()\n            }\n\n            return Observable.just(try view.rx.model(at: indexPath))\n        }\n        \n        return ControlEvent(events: source)\n    }\n\n    /**\n     Reactive wrapper for `delegate` message `tableView:didDeselectRowAtIndexPath:`.\n\n     It can be only used when one of the `rx.itemsWith*` methods is used to bind observable sequence,\n     or any other data source conforming to `SectionedViewDataSourceType` protocol.\n\n     ```\n        tableView.rx.modelDeselected(MyModel.self)\n            .map { ...\n     ```\n     */\n    public func modelDeselected<T>(_ modelType: T.Type) -> ControlEvent<T> {\n         let source: Observable<T> = self.itemDeselected.flatMap { [weak view = self.base as UITableView] indexPath -> Observable<T> in\n             guard let view = view else {\n                 return Observable.empty()\n             }\n\n            return Observable.just(try view.rx.model(at: indexPath))\n        }\n\n        return ControlEvent(events: source)\n    }\n    \n    /**\n     Reactive wrapper for `delegate` message `tableView:commitEditingStyle:forRowAtIndexPath:`.\n     \n     It can be only used when one of the `rx.itemsWith*` methods is used to bind observable sequence,\n     or any other data source conforming to `SectionedViewDataSourceType` protocol.\n     \n     ```\n        tableView.rx.modelDeleted(MyModel.self)\n            .map { ...\n     ```\n     */\n    public func modelDeleted<T>(_ modelType: T.Type) -> ControlEvent<T> {\n        let source: Observable<T> = self.itemDeleted.flatMap { [weak view = self.base as UITableView] indexPath -> Observable<T> in\n            guard let view = view else {\n                return Observable.empty()\n            }\n            \n            return Observable.just(try view.rx.model(at: indexPath))\n        }\n        \n        return ControlEvent(events: source)\n    }\n\n    /**\n     Synchronous helper method for retrieving a model at indexPath through a reactive data source.\n     */\n    public func model<T>(at indexPath: IndexPath) throws -> T {\n        let dataSource: SectionedViewDataSourceType = castOrFatalError(self.dataSource.forwardToDelegate(), message: \"This method only works in case one of the `rx.items*` methods was used.\")\n        \n        let element = try dataSource.model(at: indexPath)\n\n        return castOrFatalError(element)\n    }\n}\n\n#endif\n\n#if os(tvOS)\n    \n    extension Reactive where Base: UITableView {\n        \n        /**\n         Reactive wrapper for `delegate` message `tableView:didUpdateFocusInContext:withAnimationCoordinator:`.\n         */\n        public var didUpdateFocusInContextWithAnimationCoordinator: ControlEvent<(context: UITableViewFocusUpdateContext, animationCoordinator: UIFocusAnimationCoordinator)> {\n            \n            let source = delegate.methodInvoked(#selector(UITableViewDelegate.tableView(_:didUpdateFocusIn:with:)))\n                .map { a -> (context: UITableViewFocusUpdateContext, animationCoordinator: UIFocusAnimationCoordinator) in\n                    let context = a[1] as! UITableViewFocusUpdateContext\n                    let animationCoordinator = try castOrThrow(UIFocusAnimationCoordinator.self, a[2])\n                    return (context: context, animationCoordinator: animationCoordinator)\n            }\n            \n            return ControlEvent(events: source)\n        }\n    }\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UITextField+Rx.swift",
    "content": "//\n//  UITextField+Rx.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 2/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\nimport UIKit\n\nextension Reactive where Base: UITextField {\n    /// Reactive wrapper for `text` property.\n    public var text: ControlProperty<String?> {\n        return value\n    }\n    \n    /// Reactive wrapper for `text` property.\n    public var value: ControlProperty<String?> {\n        return base.rx.controlPropertyWithDefaultEvents(\n            getter: { textField in\n                textField.text\n            },\n            setter: { textField, value in\n                // This check is important because setting text value always clears control state\n                // including marked text selection which is imporant for proper input \n                // when IME input method is used.\n                if textField.text != value {\n                    textField.text = value\n                }\n            }\n        )\n    }\n    \n    /// Bindable sink for `attributedText` property.\n    public var attributedText: ControlProperty<NSAttributedString?> {\n        return base.rx.controlPropertyWithDefaultEvents(\n            getter: { textField in\n                textField.attributedText\n            },\n            setter: { textField, value in\n                // This check is important because setting text value always clears control state\n                // including marked text selection which is imporant for proper input\n                // when IME input method is used.\n                if textField.attributedText != value {\n                    textField.attributedText = value\n                }\n            }\n        )\n    }\n    \n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UITextView+Rx.swift",
    "content": "//\n//  UITextView+Rx.swift\n//  RxCocoa\n//\n//  Created by Yuta ToKoRo on 7/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\nextension Reactive where Base: UITextView {\n    /// Reactive wrapper for `text` property\n    public var text: ControlProperty<String?> {\n        return value\n    }\n    \n    /// Reactive wrapper for `text` property.\n    public var value: ControlProperty<String?> {\n        let source: Observable<String?> = Observable.deferred { [weak textView = self.base] in\n            let text = textView?.text\n            \n            let textChanged = textView?.textStorage\n                // This project uses text storage notifications because\n                // that's the only way to catch autocorrect changes\n                // in all cases. Other suggestions are welcome.\n                .rx.didProcessEditingRangeChangeInLength\n                // This observe on is here because text storage\n                // will emit event while process is not completely done,\n                // so rebinding a value will cause an exception to be thrown.\n                .observeOn(MainScheduler.asyncInstance)\n                .map { _ in\n                    return textView?.textStorage.string\n                }\n                ?? Observable.empty()\n            \n            return textChanged\n                .startWith(text)\n        }\n\n        let bindingObserver = Binder(self.base) { (textView, text: String?) in\n            // This check is important because setting text value always clears control state\n            // including marked text selection which is imporant for proper input \n            // when IME input method is used.\n            if textView.text != text {\n                textView.text = text\n            }\n        }\n        \n        return ControlProperty(values: source, valueSink: bindingObserver)\n    }\n    \n    \n    /// Reactive wrapper for `attributedText` property.\n    public var attributedText: ControlProperty<NSAttributedString?> {\n        let source: Observable<NSAttributedString?> = Observable.deferred { [weak textView = self.base] in\n            let attributedText = textView?.attributedText\n            \n            let textChanged: Observable<NSAttributedString?> = textView?.textStorage\n                // This project uses text storage notifications because\n                // that's the only way to catch autocorrect changes\n                // in all cases. Other suggestions are welcome.\n                .rx.didProcessEditingRangeChangeInLength\n                // This observe on is here because attributedText storage\n                // will emit event while process is not completely done,\n                // so rebinding a value will cause an exception to be thrown.\n                .observeOn(MainScheduler.asyncInstance)\n                .map { _ in\n                    return textView?.attributedText\n                }\n                ?? Observable.empty()\n            \n            return textChanged\n                .startWith(attributedText)\n        }\n        \n        let bindingObserver = Binder(self.base) { (textView, attributedText: NSAttributedString?) in\n            // This check is important because setting text value always clears control state\n            // including marked text selection which is imporant for proper input\n            // when IME input method is used.\n            if textView.attributedText != attributedText {\n                textView.attributedText = attributedText\n            }\n        }\n        \n        return ControlProperty(values: source, valueSink: bindingObserver)\n    }\n\n    /// Reactive wrapper for `delegate` message.\n    public var didBeginEditing: ControlEvent<()> {\n       return ControlEvent<()>(events: self.delegate.methodInvoked(#selector(UITextViewDelegate.textViewDidBeginEditing(_:)))\n            .map { a in\n                return ()\n            })\n    }\n\n    /// Reactive wrapper for `delegate` message.\n    public var didEndEditing: ControlEvent<()> {\n        return ControlEvent<()>(events: self.delegate.methodInvoked(#selector(UITextViewDelegate.textViewDidEndEditing(_:)))\n            .map { a in\n                return ()\n            })\n    }\n\n    /// Reactive wrapper for `delegate` message.\n    public var didChange: ControlEvent<()> {\n        return ControlEvent<()>(events: self.delegate.methodInvoked(#selector(UITextViewDelegate.textViewDidChange(_:)))\n            .map { a in\n                return ()\n            })\n    }\n\n    /// Reactive wrapper for `delegate` message.\n    public var didChangeSelection: ControlEvent<()> {\n        return ControlEvent<()>(events: self.delegate.methodInvoked(#selector(UITextViewDelegate.textViewDidChangeSelection(_:)))\n            .map { a in\n                return ()\n            })\n    }\n\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIView+Rx.swift",
    "content": "//\n//  UIView+Rx.swift\n//  RxCocoa\n//\n//  Created by Krunoslav Zaher on 12/6/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n\nimport UIKit\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\nextension Reactive where Base: UIView {\n    /// Bindable sink for `hidden` property.\n    public var isHidden: Binder<Bool> {\n        return Binder(self.base) { view, hidden in\n            view.isHidden = hidden\n        }\n    }\n\n    /// Bindable sink for `alpha` property.\n    public var alpha: Binder<CGFloat> {\n        return Binder(self.base) { view, alpha in\n            view.alpha = alpha\n        }\n    }\n\n    /// Bindable sink for `isUserInteractionEnabled` property.\n    public var isUserInteractionEnabled: Binder<Bool> {\n        return Binder(self.base) { view, userInteractionEnabled in\n            view.isUserInteractionEnabled = userInteractionEnabled\n        }\n    }\n    \n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIViewController+Rx.swift",
    "content": "//\n//  UIViewController+Rx.swift\n//  RxCocoa\n//\n//  Created by Kyle Fuller on 27/05/2016.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n  import UIKit\n\n#if !RX_NO_MODULE\n  import RxSwift\n#endif\n\n    extension Reactive where Base: UIViewController {\n\n        /// Bindable sink for `title`.\n        public var title: Binder<String> {\n            return Binder(self.base) { viewController, title in\n                viewController.title = title\n            }\n        }\n    \n    }\n#endif\n"
  },
  {
    "path": "Pods/RxCocoa/RxCocoa/iOS/UIWebView+Rx.swift",
    "content": "//\n//  UIWebView+Rx.swift\n//  RxCocoa\n//\n//  Created by Andrew Breckenridge on 8/30/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS)\n\nimport UIKit\n\n#if !RX_NO_MODULE\nimport RxSwift\n#endif\n\n    extension Reactive where Base: UIWebView {\n\n        /// Reactive wrapper for `delegate`.\n        /// For more information take a look at `DelegateProxyType` protocol documentation.\n        public var delegate: DelegateProxy<UIWebView, UIWebViewDelegate> {\n            return RxWebViewDelegateProxy.proxy(for: base)\n        }\n\n        /// Reactive wrapper for `delegate` message.\n        public var didStartLoad: Observable<Void> {\n            return delegate\n                .methodInvoked(#selector(UIWebViewDelegate.webViewDidStartLoad(_:)))\n                .map {_ in}\n        }\n\n        /// Reactive wrapper for `delegate` message.\n        public var didFinishLoad: Observable<Void> {\n            return delegate\n                .methodInvoked(#selector(UIWebViewDelegate.webViewDidFinishLoad(_:)))\n                .map {_ in}\n        }\n        \n        /// Reactive wrapper for `delegate` message.\n        public var didFailLoad: Observable<Error> {\n            return delegate\n                .methodInvoked(#selector(UIWebViewDelegate.webView(_:didFailLoadWithError:)))\n                .map { a in\n                    return try castOrThrow(Error.self, a[1])\n                }\n        }\n    }\n\n#endif\n"
  },
  {
    "path": "Pods/RxDataSources/LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2017 RxSwift Community\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Pods/RxDataSources/README.md",
    "content": "[![Travis CI](https://travis-ci.org/RxSwiftCommunity/RxDataSources.svg?branch=master)](https://travis-ci.org/RxSwiftCommunity/RxDataSources)\n\nTable and Collection view data sources\n======================================\n\n## Features\n\n- [x] **O(N)** algorithm for calculating differences\n  - the algorithm has the assumption that all sections and items are unique so there is no ambiguity\n  - in case there is ambiguity, fallbacks automagically on non animated refresh\n- [x] it applies additional heuristics to send the least number of commands to sectioned view\n  - even though the running time is linear, preferred number of sent commands is usually a lot less than linear\n  - it is preferred (and possible) to cap the number of changes to some small number, and in case the number of changes grows towards linear, just do normal reload\n- [x] Supports **extending your item and section structures**\n  - just extend your item with `IdentifiableType` and `Equatable`, and your section with `AnimatableSectionModelType`\n- [x] Supports all combinations of two level hierarchical animations for **both sections and items**\n  - Section animations: Insert, Delete, Move\n  - Item animations: Insert, Delete, Move, Reload (if old value is not equal to new value)\n- [x] Configurable animation types for `Insert`, `Reload` and `Delete` (Automatic, Fade, ...)\n- [x] Example app\n- [x] Randomized stress tests (example app)\n- [x] Supports editing out of the box (example app)\n- [x] Works with `UITableView` and `UICollectionView`\n\n## Why\nWriting table and collection view data sources is tedious. There is a large number of delegate methods that need to be implemented for the simplest case possible.\n\nRxSwift helps alleviate some of the burden with a simple data binding mechanism:\n1) Turn your data into an Observable sequence\n2) Bind the data to the tableView/collectionView using one of:\n  - `rx.items(dataSource:protocol<RxTableViewDataSourceType, UITableViewDataSource>)`\n  - `rx.items(cellIdentifier:String)`\n  - `rx.items(cellIdentifier:String:Cell.Type:_:)`\n  - `rx.items(_:_:)`\n\n```swift\nlet data = Observable<[String]>.just([\"first element\", \"second element\", \"third element\"])\n\ndata.bind(to: tableView.rx.items(cellIdentifier: \"Cell\")) { index, model, cell in\n  cell.textLabel?.text = model\n}\n.disposed(by: disposeBag)\n```\n\nThis works well with simple data sets but does not handle cases where you need to bind complex data sets with multiples sections, or when you need to perform animations when adding/modifying/deleting items.  \n\nThese are precisely the use cases that RxDataSources helps solve.\n\nWith RxDataSources, it is super easy to just write\n\n```swift\nlet dataSource = RxTableViewSectionedReloadDataSource<SectionModel<String, Int>>()\nObservable.just([SectionModel(model: \"title\", items: [1, 2, 3])])\n    .bind(to: tableView.rx.items(dataSource: dataSource))\n    .disposed(by: disposeBag)\n```\n![RxDataSources example app](https://raw.githubusercontent.com/kzaher/rxswiftcontent/rxdatasources/RxDataSources.gif)\n\n## How\nGiven the following custom data structure:\n```swift\nstruct CustomData {\n  var anInt: Int\n  var aString: String\n  var aCGPoint: CGPoint\n}\n```\n\n1) Start by defining your sections with a struct that conforms to the `SectionModelType` protocol:\n  - define the `Item` typealias: equal to the type of items that the section will contain\n  - declare an `items` property: of type array of `Item`\n\n```swift\nstruct SectionOfCustomData {\n  var header: String    \n  var items: [Item]\n}\nextension SectionOfCustomData: SectionModelType {\n  typealias Item = CustomData\n  \n   init(original: SectionOfCustomData, items: [Item]) {\n    self = original\n    self.items = items\n  } \n}\n```\n\n2) Create a dataSource object and pass it your `SectionOfCustomData` type:\n```swift \nlet dataSource = RxTableViewSectionedReloadDataSource<SectionOfCustomData>()\n```\n\n3) Customize closures on the dataSource as needed:\n- `configureCell` (required)\n- `titleForHeaderInSection`\n- `titleForFooterInSection`\n- etc\n\n```swift \ndataSource.configureCell = { (ds: RxTableViewSectionedReloadDataSource<SectionOfCustomData>, tv: UITableView, ip: IndexPath, item: Item) in\n  let cell = tv.dequeueReusableCell(withIdentifier: \"Cell\", for: ip)\n  cell.textLabel?.text = \"Item \\(item.anInt): \\(item.aString) - \\(item.aCGPoint.x):\\(item.aCGPoint.y)\"\n  return cell\n}\ndataSource.titleForHeaderInSection = { ds, index in\n  return ds.sectionModels[index].header\n}\n```\n\n4) Define the actual data as an Observable sequence of CustomData objects and bind it to the tableView\n```swift \nlet sections = [\n  SectionOfCustomData(header: \"First section\", items: [CustomData(anInt: 0, aString: \"zero\", aCGPoint: CGPoint.zero), CustomData(anInt: 1, aString: \"one\", aCGPoint: CGPoint(x: 1, y: 1)) ]),\n  SectionOfCustomData(header: \"Second section\", items: [CustomData(anInt: 2, aString: \"two\", aCGPoint: CGPoint(x: 2, y: 2)), CustomData(anInt: 3, aString: \"three\", aCGPoint: CGPoint(x: 3, y: 3)) ])\n]\n\nObservable.just(sections)\n  .bind(to: tableView.rx.items(dataSource: dataSource))\n  .disposed(by: disposeBag)\n```\n\n\n### Animations\nTo implement animations with RxDataSources, the same steps are required as with non-animated data, execept:\n- SectionOfCustomData needs to conform to `AnimatableSectionModelType`\n- dataSource needs to be an instance of `RxTableViewSectionedAnimatedDataSource` or `RxCollectionViewSectionedAnimatedDataSource`\n\n\n## Requirements\n\nXcode 9.0\n\nSwift 4.0\n\nFor Swift 3.x version please use versions `1.0 ... 2.0.2`\nFor Swift 2.3 version please use versions `0.1 ... 0.9`\n\n## Installation\n\n**We'll try to keep the API as stable as possible, but breaking API changes can occur.**\n\n### CocoaPods\n\nPodfile\n```\npod 'RxDataSources', '~> 3.0'\n```\n\n### Carthage\n\nCartfile\n```\ngithub \"RxSwiftCommunity/RxDataSources\" ~> 3.0\n```\n"
  },
  {
    "path": "Pods/RxDataSources/Sources/RxDataSources/AnimationConfiguration.swift",
    "content": "//\n//  AnimationConfiguration.swift\n//  RxDataSources\n//\n//  Created by Esteban Torres on 5/2/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\n    import Foundation\n    import UIKit\n\n    /**\n     Exposes custom animation styles for insertion, deletion and reloading behavior.\n     */\n    public struct AnimationConfiguration {\n        public let insertAnimation: UITableViewRowAnimation\n        public let reloadAnimation: UITableViewRowAnimation\n        public let deleteAnimation: UITableViewRowAnimation\n\n        public init(insertAnimation: UITableViewRowAnimation = .automatic,\n                    reloadAnimation: UITableViewRowAnimation = .automatic,\n                    deleteAnimation: UITableViewRowAnimation = .automatic) {\n            self.insertAnimation = insertAnimation\n            self.reloadAnimation = reloadAnimation\n            self.deleteAnimation = deleteAnimation\n        }\n    }\n#endif\n"
  },
  {
    "path": "Pods/RxDataSources/Sources/RxDataSources/Array+Extensions.swift",
    "content": "//\n//  Array+Extensions.swift\n//  RxDataSources\n//\n//  Created by Krunoslav Zaher on 4/26/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\nimport Foundation\n\nextension Array where Element: SectionModelType {\n    mutating func moveFromSourceIndexPath(_ sourceIndexPath: IndexPath, destinationIndexPath: IndexPath) {\n        let sourceSection = self[sourceIndexPath.section]\n        var sourceItems = sourceSection.items\n\n        let sourceItem = sourceItems.remove(at: sourceIndexPath.item)\n\n        let sourceSectionNew = Element(original: sourceSection, items: sourceItems)\n        self[sourceIndexPath.section] = sourceSectionNew\n\n        let destinationSection = self[destinationIndexPath.section]\n        var destinationItems = destinationSection.items\n        destinationItems.insert(sourceItem, at: destinationIndexPath.item)\n\n        self[destinationIndexPath.section] = Element(original: destinationSection, items: destinationItems)\n    }\n}\n#endif\n"
  },
  {
    "path": "Pods/RxDataSources/Sources/RxDataSources/CollectionViewSectionedDataSource.swift",
    "content": "//\n//  CollectionViewSectionedDataSource.swift\n//  RxDataSources\n//\n//  Created by Krunoslav Zaher on 7/2/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\nimport Foundation\nimport UIKit\n#if !RX_NO_MODULE\nimport RxCocoa\n#endif\nimport Differentiator\n    \nopen class CollectionViewSectionedDataSource<S: SectionModelType>\n    : NSObject\n    , UICollectionViewDataSource\n    , SectionedViewDataSourceType {\n    public typealias I = S.Item\n    public typealias Section = S\n    public typealias ConfigureCell = (CollectionViewSectionedDataSource<S>, UICollectionView, IndexPath, I) -> UICollectionViewCell\n    public typealias ConfigureSupplementaryView = (CollectionViewSectionedDataSource<S>, UICollectionView, String, IndexPath) -> UICollectionReusableView\n    public typealias MoveItem = (CollectionViewSectionedDataSource<S>, _ sourceIndexPath:IndexPath, _ destinationIndexPath:IndexPath) -> Void\n    public typealias CanMoveItemAtIndexPath = (CollectionViewSectionedDataSource<S>, IndexPath) -> Bool\n\n\n    public init(\n        configureCell: @escaping ConfigureCell,\n        configureSupplementaryView: ConfigureSupplementaryView? = nil,\n        moveItem: @escaping MoveItem = { _, _, _ in () },\n        canMoveItemAtIndexPath: @escaping CanMoveItemAtIndexPath = { _, _ in false }\n    ) {\n        self.configureCell = configureCell\n        self.configureSupplementaryView = configureSupplementaryView\n        self.moveItem = moveItem\n        self.canMoveItemAtIndexPath = canMoveItemAtIndexPath\n    }\n\n    #if DEBUG\n    // If data source has already been bound, then mutating it\n    // afterwards isn't something desired.\n    // This simulates immutability after binding\n    var _dataSourceBound: Bool = false\n\n    private func ensureNotMutatedAfterBinding() {\n        assert(!_dataSourceBound, \"Data source is already bound. Please write this line before binding call (`bindTo`, `drive`). Data source must first be completely configured, and then bound after that, otherwise there could be runtime bugs, glitches, or partial malfunctions.\")\n    }\n    \n    #endif\n\n    // This structure exists because model can be mutable\n    // In that case current state value should be preserved.\n    // The state that needs to be preserved is ordering of items in section\n    // and their relationship with section.\n    // If particular item is mutable, that is irrelevant for this logic to function\n    // properly.\n    public typealias SectionModelSnapshot = SectionModel<S, I>\n    \n    private var _sectionModels: [SectionModelSnapshot] = []\n\n    open var sectionModels: [S] {\n        return _sectionModels.map { Section(original: $0.model, items: $0.items) }\n    }\n\n    open subscript(section: Int) -> S {\n        let sectionModel = self._sectionModels[section]\n        return S(original: sectionModel.model, items: sectionModel.items)\n    }\n    \n    open subscript(indexPath: IndexPath) -> I {\n        get {\n            return self._sectionModels[indexPath.section].items[indexPath.item]\n        }\n        set(item) {\n            var section = self._sectionModels[indexPath.section]\n            section.items[indexPath.item] = item\n            self._sectionModels[indexPath.section] = section\n        }\n    }\n    \n    open func model(at indexPath: IndexPath) throws -> Any {\n        return self[indexPath]\n    }\n    \n    open func setSections(_ sections: [S]) {\n        self._sectionModels = sections.map { SectionModelSnapshot(model: $0, items: $0.items) }\n    }\n    \n    open var configureCell: ConfigureCell {\n        didSet {\n            #if DEBUG\n            ensureNotMutatedAfterBinding()\n            #endif\n        }\n    }\n\n    open var configureSupplementaryView: ConfigureSupplementaryView? {\n        didSet {\n            #if DEBUG\n            ensureNotMutatedAfterBinding()\n            #endif\n        }\n    }\n    \n    open var moveItem: MoveItem {\n        didSet {\n            #if DEBUG\n                ensureNotMutatedAfterBinding()\n            #endif\n        }\n    }\n    open var canMoveItemAtIndexPath: ((CollectionViewSectionedDataSource<S>, IndexPath) -> Bool)? {\n        didSet {\n            #if DEBUG\n            ensureNotMutatedAfterBinding()\n            #endif\n        }\n    }\n\n    // UICollectionViewDataSource\n    \n    open func numberOfSections(in collectionView: UICollectionView) -> Int {\n        return _sectionModels.count\n    }\n    \n    open func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {\n        return _sectionModels[section].items.count\n    }\n    \n    open func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {\n        precondition(indexPath.item < _sectionModels[indexPath.section].items.count)\n        \n        return configureCell(self, collectionView, indexPath, self[indexPath])\n    }\n    \n    open func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {\n        return configureSupplementaryView!(self, collectionView, kind, indexPath)\n    }\n    \n    open func collectionView(_ collectionView: UICollectionView, canMoveItemAt indexPath: IndexPath) -> Bool {\n        guard let canMoveItem = canMoveItemAtIndexPath?(self, indexPath) else {\n            return false\n        }\n        \n        return canMoveItem\n    }\n    \n    open func collectionView(_ collectionView: UICollectionView, moveItemAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {\n        self._sectionModels.moveFromSourceIndexPath(sourceIndexPath, destinationIndexPath: destinationIndexPath)\n        self.moveItem(self, sourceIndexPath, destinationIndexPath)\n    }\n\n    override open func responds(to aSelector: Selector!) -> Bool {\n        if aSelector == #selector(UICollectionViewDataSource.collectionView(_:viewForSupplementaryElementOfKind:at:)) {\n            return configureSupplementaryView != nil\n        }\n        else {\n            return super.responds(to: aSelector)\n        }\n    }\n}\n#endif\n"
  },
  {
    "path": "Pods/RxDataSources/Sources/RxDataSources/DataSources.swift",
    "content": "//\n//  DataSources.swift\n//  RxDataSources\n//\n//  Created by Krunoslav Zaher on 1/8/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\n@_exported import Differentiator\n\nenum RxDataSourceError : Error {\n  case preconditionFailed(message: String)\n}\n\nfunc rxPrecondition(_ condition: Bool, _ message: @autoclosure() -> String) throws -> () {\n  if condition {\n    return\n  }\n  rxDebugFatalError(\"Precondition failed\")\n\n  throw RxDataSourceError.preconditionFailed(message: message())\n}\n\nfunc rxDebugFatalError(_ error: Error) {\n  rxDebugFatalError(\"\\(error)\")\n}\n\nfunc rxDebugFatalError(_ message: String) {\n  #if DEBUG\n    fatalError(message)\n  #else\n    print(message)\n  #endif\n}\n"
  },
  {
    "path": "Pods/RxDataSources/Sources/RxDataSources/Deprecated.swift",
    "content": "//\n//  Deprecated.swift\n//  RxDataSources\n//\n//  Created by Krunoslav Zaher on 10/8/17.\n//  Copyright © 2017 kzaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\nextension CollectionViewSectionedDataSource {\n    @available(*, deprecated, renamed: \"configureSupplementaryView\")\n    public var supplementaryViewFactory: ConfigureSupplementaryView? {\n        get {\n            return self.configureSupplementaryView\n        }\n        set {\n            self.configureSupplementaryView = newValue\n        }\n    }\n}\n#endif\n"
  },
  {
    "path": "Pods/RxDataSources/Sources/RxDataSources/FloatingPointType+IdentifiableType.swift",
    "content": "//\n//  FloatingPointType+IdentifiableType.swift\n//  RxDataSources\n//\n//  Created by Krunoslav Zaher on 7/4/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\nextension FloatingPoint {\n    typealias identity = Self\n\n    public var identity: Self {\n        return self\n    }\n}\n\nextension Float : IdentifiableType {\n\n}\n\nextension Double : IdentifiableType {\n\n}\n"
  },
  {
    "path": "Pods/RxDataSources/Sources/RxDataSources/IntegerType+IdentifiableType.swift",
    "content": "//\n//  IntegerType+IdentifiableType.swift\n//  RxDataSources\n//\n//  Created by Krunoslav Zaher on 7/4/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\nextension BinaryInteger {\n    typealias identity = Self\n\n    public var identity: Self {\n        return self\n    }\n}\n\nextension Int : IdentifiableType {\n\n}\n\nextension Int8 : IdentifiableType {\n\n}\n\nextension Int16 : IdentifiableType {\n\n}\n\nextension Int32 : IdentifiableType {\n\n}\n\nextension Int64 : IdentifiableType {\n\n}\n\n\nextension UInt : IdentifiableType {\n\n}\n\nextension UInt8 : IdentifiableType {\n\n}\n\nextension UInt16 : IdentifiableType {\n\n}\n\nextension UInt32 : IdentifiableType {\n\n}\n\nextension UInt64 : IdentifiableType {\n    \n}\n\n"
  },
  {
    "path": "Pods/RxDataSources/Sources/RxDataSources/RxCollectionViewSectionedAnimatedDataSource.swift",
    "content": "//\n//  RxCollectionViewSectionedAnimatedDataSource.swift\n//  RxExample\n//\n//  Created by Krunoslav Zaher on 7/2/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\nimport Foundation\nimport UIKit\n#if !RX_NO_MODULE\nimport RxSwift\nimport RxCocoa\n#endif\nimport Differentiator\n\n/*\n This is commented becuse collection view has bugs when doing animated updates. \n Take a look at randomized sections.\n*/\nopen class RxCollectionViewSectionedAnimatedDataSource<S: AnimatableSectionModelType>\n    : CollectionViewSectionedDataSource<S>\n    , RxCollectionViewDataSourceType {\n    public typealias Element = [S]\n    public typealias DecideViewTransition = (CollectionViewSectionedDataSource<S>, UICollectionView, [Changeset<S>]) -> ViewTransition\n\n    // animation configuration\n    public var animationConfiguration: AnimationConfiguration\n\n    /// Calculates view transition depending on type of changes\n    public var decideViewTransition: DecideViewTransition\n\n    public init(\n        animationConfiguration: AnimationConfiguration = AnimationConfiguration(),\n        decideViewTransition: @escaping DecideViewTransition = { _, _, _ in .animated },\n        configureCell: @escaping ConfigureCell,\n        configureSupplementaryView: @escaping ConfigureSupplementaryView,\n        moveItem: @escaping MoveItem = { _, _, _ in () },\n        canMoveItemAtIndexPath: @escaping CanMoveItemAtIndexPath = { _, _ in false }\n        ) {\n        self.animationConfiguration = animationConfiguration\n        self.decideViewTransition = decideViewTransition\n        super.init(\n            configureCell: configureCell,\n            configureSupplementaryView: configureSupplementaryView,\n            moveItem: moveItem,\n            canMoveItemAtIndexPath: canMoveItemAtIndexPath\n        )\n\n        self.partialUpdateEvent\n            // so in case it does produce a crash, it will be after the data has changed\n            .observeOn(MainScheduler.asyncInstance)\n            // Collection view has issues digesting fast updates, this should\n            // help to alleviate the issues with them.\n            .throttle(0.5, scheduler: MainScheduler.instance)\n            .subscribe(onNext: { [weak self] event in\n                self?.collectionView(event.0, throttledObservedEvent: event.1)\n            })\n            .disposed(by: disposeBag)\n    }\n\n    // For some inexplicable reason, when doing animated updates first time\n    // it crashes. Still need to figure out that one.\n    var dataSet = false\n\n    private let disposeBag = DisposeBag()\n\n    // This subject and throttle are here\n    // because collection view has problems processing animated updates fast.\n    // This should somewhat help to alleviate the problem.\n    private let partialUpdateEvent = PublishSubject<(UICollectionView, Event<Element>)>()\n\n    /**\n     This method exists because collection view updates are throttled because of internal collection view bugs.\n     Collection view behaves poorly during fast updates, so this should remedy those issues.\n    */\n    open func collectionView(_ collectionView: UICollectionView, throttledObservedEvent event: Event<Element>) {\n        Binder(self) { dataSource, newSections in\n            let oldSections = dataSource.sectionModels\n            do {\n                // if view is not in view hierarchy, performing batch updates will crash the app\n                if collectionView.window == nil {\n                    dataSource.setSections(newSections)\n                    collectionView.reloadData()\n                    return\n                }\n                let differences = try Diff.differencesForSectionedView(initialSections: oldSections, finalSections: newSections)\n\n                switch self.decideViewTransition(self, collectionView, differences) {\n                case .animated:\n                    for difference in differences {\n                        dataSource.setSections(difference.finalSections)\n\n                        collectionView.performBatchUpdates(difference, animationConfiguration: self.animationConfiguration)\n                    }\n                case .reload:\n                    self.setSections(newSections)\n                    collectionView.reloadData()\n                }\n            }\n            catch let e {\n                #if DEBUG\n                    print(\"Error while binding data animated: \\(e)\\nFallback to normal `reloadData` behavior.\")\n                    rxDebugFatalError(e)\n                #endif\n                self.setSections(newSections)\n                collectionView.reloadData()\n            }\n        }.on(event)\n    }\n\n    open func collectionView(_ collectionView: UICollectionView, observedEvent: Event<Element>) {\n        Binder(self) { dataSource, newSections in\n            #if DEBUG\n                self._dataSourceBound = true\n            #endif\n            if !self.dataSet {\n                self.dataSet = true\n                dataSource.setSections(newSections)\n                collectionView.reloadData()\n            }\n            else {\n                let element = (collectionView, observedEvent)\n                dataSource.partialUpdateEvent.on(.next(element))\n            }\n        }.on(observedEvent)\n    }\n}\n#endif\n"
  },
  {
    "path": "Pods/RxDataSources/Sources/RxDataSources/RxCollectionViewSectionedReloadDataSource.swift",
    "content": "//\n//  RxCollectionViewSectionedReloadDataSource.swift\n//  RxExample\n//\n//  Created by Krunoslav Zaher on 7/2/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\nimport Foundation\nimport UIKit\n#if !RX_NO_MODULE\nimport RxSwift\nimport RxCocoa\n#endif\nimport Differentiator\n\nopen class RxCollectionViewSectionedReloadDataSource<S: SectionModelType>\n    : CollectionViewSectionedDataSource<S>\n    , RxCollectionViewDataSourceType {\n    \n    public typealias Element = [S]\n\n    open func collectionView(_ collectionView: UICollectionView, observedEvent: Event<Element>) {\n        Binder(self) { dataSource, element in\n            #if DEBUG\n                self._dataSourceBound = true\n            #endif\n            dataSource.setSections(element)\n            collectionView.reloadData()\n            collectionView.collectionViewLayout.invalidateLayout()\n        }.on(observedEvent)\n    }\n}\n#endif\n"
  },
  {
    "path": "Pods/RxDataSources/Sources/RxDataSources/RxPickerViewAdapter.swift",
    "content": "//\n//  RxPickerViewAdapter.swift\n//  RxDataSources\n//\n//  Created by Sergey Shulga on 04/07/2017.\n//  Copyright © 2017 kzaher. All rights reserved.\n//\n\n#if os(iOS)\n\nimport Foundation\nimport UIKit\n#if !RX_NO_MODULE\n    import RxSwift\n    import RxCocoa\n#endif\n\n/// A reactive UIPickerView adapter which uses `func pickerView(UIPickerView, titleForRow: Int, forComponent: Int)` to display the content\n/**\n Example:\n \nlet adapter = RxPickerViewStringAdapter<[T]>(...)\n \nitems\n .bind(to: firstPickerView.rx.items(adapter: adapter))\n .disposed(by: disposeBag)\n \n */\nopen class RxPickerViewStringAdapter<T>: RxPickerViewDataSource<T>, UIPickerViewDelegate {\n    /**\n     - parameter dataSource\n     - parameter pickerView\n     - parameter components\n     - parameter row\n     - parameter component\n    */\n    public typealias TitleForRow = (\n        _ dataSource: RxPickerViewStringAdapter<T>,\n        _ pickerView: UIPickerView,\n        _ components: T,\n        _ row: Int,\n        _ component: Int\n    ) -> String?\n    \n    private let titleForRow: TitleForRow\n\n    /**\n     - parameter components: Initial content value.\n     - parameter numberOfComponents: Implementation of corresponding delegate method.\n     - parameter numberOfRowsInComponent: Implementation of corresponding delegate method.\n     - parameter titleForRow: Implementation of corresponding adapter method that converts component to `String`.\n     */\n    public init(components: T,\n                numberOfComponents: @escaping NumberOfComponents,\n                numberOfRowsInComponent: @escaping NumberOfRowsInComponent,\n                titleForRow: @escaping TitleForRow) {\n        self.titleForRow = titleForRow\n        super.init(components: components,\n                   numberOfComponents: numberOfComponents,\n                   numberOfRowsInComponent: numberOfRowsInComponent)\n    }\n    \n    open func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {\n        return titleForRow(self, pickerView, components, row, component)\n    }\n}\n\n/// A reactive UIPickerView adapter which uses `func pickerView(UIPickerView, viewForRow: Int, forComponent: Int, reusing: UIView?)` to display the content\n/**\n Example:\n \n let adapter = RxPickerViewAttributedStringAdapter<[T]>(...)\n \n items\n .bind(to: firstPickerView.rx.items(adapter: adapter))\n .disposed(by: disposeBag)\n \n */\nopen class RxPickerViewAttributedStringAdapter<T>: RxPickerViewDataSource<T>, UIPickerViewDelegate {\n    /**\n     - parameter dataSource\n     - parameter pickerView\n     - parameter components\n     - parameter row\n     - parameter component\n    */\n    public typealias AttributedTitleForRow = (\n        _ dataSource: RxPickerViewAttributedStringAdapter<T>,\n        _ pickerView: UIPickerView,\n        _ components: T,\n        _ row: Int,\n        _ component: Int\n    ) -> NSAttributedString?\n    \n    private let attributedTitleForRow: AttributedTitleForRow\n\n    /**\n     - parameter components: Initial content value.\n     - parameter numberOfComponents: Implementation of corresponding delegate method.\n     - parameter numberOfRowsInComponent: Implementation of corresponding delegate method.\n     - parameter attributedTitleForRow: Implementation of corresponding adapter method that converts component to `NSAttributedString`.\n     */\n    public init(components: T,\n                numberOfComponents: @escaping NumberOfComponents,\n                numberOfRowsInComponent: @escaping NumberOfRowsInComponent,\n                attributedTitleForRow: @escaping AttributedTitleForRow) {\n        self.attributedTitleForRow = attributedTitleForRow\n        super.init(components: components,\n                   numberOfComponents: numberOfComponents,\n                   numberOfRowsInComponent: numberOfRowsInComponent)\n    }\n    \n    open func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {\n        return attributedTitleForRow(self, pickerView, components, row, component)\n    }\n}\n\n/// A reactive UIPickerView adapter which uses `func pickerView(pickerView:, viewForRow row:, forComponent component:)` to display the content\n/**\n Example:\n \n let adapter = RxPickerViewViewAdapter<[T]>(...)\n \n items\n .bind(to: firstPickerView.rx.items(adapter: adapter))\n .disposed(by: disposeBag)\n \n */\nopen class RxPickerViewViewAdapter<T>: RxPickerViewDataSource<T>, UIPickerViewDelegate {\n    /**\n     - parameter dataSource\n     - parameter pickerView\n     - parameter components\n     - parameter row\n     - parameter component\n     - parameter view\n    */\n    public typealias ViewForRow = (\n        _ dataSource: RxPickerViewViewAdapter<T>,\n        _ pickerView: UIPickerView,\n        _ components: T,\n        _ row: Int,\n        _ component: Int,\n        _ view: UIView?\n    ) -> UIView\n    \n    private let viewForRow: ViewForRow\n\n    /**\n     - parameter components: Initial content value.\n     - parameter numberOfComponents: Implementation of corresponding delegate method.\n     - parameter numberOfRowsInComponent: Implementation of corresponding delegate method.\n     - parameter attributedTitleForRow: Implementation of corresponding adapter method that converts component to `UIView`.\n     */\n    public init(components: T,\n                numberOfComponents: @escaping NumberOfComponents,\n                numberOfRowsInComponent: @escaping NumberOfRowsInComponent,\n                viewForRow: @escaping ViewForRow) {\n        self.viewForRow = viewForRow\n        super.init(components: components,\n                   numberOfComponents: numberOfComponents,\n                   numberOfRowsInComponent: numberOfRowsInComponent)\n    }\n    \n    open func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {\n        return viewForRow(self, pickerView, components, row, component, view)\n    }\n}\n\n/// A reactive UIPickerView data source  \nopen class RxPickerViewDataSource<T>: NSObject, UIPickerViewDataSource {\n    /**\n     - parameter dataSource\n     - parameter pickerView\n     - parameter components\n    */\n    public typealias NumberOfComponents = (\n        _ dataSource: RxPickerViewDataSource,\n        _ pickerView: UIPickerView,\n        _ components: T) -> Int\n    /**\n     - parameter dataSource\n     - parameter pickerView\n     - parameter components\n     - parameter component\n    */\n    public typealias NumberOfRowsInComponent = (\n        _ dataSource: RxPickerViewDataSource,\n        _ pickerView: UIPickerView,\n        _ components: T,\n        _ component: Int\n    ) -> Int\n    \n    fileprivate var components: T\n\n    /**\n     - parameter components: Initial content value.\n     - parameter numberOfComponents: Implementation of corresponding delegate method.\n     - parameter numberOfRowsInComponent: Implementation of corresponding delegate method.\n     */\n    init(components: T,\n         numberOfComponents: @escaping NumberOfComponents,\n         numberOfRowsInComponent: @escaping NumberOfRowsInComponent) {\n        self.components = components\n        self.numberOfComponents = numberOfComponents\n        self.numberOfRowsInComponent = numberOfRowsInComponent\n        super.init()\n    }\n    \n    private let numberOfComponents: NumberOfComponents\n    private let numberOfRowsInComponent: NumberOfRowsInComponent\n    \n    //MARK: UIPickerViewDataSource\n    \n    public func numberOfComponents(in pickerView: UIPickerView) -> Int {\n        return numberOfComponents(self, pickerView, components)\n    }\n    \n    public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {\n        return numberOfRowsInComponent(self, pickerView, components, component)\n    }\n}\n\nextension RxPickerViewDataSource: RxPickerViewDataSourceType {\n    public func pickerView(_ pickerView: UIPickerView, observedEvent: Event<T>) {\n        Binder(self) { (dataSource, components) in\n            dataSource.components = components\n            pickerView.reloadAllComponents()\n        }.on(observedEvent)\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Pods/RxDataSources/Sources/RxDataSources/RxTableViewSectionedAnimatedDataSource.swift",
    "content": "//\n//  RxTableViewSectionedAnimatedDataSource.swift\n//  RxExample\n//\n//  Created by Krunoslav Zaher on 6/27/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\nimport Foundation\nimport UIKit\n#if !RX_NO_MODULE\nimport RxSwift\nimport RxCocoa\n#endif\nimport Differentiator\n\nopen class RxTableViewSectionedAnimatedDataSource<S: AnimatableSectionModelType>\n    : TableViewSectionedDataSource<S>\n    , RxTableViewDataSourceType {\n    public typealias Element = [S]\n    public typealias DecideViewTransition = (TableViewSectionedDataSource<S>, UITableView, [Changeset<S>]) -> ViewTransition\n\n    /// Animation configuration for data source\n    public var animationConfiguration: AnimationConfiguration\n\n    /// Calculates view transition depending on type of changes\n    public var decideViewTransition: DecideViewTransition\n\n    #if os(iOS)\n        public init(\n                animationConfiguration: AnimationConfiguration = AnimationConfiguration(),\n                decideViewTransition: @escaping DecideViewTransition = { _, _, _ in .animated },\n                configureCell: @escaping ConfigureCell,\n                titleForHeaderInSection: @escaping  TitleForHeaderInSection = { _, _ in nil },\n                titleForFooterInSection: @escaping TitleForFooterInSection = { _, _ in nil },\n                canEditRowAtIndexPath: @escaping CanEditRowAtIndexPath = { _, _ in false },\n                canMoveRowAtIndexPath: @escaping CanMoveRowAtIndexPath = { _, _ in false },\n                sectionIndexTitles: @escaping SectionIndexTitles = { _ in nil },\n                sectionForSectionIndexTitle: @escaping SectionForSectionIndexTitle = { _, _, index in index }\n            ) {\n            self.animationConfiguration = animationConfiguration\n            self.decideViewTransition = decideViewTransition\n            super.init(\n                configureCell: configureCell,\n               titleForHeaderInSection: titleForHeaderInSection,\n               titleForFooterInSection: titleForFooterInSection,\n               canEditRowAtIndexPath: canEditRowAtIndexPath,\n               canMoveRowAtIndexPath: canMoveRowAtIndexPath,\n               sectionIndexTitles: sectionIndexTitles,\n               sectionForSectionIndexTitle: sectionForSectionIndexTitle\n            )\n        }\n    #else\n        public init(\n                animationConfiguration: AnimationConfiguration = AnimationConfiguration(),\n                decideViewTransition: @escaping DecideViewTransition = { _, _, _ in .animated },\n                configureCell: @escaping ConfigureCell,\n                titleForHeaderInSection: @escaping  TitleForHeaderInSection = { _, _ in nil },\n                titleForFooterInSection: @escaping TitleForFooterInSection = { _, _ in nil },\n                canEditRowAtIndexPath: @escaping CanEditRowAtIndexPath = { _, _ in false },\n                canMoveRowAtIndexPath: @escaping CanMoveRowAtIndexPath = { _, _ in false }\n            ) {\n            self.animationConfiguration = animationConfiguration\n            self.decideViewTransition = decideViewTransition\n            super.init(\n                configureCell: configureCell,\n               titleForHeaderInSection: titleForHeaderInSection,\n               titleForFooterInSection: titleForFooterInSection,\n               canEditRowAtIndexPath: canEditRowAtIndexPath,\n               canMoveRowAtIndexPath: canMoveRowAtIndexPath\n            )\n        }\n    #endif\n\n    var dataSet = false\n\n    open func tableView(_ tableView: UITableView, observedEvent: Event<Element>) {\n        Binder(self) { dataSource, newSections in\n            #if DEBUG\n                self._dataSourceBound = true\n            #endif\n            if !self.dataSet {\n                self.dataSet = true\n                dataSource.setSections(newSections)\n                tableView.reloadData()\n            }\n            else {\n                DispatchQueue.main.async {\n                    // if view is not in view hierarchy, performing batch updates will crash the app\n                    if tableView.window == nil {\n                        dataSource.setSections(newSections)\n                        tableView.reloadData()\n                        return\n                    }\n                    let oldSections = dataSource.sectionModels\n                    do {\n                        let differences = try Diff.differencesForSectionedView(initialSections: oldSections, finalSections: newSections)\n\n                        switch self.decideViewTransition(self, tableView, differences) {\n                        case .animated:\n                            for difference in differences {\n                                dataSource.setSections(difference.finalSections)\n\n                                tableView.performBatchUpdates(difference, animationConfiguration: self.animationConfiguration)\n                            }\n                        case .reload:\n                            self.setSections(newSections)\n                            tableView.reloadData()\n                            return\n                        }\n                    }\n                    catch let e {\n                        rxDebugFatalError(e)\n                        self.setSections(newSections)\n                        tableView.reloadData()\n                    }\n                }\n            }\n        }.on(observedEvent)\n    }\n}\n#endif\n"
  },
  {
    "path": "Pods/RxDataSources/Sources/RxDataSources/RxTableViewSectionedReloadDataSource.swift",
    "content": "//\n//  RxTableViewSectionedReloadDataSource.swift\n//  RxExample\n//\n//  Created by Krunoslav Zaher on 6/27/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\nimport Foundation\nimport UIKit\n#if !RX_NO_MODULE\nimport RxSwift\nimport RxCocoa\n#endif\nimport Differentiator\n\nopen class RxTableViewSectionedReloadDataSource<S: SectionModelType>\n    : TableViewSectionedDataSource<S>\n    , RxTableViewDataSourceType {\n    public typealias Element = [S]\n\n    open func tableView(_ tableView: UITableView, observedEvent: Event<Element>) {\n        Binder(self) { dataSource, element in\n            #if DEBUG\n                self._dataSourceBound = true\n            #endif\n            dataSource.setSections(element)\n            tableView.reloadData()\n        }.on(observedEvent)\n    }\n}\n#endif\n"
  },
  {
    "path": "Pods/RxDataSources/Sources/RxDataSources/String+IdentifiableType.swift",
    "content": "//\n//  String+IdentifiableType.swift\n//  RxDataSources\n//\n//  Created by Krunoslav Zaher on 7/4/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\nextension String : IdentifiableType {\n    public typealias Identity = String\n\n    public var identity: String {\n        return self\n    }\n}\n"
  },
  {
    "path": "Pods/RxDataSources/Sources/RxDataSources/TableViewSectionedDataSource.swift",
    "content": "//\n//  TableViewSectionedDataSource.swift\n//  RxDataSources\n//\n//  Created by Krunoslav Zaher on 6/15/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\nimport Foundation\nimport UIKit\n#if !RX_NO_MODULE\nimport RxCocoa\n#endif\nimport Differentiator\n\nopen class TableViewSectionedDataSource<S: SectionModelType>\n    : NSObject\n    , UITableViewDataSource\n    , SectionedViewDataSourceType {\n    \n    public typealias I = S.Item\n    public typealias Section = S\n\n    public typealias ConfigureCell = (TableViewSectionedDataSource<S>, UITableView, IndexPath, I) -> UITableViewCell\n    public typealias TitleForHeaderInSection = (TableViewSectionedDataSource<S>, Int) -> String?\n    public typealias TitleForFooterInSection = (TableViewSectionedDataSource<S>, Int) -> String?\n    public typealias CanEditRowAtIndexPath = (TableViewSectionedDataSource<S>, IndexPath) -> Bool\n    public typealias CanMoveRowAtIndexPath = (TableViewSectionedDataSource<S>, IndexPath) -> Bool\n\n    #if os(iOS)\n        public typealias SectionIndexTitles = (TableViewSectionedDataSource<S>) -> [String]?\n        public typealias SectionForSectionIndexTitle = (TableViewSectionedDataSource<S>, _ title: String, _ index: Int) -> Int\n    #endif\n\n    #if os(iOS)\n        public init(\n                configureCell: @escaping ConfigureCell,\n                titleForHeaderInSection: @escaping  TitleForHeaderInSection = { _, _ in nil },\n                titleForFooterInSection: @escaping TitleForFooterInSection = { _, _ in nil },\n                canEditRowAtIndexPath: @escaping CanEditRowAtIndexPath = { _, _ in false },\n                canMoveRowAtIndexPath: @escaping CanMoveRowAtIndexPath = { _, _ in false },\n                sectionIndexTitles: @escaping SectionIndexTitles = { _ in nil },\n                sectionForSectionIndexTitle: @escaping SectionForSectionIndexTitle = { _, _, index in index }\n            ) {\n            self.configureCell = configureCell\n            self.titleForHeaderInSection = titleForHeaderInSection\n            self.titleForFooterInSection = titleForFooterInSection\n            self.canEditRowAtIndexPath = canEditRowAtIndexPath\n            self.canMoveRowAtIndexPath = canMoveRowAtIndexPath\n            self.sectionIndexTitles = sectionIndexTitles\n            self.sectionForSectionIndexTitle = sectionForSectionIndexTitle\n        }\n    #else\n        public init(\n                configureCell: @escaping ConfigureCell,\n                titleForHeaderInSection: @escaping  TitleForHeaderInSection = { _, _ in nil },\n                titleForFooterInSection: @escaping TitleForFooterInSection = { _, _ in nil },\n                canEditRowAtIndexPath: @escaping CanEditRowAtIndexPath = { _, _ in false },\n                canMoveRowAtIndexPath: @escaping CanMoveRowAtIndexPath = { _, _ in false }\n            ) {\n            self.configureCell = configureCell\n            self.titleForHeaderInSection = titleForHeaderInSection\n            self.titleForFooterInSection = titleForFooterInSection\n            self.canEditRowAtIndexPath = canEditRowAtIndexPath\n            self.canMoveRowAtIndexPath = canMoveRowAtIndexPath\n        }\n    #endif\n\n    #if DEBUG\n    // If data source has already been bound, then mutating it\n    // afterwards isn't something desired.\n    // This simulates immutability after binding\n    var _dataSourceBound: Bool = false\n\n    private func ensureNotMutatedAfterBinding() {\n        assert(!_dataSourceBound, \"Data source is already bound. Please write this line before binding call (`bindTo`, `drive`). Data source must first be completely configured, and then bound after that, otherwise there could be runtime bugs, glitches, or partial malfunctions.\")\n    }\n    \n    #endif\n\n    // This structure exists because model can be mutable\n    // In that case current state value should be preserved.\n    // The state that needs to be preserved is ordering of items in section\n    // and their relationship with section.\n    // If particular item is mutable, that is irrelevant for this logic to function\n    // properly.\n    public typealias SectionModelSnapshot = SectionModel<S, I>\n    \n    private var _sectionModels: [SectionModelSnapshot] = []\n\n    open var sectionModels: [S] {\n        return _sectionModels.map { Section(original: $0.model, items: $0.items) }\n    }\n\n    open subscript(section: Int) -> S {\n        let sectionModel = self._sectionModels[section]\n        return S(original: sectionModel.model, items: sectionModel.items)\n    }\n\n    open subscript(indexPath: IndexPath) -> I {\n        get {\n            return self._sectionModels[indexPath.section].items[indexPath.item]\n        }\n        set(item) {\n            var section = self._sectionModels[indexPath.section]\n            section.items[indexPath.item] = item\n            self._sectionModels[indexPath.section] = section\n        }\n    }\n\n    open func model(at indexPath: IndexPath) throws -> Any {\n        return self[indexPath]\n    }\n\n    open func setSections(_ sections: [S]) {\n        self._sectionModels = sections.map { SectionModelSnapshot(model: $0, items: $0.items) }\n    }\n\n    open var configureCell: ConfigureCell {\n        didSet {\n            #if DEBUG\n                ensureNotMutatedAfterBinding()\n            #endif\n        }\n    }\n    \n    open var titleForHeaderInSection: TitleForHeaderInSection {\n        didSet {\n            #if DEBUG\n                ensureNotMutatedAfterBinding()\n            #endif\n        }\n    }\n    open var titleForFooterInSection: TitleForFooterInSection {\n        didSet {\n            #if DEBUG\n                ensureNotMutatedAfterBinding()\n            #endif\n        }\n    }\n    \n    open var canEditRowAtIndexPath: CanEditRowAtIndexPath {\n        didSet {\n            #if DEBUG\n                ensureNotMutatedAfterBinding()\n            #endif\n        }\n    }\n    open var canMoveRowAtIndexPath: CanMoveRowAtIndexPath {\n        didSet {\n            #if DEBUG\n                ensureNotMutatedAfterBinding()\n            #endif\n        }\n    }\n\n    open var rowAnimation: UITableViewRowAnimation = .automatic\n\n    #if os(iOS)\n    open var sectionIndexTitles: SectionIndexTitles {\n        didSet {\n            #if DEBUG\n            ensureNotMutatedAfterBinding()\n            #endif\n        }\n    }\n    open var sectionForSectionIndexTitle: SectionForSectionIndexTitle {\n        didSet {\n            #if DEBUG\n            ensureNotMutatedAfterBinding()\n            #endif\n        }\n    }\n    #endif\n    \n\n    // UITableViewDataSource\n    \n    open func numberOfSections(in tableView: UITableView) -> Int {\n        return _sectionModels.count\n    }\n    \n    open func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        guard _sectionModels.count > section else { return 0 }\n        return _sectionModels[section].items.count\n    }\n    \n    open func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        precondition(indexPath.item < _sectionModels[indexPath.section].items.count)\n        \n        return configureCell(self, tableView, indexPath, self[indexPath])\n    }\n    \n    open func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {\n        return titleForHeaderInSection(self, section)\n    }\n   \n    open func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? {\n        return titleForFooterInSection(self, section)\n    }\n    \n    open func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {\n        return canEditRowAtIndexPath(self, indexPath)\n    }\n   \n    open func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {\n        return canMoveRowAtIndexPath(self, indexPath)\n    }\n\n    open func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {\n        self._sectionModels.moveFromSourceIndexPath(sourceIndexPath, destinationIndexPath: destinationIndexPath)\n    }\n\n    #if os(iOS)\n    open func sectionIndexTitles(for tableView: UITableView) -> [String]? {\n        return sectionIndexTitles(self)\n    }\n    \n    open func tableView(_ tableView: UITableView, sectionForSectionIndexTitle title: String, at index: Int) -> Int {\n        return sectionForSectionIndexTitle(self, title, index)\n    }\n    #endif\n}\n#endif\n"
  },
  {
    "path": "Pods/RxDataSources/Sources/RxDataSources/UI+SectionedViewType.swift",
    "content": "//\n//  UI+SectionedViewType.swift\n//  RxDataSources\n//\n//  Created by Krunoslav Zaher on 6/27/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(iOS) || os(tvOS)\nimport Foundation\nimport UIKit\nimport Differentiator\n\nfunc indexSet(_ values: [Int]) -> IndexSet {\n    let indexSet = NSMutableIndexSet()\n    for i in values {\n        indexSet.add(i)\n    }\n    return indexSet as IndexSet\n}\n\nextension UITableView : SectionedViewType {\n  \n    public func insertItemsAtIndexPaths(_ paths: [IndexPath], animationStyle: UITableViewRowAnimation) {\n        self.insertRows(at: paths, with: animationStyle)\n    }\n    \n    public func deleteItemsAtIndexPaths(_ paths: [IndexPath], animationStyle: UITableViewRowAnimation) {\n        self.deleteRows(at: paths, with: animationStyle)\n    }\n    \n    public func moveItemAtIndexPath(_ from: IndexPath, to: IndexPath) {\n        self.moveRow(at: from, to: to)\n    }\n    \n    public func reloadItemsAtIndexPaths(_ paths: [IndexPath], animationStyle: UITableViewRowAnimation) {\n        self.reloadRows(at: paths, with: animationStyle)\n    }\n    \n    public func insertSections(_ sections: [Int], animationStyle: UITableViewRowAnimation) {\n        self.insertSections(indexSet(sections), with: animationStyle)\n    }\n    \n    public func deleteSections(_ sections: [Int], animationStyle: UITableViewRowAnimation) {\n        self.deleteSections(indexSet(sections), with: animationStyle)\n    }\n    \n    public func moveSection(_ from: Int, to: Int) {\n        self.moveSection(from, toSection: to)\n    }\n    \n    public func reloadSections(_ sections: [Int], animationStyle: UITableViewRowAnimation) {\n        self.reloadSections(indexSet(sections), with: animationStyle)\n    }\n\n  public func performBatchUpdates<S>(_ changes: Changeset<S>, animationConfiguration: AnimationConfiguration) {\n        self.beginUpdates()\n        _performBatchUpdates(self, changes: changes, animationConfiguration: animationConfiguration)\n        self.endUpdates()\n    }\n}\n\nextension UICollectionView : SectionedViewType {\n    public func insertItemsAtIndexPaths(_ paths: [IndexPath], animationStyle: UITableViewRowAnimation) {\n        self.insertItems(at: paths)\n    }\n    \n    public func deleteItemsAtIndexPaths(_ paths: [IndexPath], animationStyle: UITableViewRowAnimation) {\n        self.deleteItems(at: paths)\n    }\n\n    public func moveItemAtIndexPath(_ from: IndexPath, to: IndexPath) {\n        self.moveItem(at: from, to: to)\n    }\n    \n    public func reloadItemsAtIndexPaths(_ paths: [IndexPath], animationStyle: UITableViewRowAnimation) {\n        self.reloadItems(at: paths)\n    }\n    \n    public func insertSections(_ sections: [Int], animationStyle: UITableViewRowAnimation) {\n        self.insertSections(indexSet(sections))\n    }\n    \n    public func deleteSections(_ sections: [Int], animationStyle: UITableViewRowAnimation) {\n        self.deleteSections(indexSet(sections))\n    }\n    \n    public func moveSection(_ from: Int, to: Int) {\n        self.moveSection(from, toSection: to)\n    }\n    \n    public func reloadSections(_ sections: [Int], animationStyle: UITableViewRowAnimation) {\n        self.reloadSections(indexSet(sections))\n    }\n    \n  public func performBatchUpdates<S>(_ changes: Changeset<S>, animationConfiguration: AnimationConfiguration) {\n        self.performBatchUpdates({ () -> Void in\n            _performBatchUpdates(self, changes: changes, animationConfiguration: animationConfiguration)\n        }, completion: { (completed: Bool) -> Void in\n        })\n    }\n}\n\npublic protocol SectionedViewType {\n    func insertItemsAtIndexPaths(_ paths: [IndexPath], animationStyle: UITableViewRowAnimation)\n    func deleteItemsAtIndexPaths(_ paths: [IndexPath], animationStyle: UITableViewRowAnimation)\n    func moveItemAtIndexPath(_ from: IndexPath, to: IndexPath)\n    func reloadItemsAtIndexPaths(_ paths: [IndexPath], animationStyle: UITableViewRowAnimation)\n    \n    func insertSections(_ sections: [Int], animationStyle: UITableViewRowAnimation)\n    func deleteSections(_ sections: [Int], animationStyle: UITableViewRowAnimation)\n    func moveSection(_ from: Int, to: Int)\n    func reloadSections(_ sections: [Int], animationStyle: UITableViewRowAnimation)\n\n    func performBatchUpdates<S>(_ changes: Changeset<S>, animationConfiguration: AnimationConfiguration)\n}\n\nfunc _performBatchUpdates<V: SectionedViewType, S>(_ view: V, changes: Changeset<S>, animationConfiguration:AnimationConfiguration) {\n    typealias I = S.Item\n  \n    view.deleteSections(changes.deletedSections, animationStyle: animationConfiguration.deleteAnimation)\n    // Updated sections doesn't mean reload entire section, somebody needs to update the section view manually\n    // otherwise all cells will be reloaded for nothing.\n    //view.reloadSections(changes.updatedSections, animationStyle: rowAnimation)\n    view.insertSections(changes.insertedSections, animationStyle: animationConfiguration.insertAnimation)\n    for (from, to) in changes.movedSections {\n        view.moveSection(from, to: to)\n    }\n    \n    view.deleteItemsAtIndexPaths(\n        changes.deletedItems.map { IndexPath(item: $0.itemIndex, section: $0.sectionIndex) },\n        animationStyle: animationConfiguration.deleteAnimation\n    )\n    view.insertItemsAtIndexPaths(\n        changes.insertedItems.map { IndexPath(item: $0.itemIndex, section: $0.sectionIndex) },\n        animationStyle: animationConfiguration.insertAnimation\n    )\n    view.reloadItemsAtIndexPaths(\n        changes.updatedItems.map { IndexPath(item: $0.itemIndex, section: $0.sectionIndex) },\n        animationStyle: animationConfiguration.reloadAnimation\n    )\n    \n    for (from, to) in changes.movedItems {\n        view.moveItemAtIndexPath(\n            IndexPath(item: from.itemIndex, section: from.sectionIndex),\n            to: IndexPath(item: to.itemIndex, section: to.sectionIndex)\n        )\n    }\n}\n#endif\n"
  },
  {
    "path": "Pods/RxDataSources/Sources/RxDataSources/ViewTransition.swift",
    "content": "//\n//  ViewTransition.swift\n//  RxDataSources\n//\n//  Created by Krunoslav Zaher on 10/22/17.\n//  Copyright © 2017 kzaher. All rights reserved.\n//\n\n/// Transition between two view states\npublic enum ViewTransition {\n    /// animated transition\n    case animated\n    /// refresh view without animations\n    case reload\n}\n\n"
  },
  {
    "path": "Pods/RxGesture/LICENSE",
    "content": "Copyright (c) RxSwiftCommunity\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "Pods/RxGesture/Pod/Classes/GestureFactory.swift",
    "content": "// Copyright (c) RxSwiftCommunity\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport RxSwift\nimport RxCocoa\nimport ObjectiveC\n\npublic protocol GestureRecognizerFactory {\n    associatedtype Gesture: GestureRecognizer\n\n    var configuration: (Gesture, RxGestureRecognizerDelegate) -> Void { get }\n    func make() -> Gesture\n}\n\nprivate var gestureRecognizerStrongDelegateKey: UInt8 = 0\npublic extension GestureRecognizerFactory {\n\n    public var configuration: (Gesture, RxGestureRecognizerDelegate) -> Void {\n        return { _, _  in }\n    }\n\n    public func make() -> Gesture {\n        let gesture = Gesture()\n        let delegate = RxGestureRecognizerDelegate()\n        objc_setAssociatedObject(\n            gesture,\n            &gestureRecognizerStrongDelegateKey,\n            delegate,\n            .OBJC_ASSOCIATION_RETAIN_NONATOMIC\n        )\n        gesture.delegate = delegate\n        configuration(gesture, delegate)\n        return gesture\n    }\n}\n\npublic struct AnyGestureRecognizerFactory: GestureRecognizerFactory {\n\n    public typealias Gesture = GestureRecognizer\n\n    public init<G: GestureRecognizerFactory>(_ factory: G) {\n        _make = {\n            return factory.make() as GestureRecognizer\n        }\n    }\n\n    private let _make: () -> GestureRecognizer\n    public func make() -> GestureRecognizer {\n        return _make()\n    }\n}\n"
  },
  {
    "path": "Pods/RxGesture/Pod/Classes/RxGestureRecognizerDelegate.swift",
    "content": "// Copyright (c) RxSwiftCommunity\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n#if os(iOS)\nimport UIKit\n#elseif os(OSX)\nimport AppKit\n#endif\nimport RxSwift\nimport RxCocoa\n\npublic struct GestureRecognizerDelegatePolicy<PolicyInput> {\n    public typealias PolicyBody = (PolicyInput) -> Bool\n\n    private let policy: PolicyBody\n    private init(policy: @escaping PolicyBody) {\n        self.policy = policy\n    }\n\n    public static func custom(_ policy: @escaping PolicyBody)\n        -> GestureRecognizerDelegatePolicy<PolicyInput> {\n            return .init(policy: policy)\n    }\n\n    public static var always: GestureRecognizerDelegatePolicy<PolicyInput> {\n        return .init { _ in true }\n    }\n\n    public static var never: GestureRecognizerDelegatePolicy<PolicyInput> {\n        return .init { _ in false }\n    }\n\n    fileprivate func isPolicyPassing(with args: PolicyInput) -> Bool {\n        return policy(args)\n    }\n\n}\n\npublic final class RxGestureRecognizerDelegate: NSObject, GestureRecognizerDelegate {\n\n    public var beginPolicy: GestureRecognizerDelegatePolicy<GestureRecognizer> = .always\n\n    public var touchReceptionPolicy: GestureRecognizerDelegatePolicy<(GestureRecognizer, Touch)> = .always\n\n    public var selfFailureRequirementPolicy: GestureRecognizerDelegatePolicy<(GestureRecognizer, GestureRecognizer)> = .never\n\n    public var otherFailureRequirementPolicy: GestureRecognizerDelegatePolicy<(GestureRecognizer, GestureRecognizer)> = .never\n\n    public var simultaneousRecognitionPolicy: GestureRecognizerDelegatePolicy<(GestureRecognizer, GestureRecognizer)> = .always\n\n    #if os(iOS)\n    // Workaround because we can't have stored properties with @available annotation\n    private var _pressReceptionPolicy: Any?\n\n    @available(iOS 9.0, *)\n    public var pressReceptionPolicy: GestureRecognizerDelegatePolicy<(GestureRecognizer, UIPress)> {\n        get {\n            if let policy = _pressReceptionPolicy as? GestureRecognizerDelegatePolicy<(GestureRecognizer, UIPress)> {\n                return policy\n            }\n            return GestureRecognizerDelegatePolicy<(GestureRecognizer, UIPress)>.always\n        }\n        set {\n            _pressReceptionPolicy = newValue\n        }\n    }\n    #endif\n\n    #if os(OSX)\n    public var eventRecognitionAttemptPolicy: GestureRecognizerDelegatePolicy<(GestureRecognizer, NSEvent)> = .always\n    #endif\n\n    public func gestureRecognizerShouldBegin(\n        _ gestureRecognizer: GestureRecognizer\n        ) -> Bool {\n        return beginPolicy.isPolicyPassing(with: gestureRecognizer)\n    }\n\n    public func gestureRecognizer(\n        _ gestureRecognizer: GestureRecognizer,\n        shouldReceive touch: Touch\n        ) -> Bool {\n        return touchReceptionPolicy.isPolicyPassing(\n            with: (gestureRecognizer, touch)\n        )\n    }\n\n    public func gestureRecognizer(\n        _ gestureRecognizer: GestureRecognizer,\n        shouldRequireFailureOf otherGestureRecognizer: GestureRecognizer\n        ) -> Bool {\n        return otherFailureRequirementPolicy.isPolicyPassing(\n            with: (gestureRecognizer, otherGestureRecognizer)\n        )\n    }\n\n    public func gestureRecognizer(\n        _ gestureRecognizer: GestureRecognizer,\n        shouldBeRequiredToFailBy otherGestureRecognizer: GestureRecognizer\n        ) -> Bool {\n        return selfFailureRequirementPolicy.isPolicyPassing(\n            with: (gestureRecognizer, otherGestureRecognizer)\n        )\n    }\n\n    public func gestureRecognizer(\n        _ gestureRecognizer: GestureRecognizer,\n        shouldRecognizeSimultaneouslyWith otherGestureRecognizer: GestureRecognizer\n        ) -> Bool {\n        return simultaneousRecognitionPolicy.isPolicyPassing(\n            with: (gestureRecognizer, otherGestureRecognizer)\n        )\n    }\n\n    #if os(iOS)\n\n    @available(iOS 9.0, *)\n    public func gestureRecognizer(\n        _ gestureRecognizer: UIGestureRecognizer,\n        shouldReceive press: UIPress\n        ) -> Bool {\n        return pressReceptionPolicy.isPolicyPassing(\n            with: (gestureRecognizer, press)\n        )\n    }\n\n    #endif\n\n    #if os(OSX)\n\n    public func gestureRecognizer(\n        _ gestureRecognizer: NSGestureRecognizer,\n        shouldAttemptToRecognizeWith event: NSEvent\n        ) -> Bool {\n        return eventRecognitionAttemptPolicy.isPolicyPassing(\n            with: (gestureRecognizer, event)\n        )\n    }\n\n    #endif\n\n}\n"
  },
  {
    "path": "Pods/RxGesture/Pod/Classes/SharedTypes.swift",
    "content": "// Copyright (c) RxSwiftCommunity\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport Foundation\n\n#if os(iOS)\n    import UIKit\n    public typealias Touch = UITouch\n    public typealias GestureRecognizer = UIGestureRecognizer\n    public typealias GestureRecognizerState = UIGestureRecognizerState\n    public typealias GestureRecognizerDelegate = UIGestureRecognizerDelegate\n    public typealias View = UIView\n#elseif os(OSX)\n    import AppKit\n    public typealias Touch = NSTouch\n    public typealias GestureRecognizer = NSGestureRecognizer\n    public typealias GestureRecognizerState = NSGestureRecognizer.State\n    public typealias GestureRecognizerDelegate = NSGestureRecognizerDelegate\n    public typealias View = NSView\n#endif\n\npublic enum TargetView {\n    /// The target view will be the gestureRecognizer's view\n    case view\n\n    /// The target view will be the gestureRecognizer's view's superview\n    case superview\n\n    /// The target view will be the gestureRecognizer's view's window\n    case window\n\n    /// The target view will be the given view\n    case this(View)\n\n    public func targetView(for gestureRecognizer: GestureRecognizer) -> View? {\n        switch self {\n        case .view:\n            return gestureRecognizer.view\n        case .superview:\n            return gestureRecognizer.view?.superview\n        case .window:\n            #if os(iOS)\n                return gestureRecognizer.view?.window\n            #elseif os(OSX)\n                return gestureRecognizer.view?.window?.contentView\n            #endif\n        case .this(let view):\n            return view\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxGesture/Pod/Classes/View+RxGesture.swift",
    "content": "// Copyright (c) RxSwiftCommunity\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport RxSwift\nimport RxCocoa\n\nextension Reactive where Base: View {\n\n    /**\n     Reactive wrapper for multiple view gesture recognizers.\n     It automatically attaches the gesture recognizers to the receiver view.\n     The value the `Observable` emits is the gesture recognizer itself.\n\n     rx.anyGesture can't error and is subscribed/observed on main scheduler.\n     - parameter factories: a `(GestureRecognizerFactory + state)` collection you want to use to create the `GestureRecognizers` to add and observe\n     - returns: a `ControlEvent<G>` that re-emit the gesture recognizer itself\n     */\n    public func anyGesture(_ factories: (AnyGestureRecognizerFactory, when: GestureRecognizerState)...) -> ControlEvent<GestureRecognizer> {\n        let observables = factories.map { gesture, state in\n            self.gesture(gesture).when(state).asObservable() as Observable<GestureRecognizer>\n        }\n        let source = Observable.from(observables).merge()\n        return ControlEvent(events: source)\n    }\n\n    /**\n     Reactive wrapper for multiple view gesture recognizers.\n     It automatically attaches the gesture recognizers to the receiver view.\n     The value the `Observable` emits is the gesture recognizer itself.\n\n     rx.anyGesture can't error and is subscribed/observed on main scheduler.\n     - parameter factories: a `GestureRecognizerFactory` collection you want to use to create the `GestureRecognizers` to add and observe\n     - returns: a `ControlEvent<G>` that re-emit the gesture recognizer itself\n     */\n    public func anyGesture(_ factories: AnyGestureRecognizerFactory...) -> ControlEvent<GestureRecognizer> {\n        let observables = factories.map { gesture in\n            self.gesture(gesture).asObservable() as Observable<GestureRecognizer>\n        }\n        let source = Observable.from(observables).merge()\n        return ControlEvent(events: source)\n    }\n\n    /**\n     Reactive wrapper for a single view gesture recognizer.\n     It automatically attaches the gesture recognizer to the receiver view.\n     The value the `Observable` emits is the gesture recognizer itself.\n\n     rx.gesture can't error and is subscribed/observed on main scheduler.\n     - parameter factory: a `GestureRecognizerFactory` you want to use to create the `GestureRecognizer` to add and observe\n     - returns: a `ControlEvent<G>` that re-emit the gesture recognizer itself\n     */\n    public func gesture<GF: GestureRecognizerFactory, G>(_ factory: GF) -> ControlEvent<G>\n        where GF.Gesture == G {\n        return self.gesture(factory.make())\n    }\n\n    /**\n     Reactive wrapper for a single view gesture recognizer.\n     It automatically attaches the gesture recognizer to the receiver view.\n     The value the `Observable` emits is the gesture recognizer itself.\n\n     rx.gesture can't error and is subscribed/observed on main scheduler.\n     - parameter gesture: a `GestureRecognizer` you want to add and observe\n     - returns: a `ControlEvent<G>` that re-emit the gesture recognizer itself\n     */\n    public func gesture<G: GestureRecognizer>(_ gesture: G) -> ControlEvent<G> {\n\n        let source = Observable.deferred {\n            [weak control = self.base] () -> Observable<G> in\n            MainScheduler.ensureExecutingOnScheduler()\n\n            guard let control = control else { return .empty() }\n\n            let genericGesture = gesture as GestureRecognizer\n\n            #if os(iOS)\n                control.isUserInteractionEnabled = true\n            #endif\n\n            control.addGestureRecognizer(gesture)\n\n            return genericGesture.rx.event\n                .map { $0 as! G }\n                .startWith(gesture)\n                .do(onDispose: { [weak control, weak gesture] () in\n                    guard let gesture = gesture else { return }\n                    control?.removeGestureRecognizer(gesture)\n                })\n                .takeUntil(control.rx.deallocated)\n        }\n\n        return ControlEvent(events: source)\n    }\n}\n"
  },
  {
    "path": "Pods/RxGesture/Pod/Classes/iOS/TransformGestureRecognizers.swift",
    "content": "// Copyright (c) RxSwiftCommunity\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\n\npublic protocol TransformGestureRecognizersType {\n    var panGesture: UIPanGestureRecognizer { get }\n    var rotationGesture: UIRotationGestureRecognizer { get }\n    var pinchGesture: UIPinchGestureRecognizer { get }\n}\n\npublic struct TransformGestureRecognizers: TransformGestureRecognizersType {\n    public let panGesture: UIPanGestureRecognizer\n    public let rotationGesture: UIRotationGestureRecognizer\n    public let pinchGesture: UIPinchGestureRecognizer\n}\n\npublic struct TransformVelocity {\n    let translation: CGPoint\n    let rotation: CGFloat\n    let scale: CGFloat\n}\n\npublic extension Reactive where Base: UIView {\n    public func transformGestures(\n        configuration: ((TransformGestureRecognizers, RxGestureRecognizerDelegate) -> Void)? = nil\n        ) -> ControlEvent<TransformGestureRecognizers> {\n\n        let source = Observable.combineLatest(panGesture(), rotationGesture(), pinchGesture()) {\n            return TransformGestureRecognizers(\n                panGesture: $0,\n                rotationGesture: $1,\n                pinchGesture: $2\n            )\n        }\n\n        return ControlEvent(events: source)\n    }\n}\n\npublic extension ObservableType where E: TransformGestureRecognizersType {\n\n    public func when(_ states: UIGestureRecognizerState...) -> Observable<E> {\n        return filter { gestures in\n            return states.contains(gestures.panGesture.state)\n                || states.contains(gestures.rotationGesture.state)\n                || states.contains(gestures.pinchGesture.state)\n        }\n    }\n\n    public func asTransform(in view: TargetView = .view) -> Observable<(transform: CGAffineTransform, velocity: TransformVelocity)> {\n        return self.map { gestures in\n            let translationView = view.targetView(for: gestures.panGesture)\n            let translation = gestures.panGesture.translation(in: translationView)\n\n            let transform = CGAffineTransform.identity\n                .rotated(by: gestures.rotationGesture.rotation)\n                .scaledBy(x: gestures.pinchGesture.scale, y: gestures.pinchGesture.scale)\n                .translatedBy(x: translation.x, y: translation.y)\n\n            let velocity = TransformVelocity(\n                translation: gestures.panGesture.velocity(in: translationView),\n                rotation: gestures.rotationGesture.velocity,\n                scale: gestures.pinchGesture.velocity\n            )\n\n            return (transform, velocity)\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxGesture/Pod/Classes/iOS/UIGestureRecognizer+RxGesture.swift",
    "content": "// Copyright (c) RxSwiftCommunity\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\n\npublic extension ObservableType where E: UIGestureRecognizer {\n\n    /**\n     Filters the observable `GestureRecognizer` events sequence based on the `GestureRecognizer` state.\n\n     - parameter state: An `UIGestureRecognizerState` that is used to filter the `GestureRecognizer` events sequence.\n     - returns: An observable `GestureRecognizer` events sequence that only contains events emitted while the `GestureRecognizer`'s state match the given `state`.\n     */\n    public func when(_ states: UIGestureRecognizerState...) -> Observable<E> {\n        return filter { gesture in\n            return states.contains(gesture.state)\n        }\n    }\n\n    /**\n     Filters the observable `GestureRecognizer` events sequence based on the `GestureRecognizer` state.\n\n     - parameter state: An `UIGestureRecognizerState` that is used to filter the `GestureRecognizer` events sequence.\n     - returns: An observable `GestureRecognizer` events sequence that only contains events emitted while the `GestureRecognizer`'s state match the given `state`.\n     */\n    internal func when(_ states: [UIGestureRecognizerState]) -> Observable<E> {\n        return filter { gesture in\n            return states.contains(gesture.state)\n        }\n    }\n\n    /**\n     Maps the observable `GestureRecognizer` events sequence to an observable sequence of points computed as the location in the given `view` of the gesture.\n\n     - parameter view: A `TargetView` value on which the gesture took place.\n     */\n    public func asLocation(in view: TargetView = .view) -> Observable<CGPoint> {\n        return map { gesture in\n            return gesture.location(in: view.targetView(for: gesture))\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxGesture/Pod/Classes/iOS/UILongPressGestureRecognizer+RxGesture.swift",
    "content": "// Copyright (c) RxSwiftCommunity\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\n\n/// Default values for `UILongPressGestureRecognizer` configuration\npublic enum LongPressGestureRecognizerDefaults {\n    public static var numberOfTouchesRequired: Int = 1\n    public static var numberOfTapsRequired: Int = 0\n    public static var minimumPressDuration: CFTimeInterval = 0.5\n    public static var allowableMovement: CGFloat = 10\n    public static var configuration: ((UILongPressGestureRecognizer, RxGestureRecognizerDelegate) -> Void)?\n}\n\nfileprivate typealias Defaults = LongPressGestureRecognizerDefaults\n\n/// A `GestureRecognizerFactory` for `UITapGestureRecognizer`\npublic struct LongPressGestureRecognizerFactory: GestureRecognizerFactory {\n\n    public typealias Gesture = UILongPressGestureRecognizer\n    public let configuration: (UILongPressGestureRecognizer, RxGestureRecognizerDelegate) -> Void\n\n    /**\n     Initialiaze a `GestureRecognizerFactory` for `UILongPressGestureRecognizer`\n     - parameter numberOfTouchesRequired: Number of fingers that must be held down for the gesture to be recognized\n     - parameter numberOfTapsRequired: The number of full taps required before the press for gesture to be recognized\n     - parameter minimumPressDuration: Time in seconds the fingers must be held down for the gesture to be recognized\n     - parameter allowableMovement: Maximum movement in pixels allowed before the gesture fails. Once recognized (after minimumPressDuration) there is no limit on finger movement for the remainder of the touch tracking\n     - parameter configuration: A closure that allows to fully configure the gesture recognizer\n     */\n    public init(\n        numberOfTouchesRequired: Int = Defaults.numberOfTouchesRequired,\n        numberOfTapsRequired: Int = Defaults.numberOfTapsRequired,\n        minimumPressDuration: CFTimeInterval = Defaults.minimumPressDuration,\n        allowableMovement: CGFloat = Defaults.allowableMovement,\n        configuration: ((UILongPressGestureRecognizer, RxGestureRecognizerDelegate) -> Void)? = Defaults.configuration\n        ) {\n        self.configuration = { gestureRecognizer, delegate in\n            gestureRecognizer.numberOfTouchesRequired = numberOfTouchesRequired\n            gestureRecognizer.numberOfTapsRequired = numberOfTapsRequired\n            gestureRecognizer.minimumPressDuration = minimumPressDuration\n            gestureRecognizer.allowableMovement = allowableMovement\n            configuration?(gestureRecognizer, delegate)\n        }\n    }\n}\n\nextension AnyGestureRecognizerFactory {\n\n    /**\n     Returns an `AnyGestureRecognizerFactory` for `UILongPressGestureRecognizer`\n     - parameter numberOfTouchesRequired: Number of fingers that must be held down for the gesture to be recognized\n     - parameter numberOfTapsRequired: The number of full taps required before the press for gesture to be recognized\n     - parameter minimumPressDuration: Time in seconds the fingers must be held down for the gesture to be recognized\n     - parameter allowableMovement: Maximum movement in pixels allowed before the gesture fails. Once recognized (after minimumPressDuration) there is no limit on finger movement for the remainder of the touch tracking\n     - parameter configuration: A closure that allows to fully configure the gesture recognizer\n     */\n    public static func longPress(\n        numberOfTouchesRequired: Int = Defaults.numberOfTouchesRequired,\n        numberOfTapsRequired: Int = Defaults.numberOfTapsRequired,\n        minimumPressDuration: CFTimeInterval = Defaults.minimumPressDuration,\n        allowableMovement: CGFloat = Defaults.allowableMovement,\n        configuration: ((UILongPressGestureRecognizer, RxGestureRecognizerDelegate) -> Void)? = Defaults.configuration\n        ) -> AnyGestureRecognizerFactory {\n        let gesture = LongPressGestureRecognizerFactory(\n            numberOfTouchesRequired: numberOfTouchesRequired,\n            numberOfTapsRequired: numberOfTapsRequired,\n            minimumPressDuration: minimumPressDuration,\n            allowableMovement: allowableMovement,\n            configuration: configuration\n        )\n        return AnyGestureRecognizerFactory(gesture)\n    }\n}\n\npublic extension Reactive where Base: UIView {\n\n    /**\n     Returns an observable `UILongPressGestureRecognizer` events sequence\n     - parameter numberOfTouchesRequired: Number of fingers that must be held down for the gesture to be recognized\n     - parameter numberOfTapsRequired: The number of full taps required before the press for gesture to be recognized\n     - parameter minimumPressDuration: Time in seconds the fingers must be held down for the gesture to be recognized\n     - parameter allowableMovement: Maximum movement in pixels allowed before the gesture fails. Once recognized (after minimumPressDuration) there is no limit on finger movement for the remainder of the touch tracking\n     - parameter configuration: A closure that allows to fully configure the gesture recognizer\n     */\n    public func longPressGesture(\n        numberOfTouchesRequired: Int = Defaults.numberOfTouchesRequired,\n        numberOfTapsRequired: Int = Defaults.numberOfTapsRequired,\n        minimumPressDuration: CFTimeInterval = Defaults.minimumPressDuration,\n        allowableMovement: CGFloat = Defaults.allowableMovement,\n        configuration: ((UILongPressGestureRecognizer, RxGestureRecognizerDelegate) -> Void)? = Defaults.configuration\n        ) -> ControlEvent<UILongPressGestureRecognizer> {\n\n        return gesture(LongPressGestureRecognizerFactory(\n            numberOfTouchesRequired: numberOfTouchesRequired,\n            numberOfTapsRequired: numberOfTapsRequired,\n            minimumPressDuration: minimumPressDuration,\n            allowableMovement: allowableMovement,\n            configuration: configuration\n        ))\n    }\n}\n"
  },
  {
    "path": "Pods/RxGesture/Pod/Classes/iOS/UIPanGestureRecognizer+RxGesture.swift",
    "content": "// Copyright (c) RxSwiftCommunity\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\n\n/// Default values for `UIPanGestureRecognizer` configuration\npublic enum PanGestureRecognizerDefaults {\n    public static var minimumNumberOfTouches: Int = 1\n    public static var maximumNumberOfTouches: Int = Int.max\n    public static var configuration: ((UIPanGestureRecognizer, RxGestureRecognizerDelegate) -> Void)?\n}\n\nfileprivate typealias Defaults = PanGestureRecognizerDefaults\n\n/// A `GestureRecognizerFactory` for `UIPanGestureRecognizer`\npublic struct PanGestureRecognizerFactory: GestureRecognizerFactory {\n    public typealias Gesture = UIPanGestureRecognizer\n    public let configuration: (UIPanGestureRecognizer, RxGestureRecognizerDelegate) -> Void\n\n    /**\n     Initialiaze a `GestureRecognizerFactory` for `UITapGestureRecognizer`\n     - parameter minimumNumberOfTouches: The minimum number of touches required to match\n     - parameter maximumNumberOfTouches: The maximum number of touches that can be down\n     - parameter configuration: A closure that allows to fully configure the gesture recognizer\n     */\n    public init(\n        minimumNumberOfTouches: Int = Defaults.minimumNumberOfTouches,\n        maximumNumberOfTouches: Int = Defaults.maximumNumberOfTouches,\n        configuration: ((UIPanGestureRecognizer, RxGestureRecognizerDelegate) -> Void)? = Defaults.configuration\n        ) {\n        self.configuration = { gesture, delegate in\n            gesture.minimumNumberOfTouches = minimumNumberOfTouches\n            gesture.maximumNumberOfTouches = maximumNumberOfTouches\n            configuration?(gesture, delegate)\n        }\n    }\n}\n\nextension AnyGestureRecognizerFactory {\n\n    /**\n     Returns an `AnyGestureRecognizerFactory` for `UIPanGestureRecognizer`\n     - parameter minimumNumberOfTouches: The minimum number of touches required to match\n     - parameter maximumNumberOfTouches: The maximum number of touches that can be down\n     - parameter configuration: A closure that allows to fully configure the gesture recognizer\n     */\n    public static func pan(\n        minimumNumberOfTouches: Int = Defaults.minimumNumberOfTouches,\n        maximumNumberOfTouches: Int = Defaults.maximumNumberOfTouches,\n        configuration: ((UIPanGestureRecognizer, RxGestureRecognizerDelegate) -> Void)? = Defaults.configuration\n        ) -> AnyGestureRecognizerFactory {\n        let gesture = PanGestureRecognizerFactory(\n            minimumNumberOfTouches: minimumNumberOfTouches,\n            maximumNumberOfTouches: maximumNumberOfTouches,\n            configuration: configuration\n        )\n        return AnyGestureRecognizerFactory(gesture)\n    }\n}\n\npublic extension Reactive where Base: UIView {\n\n    /**\n     Returns an observable `UIPanGestureRecognizer` events sequence\n     - parameter minimumNumberOfTouches: The minimum number of touches required to match\n     - parameter maximumNumberOfTouches: The maximum number of touches that can be down\n     - parameter configuration: A closure that allows to fully configure the gesture recognizer\n     */\n    public func panGesture(\n        minimumNumberOfTouches: Int = Defaults.minimumNumberOfTouches,\n        maximumNumberOfTouches: Int = Defaults.maximumNumberOfTouches,\n        configuration: ((UIPanGestureRecognizer, RxGestureRecognizerDelegate) -> Void)? = Defaults.configuration\n        ) -> ControlEvent<UIPanGestureRecognizer> {\n\n        return gesture(PanGestureRecognizerFactory(\n            minimumNumberOfTouches: minimumNumberOfTouches,\n            maximumNumberOfTouches: maximumNumberOfTouches,\n            configuration: configuration\n        ))\n    }\n}\n\npublic extension ObservableType where E: UIPanGestureRecognizer {\n\n    /**\n     Maps the observable `GestureRecognizer` events sequence to an observable sequence of translation values of the pan gesture in the coordinate system of the specified `view` alongside the gesture velocity.\n\n     - parameter view: A `TargetView` value on which the gesture took place.\n     */\n    public func asTranslation(in view: TargetView = .view) -> Observable<(translation: CGPoint, velocity: CGPoint)> {\n        return self.map { gesture in\n            let view = view.targetView(for: gesture)\n            return (\n                gesture.translation(in: view),\n                gesture.velocity(in: view)\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxGesture/Pod/Classes/iOS/UIPinchGestureRecognizer+RxGesture.swift",
    "content": "// Copyright (c) RxSwiftCommunity\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\n\n/// Default values for `UIPinchGestureRecognizer` configuration\npublic enum PinchGestureRecognizerDefaults {\n    public static var configuration: ((UIPinchGestureRecognizer, RxGestureRecognizerDelegate) -> Void)?\n}\n\nfileprivate typealias Defaults = PinchGestureRecognizerDefaults\n\n/// A `GestureRecognizerFactory` for `UIPinchGestureRecognizer`\npublic struct PinchGestureRecognizerFactory: GestureRecognizerFactory {\n    public typealias Gesture = UIPinchGestureRecognizer\n    public let configuration: (UIPinchGestureRecognizer, RxGestureRecognizerDelegate) -> Void\n\n    /**\n     Initialiaze a `GestureRecognizerFactory` for `UIPinchGestureRecognizer`\n     - parameter configuration: A closure that allows to fully configure the gesture recognizer\n     */\n    public init(\n        configuration: ((UIPinchGestureRecognizer, RxGestureRecognizerDelegate) -> Void)? = Defaults.configuration\n        ) {\n        self.configuration = configuration ?? { _, _  in }\n    }\n}\n\nextension AnyGestureRecognizerFactory {\n\n    /**\n     Returns an `AnyGestureRecognizerFactory` for `UIPinchGestureRecognizer`\n     - parameter configuration: A closure that allows to fully configure the gesture recognizer\n     */\n    public static func pinch(\n        configuration: ((UIPinchGestureRecognizer, RxGestureRecognizerDelegate) -> Void)? = Defaults.configuration\n        ) -> AnyGestureRecognizerFactory {\n        let gesture = PinchGestureRecognizerFactory(\n            configuration: configuration\n        )\n        return AnyGestureRecognizerFactory(gesture)\n    }\n}\n\npublic extension Reactive where Base: UIView {\n\n    /**\n     Returns an observable `UIPinchGestureRecognizer` events sequence\n     - parameter configuration: A closure that allows to fully configure the gesture recognizer\n     */\n    public func pinchGesture(\n        configuration: ((UIPinchGestureRecognizer, RxGestureRecognizerDelegate) -> Void)? = Defaults.configuration\n        ) -> ControlEvent<UIPinchGestureRecognizer> {\n\n        return gesture(PinchGestureRecognizerFactory(\n            configuration: configuration\n        ))\n    }\n}\n\npublic extension ObservableType where E: UIPinchGestureRecognizer {\n\n    /**\n     Maps the observable `GestureRecognizer` events sequence to an observable sequence of scale factors relative to the points of the two touches in screen coordinates alongside the gesture velocity.\n     */\n    public func asScale() -> Observable<(scale: CGFloat, velocity: CGFloat)> {\n        return self.map { gesture in\n            return (gesture.scale, gesture.velocity)\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxGesture/Pod/Classes/iOS/UIRotationGestureRecognizer+RxGesture.swift",
    "content": "// Copyright (c) RxSwiftCommunity\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\n\n/// Default values for `UIRotationGestureRecognizer` configuration\npublic enum RotationGestureRecognizerDefaults {\n    public static var configuration: ((UIRotationGestureRecognizer, RxGestureRecognizerDelegate) -> Void)?\n}\n\nfileprivate typealias Defaults = RotationGestureRecognizerDefaults\n\n/// A `GestureRecognizerFactory` for `UIRotationGestureRecognizer`\npublic struct RotationGestureRecognizerFactory: GestureRecognizerFactory {\n    public typealias Gesture = UIRotationGestureRecognizer\n    public let configuration: (UIRotationGestureRecognizer, RxGestureRecognizerDelegate) -> Void\n\n    /**\n     Initialiaze a `GestureRecognizerFactory` for `UIRotationGestureRecognizer`\n     - parameter configuration: A closure that allows to fully configure the gesture recognizer\n     */\n    public init(\n        configuration: ((UIRotationGestureRecognizer, RxGestureRecognizerDelegate) -> Void)? = Defaults.configuration\n        ) {\n        self.configuration = { gesture, delegate in\n            configuration?(gesture, delegate)\n        }\n    }\n}\n\nextension AnyGestureRecognizerFactory {\n\n    /**\n     Returns an `AnyGestureRecognizerFactory` for `UIRotationGestureRecognizer`\n     - parameter configuration: A closure that allows to fully configure the gesture recognizer\n     */\n    public static func rotation(\n        configuration: ((UIRotationGestureRecognizer, RxGestureRecognizerDelegate) -> Void)? = Defaults.configuration\n        ) -> AnyGestureRecognizerFactory {\n        let gesture = RotationGestureRecognizerFactory(\n            configuration: configuration\n        )\n        return AnyGestureRecognizerFactory(gesture)\n    }\n}\n\npublic extension Reactive where Base: UIView {\n\n    /**\n     Returns an observable `UIRotationGestureRecognizer` events sequence\n     - parameter configuration: A closure that allows to fully configure the gesture recognizer\n     */\n    public func rotationGesture(\n        configuration: ((UIRotationGestureRecognizer, RxGestureRecognizerDelegate) -> Void)? = Defaults.configuration\n        ) -> ControlEvent<UIRotationGestureRecognizer> {\n        return gesture(RotationGestureRecognizerFactory(\n            configuration: configuration\n        ))\n    }\n}\n\npublic extension ObservableType where E: UIRotationGestureRecognizer {\n\n    /**\n     Maps the observable `GestureRecognizer` events sequence to an observable sequence of rotation values of the gesture in radians alongside the gesture velocity.\n     */\n    public func asRotation() -> Observable<(rotation: CGFloat, velocity: CGFloat)> {\n        return self.map { gesture in\n            return (gesture.rotation, gesture.velocity)\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxGesture/Pod/Classes/iOS/UIScreenEdgePanGestureRecognizer+RxGesture.swift",
    "content": "// Copyright (c) RxSwiftCommunity\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\n\n/// Default values for `UIScreenEdgePanGestureRecognizer` configuration\npublic enum UIScreenEdgePanGestureRecognizerDefaults {\n    public static var configuration: ((UIScreenEdgePanGestureRecognizer, RxGestureRecognizerDelegate) -> Void)?\n}\n\nfileprivate typealias Defaults = UIScreenEdgePanGestureRecognizerDefaults\n\n/// A `GestureRecognizerFactory` for `UIScreenEdgePanGestureRecognizer`\npublic struct ScreenEdgePanGestureRecognizerFactory: GestureRecognizerFactory {\n    public typealias Gesture = UIScreenEdgePanGestureRecognizer\n    public let configuration: (UIScreenEdgePanGestureRecognizer, RxGestureRecognizerDelegate) -> Void\n\n    /**\n     Initialiaze a `GestureRecognizerFactory` for `UIScreenEdgePanGestureRecognizer`\n     - parameter edges: The edges on which this gesture recognizes, relative to the current interface orientation\n     - parameter configuration: A closure that allows to fully configure the gesture recognizer\n     */\n    public init(\n        edges: UIRectEdge,\n        configuration: ((UIScreenEdgePanGestureRecognizer, RxGestureRecognizerDelegate) -> Void)? = Defaults.configuration\n        ) {\n        self.configuration = { gestureRecognizer, delegate in\n            gestureRecognizer.edges = edges\n            configuration?(gestureRecognizer, delegate)\n        }\n    }\n}\n\nextension AnyGestureRecognizerFactory {\n\n    /**\n     Returns an `AnyGestureRecognizerFactory` for `UIScreenEdgePanGestureRecognizer`\n     - parameter edges: The edges on which this gesture recognizes, relative to the current interface orientation\n     - parameter configuration: A closure that allows to fully configure the gesture recognizer\n     */\n    public static func screenEdgePan(\n        edges: UIRectEdge,\n        configuration: ((UIScreenEdgePanGestureRecognizer, RxGestureRecognizerDelegate) -> Void)? = Defaults.configuration\n        ) -> AnyGestureRecognizerFactory {\n        let gesture = ScreenEdgePanGestureRecognizerFactory(\n            edges: edges,\n            configuration: configuration\n        )\n        return AnyGestureRecognizerFactory(gesture)\n    }\n}\n\npublic extension Reactive where Base: UIView {\n\n    /**\n     Returns an observable `UIScreenEdgePanGestureRecognizer` events sequence\n     - parameter edges: The edges on which this gesture recognizes, relative to the current interface orientation\n     - parameter configuration: A closure that allows to fully configure the gesture recognizer\n     */\n    public func screenEdgePanGesture(\n        edges: UIRectEdge,\n        configuration: ((UIScreenEdgePanGestureRecognizer, RxGestureRecognizerDelegate) -> Void)? = Defaults.configuration\n        ) -> ControlEvent<UIScreenEdgePanGestureRecognizer> {\n\n        return gesture(ScreenEdgePanGestureRecognizerFactory(\n            edges: edges,\n            configuration: configuration\n            ))\n    }\n}\n"
  },
  {
    "path": "Pods/RxGesture/Pod/Classes/iOS/UISwipeGestureRecognizer+RxGesture.swift",
    "content": "// Copyright (c) RxSwiftCommunity\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\n\n/// Default values for `UISwipeGestureRecognizer` configuration\npublic enum UISwipeGestureRecognizerDefaults {\n    public static var numberOfTouchesRequired: Int = 1\n    public static var configuration: ((UISwipeGestureRecognizer, RxGestureRecognizerDelegate) -> Void)?\n}\n\nfileprivate typealias Defaults = UISwipeGestureRecognizerDefaults\n\n/// A `GestureRecognizerFactory` for `UISwipeGestureRecognizer`\npublic struct SwipeGestureRecognizerFactory: GestureRecognizerFactory {\n    public typealias Gesture = UISwipeGestureRecognizer\n    public let configuration: (UISwipeGestureRecognizer, RxGestureRecognizerDelegate) -> Void\n\n    /**\n     Initialiaze a `GestureRecognizerFactory` for `UISwipeGestureRecognizer`\n     - parameter numberOfTouchesRequired: The number of fingers required to match\n     - parameter configuration: A closure that allows to fully configure the gesture recognizer\n     */\n    public init(\n        _ direction: UISwipeGestureRecognizerDirection,\n        numberOfTouchesRequired: Int = Defaults.numberOfTouchesRequired,\n        configuration: ((UISwipeGestureRecognizer, RxGestureRecognizerDelegate) -> Void)? = Defaults.configuration\n        ) {\n        self.configuration = { gesture, delegate in\n            gesture.direction = direction\n            gesture.numberOfTouchesRequired = numberOfTouchesRequired\n            configuration?(gesture, delegate)\n        }\n    }\n}\n\nextension AnyGestureRecognizerFactory {\n\n    /**\n     Returns an `AnyGestureRecognizerFactory` for `UISwipeGestureRecognizer`\n     - parameter numberOfTouchesRequired: The number of fingers required to match\n     - parameter configuration: A closure that allows to fully configure the gesture recognizer\n     */\n    public static func swipe(\n        _ direction: UISwipeGestureRecognizerDirection,\n        numberOfTouchesRequired: Int = Defaults.numberOfTouchesRequired,\n        configuration: ((UISwipeGestureRecognizer, RxGestureRecognizerDelegate) -> Void)? = Defaults.configuration\n        ) -> AnyGestureRecognizerFactory {\n        let gesture = SwipeGestureRecognizerFactory(\n            direction,\n            numberOfTouchesRequired: numberOfTouchesRequired,\n            configuration: configuration\n        )\n        return AnyGestureRecognizerFactory(gesture)\n    }\n}\n\npublic extension Reactive where Base: UIView {\n\n    /**\n     Returns an observable `UISwipeGestureRecognizerDirection` events sequence\n     - parameter numberOfTouchesRequired: The number of fingers required to match\n     - parameter configuration: A closure that allows to fully configure the gesture recognizer\n     */\n    public func swipeGesture(\n        _ direction: UISwipeGestureRecognizerDirection,\n        numberOfTouchesRequired: Int = Defaults.numberOfTouchesRequired,\n        configuration: ((UISwipeGestureRecognizer, RxGestureRecognizerDelegate) -> Void)? = Defaults.configuration\n        ) -> ControlEvent<UISwipeGestureRecognizer> {\n\n        return gesture(SwipeGestureRecognizerFactory(\n            direction,\n            numberOfTouchesRequired: numberOfTouchesRequired,\n            configuration: configuration\n        ))\n    }\n}\n"
  },
  {
    "path": "Pods/RxGesture/Pod/Classes/iOS/UITapGestureRecognizer+RxGesture.swift",
    "content": "// Copyright (c) RxSwiftCommunity\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\n\n/// Default values for `UITapGestureRecognizer` configuration\npublic enum UITapGestureRecognizerDefaults {\n    public static var numberOfTouchesRequired: Int = 1\n    public static var numberOfTapsRequired: Int = 1\n    public static var configuration: ((UITapGestureRecognizer, RxGestureRecognizerDelegate) -> Void)?\n}\n\nfileprivate typealias Defaults = UITapGestureRecognizerDefaults\n\n/// A `GestureRecognizerFactory` for `UITapGestureRecognizer`\npublic struct TapGestureRecognizerFactory: GestureRecognizerFactory {\n    public typealias Gesture = UITapGestureRecognizer\n    public let configuration: (UITapGestureRecognizer, RxGestureRecognizerDelegate) -> Void\n\n    /**\n     Initialiaze a `GestureRecognizerFactory` for `UITapGestureRecognizer`\n     - parameter numberOfTouchesRequired: The number of fingers required to match\n     - parameter numberOfTapsRequired: The number of taps required to match\n     - parameter configuration: A closure that allows to fully configure the gesture recognizer\n     */\n    public init(\n        numberOfTouchesRequired: Int = Defaults.numberOfTouchesRequired,\n        numberOfTapsRequired: Int = Defaults.numberOfTapsRequired,\n        configuration: ((UITapGestureRecognizer, RxGestureRecognizerDelegate) -> Void)? = Defaults.configuration\n        ) {\n        self.configuration = { gesture, delegate in\n            gesture.numberOfTouchesRequired = numberOfTouchesRequired\n            gesture.numberOfTapsRequired = numberOfTapsRequired\n            configuration?(gesture, delegate)\n        }\n    }\n}\n\nextension AnyGestureRecognizerFactory {\n\n    /**\n     Returns an `AnyGestureRecognizerFactory` for `UITapGestureRecognizer`\n     - parameter numberOfTouchesRequired: The number of fingers required to match\n     - parameter numberOfTapsRequired: The number of taps required to match\n     - parameter configuration: A closure that allows to fully configure the gesture recognizer\n     */\n    public static func tap(\n        numberOfTouchesRequired: Int = Defaults.numberOfTouchesRequired,\n        numberOfTapsRequired: Int = Defaults.numberOfTapsRequired,\n        configuration: ((UITapGestureRecognizer, RxGestureRecognizerDelegate) -> Void)? = Defaults.configuration\n        ) -> AnyGestureRecognizerFactory {\n        let gesture = TapGestureRecognizerFactory(\n            numberOfTouchesRequired: numberOfTouchesRequired,\n            numberOfTapsRequired: numberOfTapsRequired,\n            configuration: configuration\n        )\n        return AnyGestureRecognizerFactory(gesture)\n    }\n}\n\npublic extension Reactive where Base: UIView {\n\n    /**\n     Returns an observable `UITapGestureRecognizer` events sequence\n     - parameter numberOfTouchesRequired: The number of fingers required to match\n     - parameter numberOfTapsRequired: The number of taps required to match\n     - parameter configuration: A closure that allows to fully configure the gesture recognizer\n     */\n    public func tapGesture(\n        numberOfTouchesRequired: Int = Defaults.numberOfTouchesRequired,\n        numberOfTapsRequired: Int = Defaults.numberOfTapsRequired,\n        configuration: ((UITapGestureRecognizer, RxGestureRecognizerDelegate) -> Void)? = Defaults.configuration\n        ) -> ControlEvent<UITapGestureRecognizer> {\n\n        return gesture(TapGestureRecognizerFactory(\n            numberOfTouchesRequired: numberOfTouchesRequired,\n            numberOfTapsRequired: numberOfTapsRequired,\n            configuration: configuration\n        ))\n    }\n}\n"
  },
  {
    "path": "Pods/RxGesture/README.md",
    "content": "# RxGesture\n\n[![Version](https://img.shields.io/cocoapods/v/RxGesture.svg?style=flat)](http://cocoapods.org/pods/RxGesture)\n[![License](https://img.shields.io/cocoapods/l/RxGesture.svg?style=flat)](http://cocoapods.org/pods/RxGesture)\n[![Platform](https://img.shields.io/cocoapods/p/RxGesture.svg?style=flat)](http://cocoapods.org/pods/RxGesture)\n\n## Usage\n\n![](Pod/Assets/demo.gif)\n\nTo run the example project, clone the repo, in the __Example__ folder open `RxGesture.xcworkspace`.\n\nYou _might_ need to run `pod install` from the Example directory first.\n\n---\n\n__RxGesture__ allows you to easily turn any view into a tappable or swipeable control like so:\n\n```swift\nview.rx\n  .tapGesture()\n  .when(.recognized)\n  .subscribe(onNext: { _ in\n    //react to taps\n  })\n  .disposed(by: stepBag)\n```\n\nYou can also react to more than one  gesture. For example to dismiss a photo preview you might want to do that when the user taps it, or swipes up or down:\n\n```swift\nview.rx\n  .anyGesture(.tap(), .swipe([.up, .down]))\n  .when(.recognized)\n  .subscribe(onNext: { _ in\n    //dismiss presented photo\n  })\n  .disposed(by: stepBag)\n```\n\n`rx.gesture` is defined as `Observable<G>` where `G` is the actual type of the gesture recognizer so what it emits is the gesture recognizer itself (handy if want to call methods like `asLocation(in view:)` or `asTranslation(in view:)`)\n\n\n#### On iOS, RxGesture supports:\n\n```swift\nview.rx.tapGesture()           -> ControlEvent<UITapGestureRecognizer>\nview.rx.pinchGesture()         -> ControlEvent<UIPinchGestureRecognizer>\nview.rx.swipeGesture(.left)    -> ControlEvent<UISwipeGestureRecognizer>\nview.rx.panGesture()           -> ControlEvent<UIPanGestureRecognizer>\nview.rx.longPressGesture()     -> ControlEvent<UILongPressGestureRecognizer>\nview.rx.rotationGesture()      -> ControlEvent<UIRotationGestureRecognizer>\nview.rx.screenEdgePanGesture() -> ControlEvent<UIScreenEdgePanGestureRecognizer>\n\nview.rx.anyGesture(.tap(), ...)           -> ControlEvent<UIGestureRecognizer>\nview.rx.anyGesture(.pinch(), ...)         -> ControlEvent<UIGestureRecognizer>\nview.rx.anyGesture(.swipe(.left), ...)    -> ControlEvent<UIGestureRecognizer>\nview.rx.anyGesture(.pan(), ...)           -> ControlEvent<UIGestureRecognizer>\nview.rx.anyGesture(.longPress(), ...)     -> ControlEvent<UIGestureRecognizer>\nview.rx.anyGesture(.rotation(), ...)      -> ControlEvent<UIGestureRecognizer>\nview.rx.anyGesture(.screenEdgePan(), ...) -> ControlEvent<UIGestureRecognizer>\n```\n\n#### On macOS, RxGesture supports:\n\n```swift\nview.rx.clickGesture()         -> ControlEvent<NSClickGestureRecognizer>\nview.rx.rightClickGesture()    -> ControlEvent<NSClickGestureRecognizer>\nview.rx.panGesture()           -> ControlEvent<NSPanGestureRecognizer>\nview.rx.pressGesture()         -> ControlEvent<NSPressGestureRecognizer>\nview.rx.rotationGesture()      -> ControlEvent<NSRotationGestureRecognizer>\nview.rx.magnificationGesture() -> ControlEvent<NSMagnificationGestureRecognizer>\n\nview.rx.anyGesture(.click(), ...)         -> ControlEvent<NSGestureRecognizer>\nview.rx.anyGesture(.rightClick(), ...)    -> ControlEvent<NSGestureRecognizer>\nview.rx.anyGesture(.pan(), ...)           -> ControlEvent<NSGestureRecognizer>\nview.rx.anyGesture(.press(), ...)         -> ControlEvent<NSGestureRecognizer>\nview.rx.anyGesture(.rotation(), ...)      -> ControlEvent<NSGestureRecognizer>\nview.rx.anyGesture(.magnification(), ...) -> ControlEvent<NSGestureRecognizer>\n```\n\n\nℹ️ If you use a gesture recognizer alone, prefer the `view.rx.fooGesture()` syntax over `view.rx.anyGesture(.foo())` because it returns the concrete `UIGestureRecognizer` subclass and avoid you to cast it in `subscribe()`.\n\n\n## Filtering State\n\nBy default, there is no filter on the state of the gesture recognizer. That means that you will always receive a first event with the initial state of the gesture recognizer (almost always `.possible`).\n\nHere are the preferred states that can be used for each kind of gestures (__iOS__ and __macOS__):\n\nKind | States\n---|---\n`.tap()` `.click()` `.rightClick()` `.swipe()`| `.recognized`\n`.longPress()` `.press()` | `.began`\n`.pan()` `.pinch()` `.rotation()` `.magnification()` `.screenEdgePan()` | `.began` `.changed` `.ended`\n\nYou usually filter the state using the `.when()` operator:\n```swift\nview.rx.tapGesture().when(.recognized)\nview.rx.panGesture().when(.began, .changed, .ended)\n```\n\nIf you are observing multiple gestures at once, you can use the `.when()` operator if you want to filter against the same state for __all__ gesture recognizers, or use the tuple syntax for individual filtering:\n\n```swift\nview.rx\n  .anyGesture(.tap(), .swipe([.up, .down]))\n  .when(.recognized)\n  .subscribe(onNext: { gesture in\n    // Called whenever a tap, a swipe-up or a swipe-down is recognized (state == .recognized)\n  })\n  .disposed(by: bag)\n\nview.rx\n  .anyGesture(\n    (.tap(), when: .recognized),\n    (.pan(), when: .ended)\n  )\n  .subscribe(onNext: { gesture in\n    // Called whenever:\n    // - a tap is recognized (state == .recognized)\n    // - or a pan is ended (state == .ended)\n  })\n  .disposed(by: bag)\n```\n\n\n__The demo app includes examples for all recognizers ➡️ [iOS](Example/RxGesture/ViewController.swift), [macOS](Example/RxGesture-OSX/ViewController.swift)__.\n\n## Delegate customization\n### Lightweight customization\nEach gesture recognizer has a default `RxGestureRecognizerDelegate`. It allows you to customize every delegate method using a policy:\n- `.always` will return `true` to the corresponding delegate method\n- `.never` will return `false` to the corresponding delegate method\n- `.custom` takes an associated closure that will be executed to return a value to the corresponding delegate method\n\nHere are the available policies with their corresponding delegate method:\n```swift\nbeginPolicy                   -> gestureRecognizerShouldBegin(:_)\ntouchReceptionPolicy          -> gestureRecognizer(_:shouldReceive:)\nselfFailureRequirementPolicy  -> gestureRecognizer(_:shouldBeRequiredToFailBy:)\notherFailureRequirementPolicy -> gestureRecognizer(_:shouldRequireFailureOf:)\nsimultaneousRecognitionPolicy -> gestureRecognizer(_:shouldRecognizeSimultaneouslyWith:)\neventRecognitionAttemptPolicy -> gestureRecognizer(_:shouldAttemptToRecognizeWith:) // macOS only\npressReceptionPolicy          -> gestureRecognizer(_:shouldReceive:) // iOS only\n```\n\nThis delegate can be customized in the configuration closure:\n```swift\nview.rx.tapGesture(configuration: { gestureRecognizer, delegate in\n  delegate.simultaneousRecognitionPolicy = .always // (default value)\n  // or\n  delegate.simultaneousRecognitionPolicy = .never\n  // or\n  delegate.simultaneousRecognitionPolicy = .custom { gestureRecognizer, otherGestureRecognizer in\n    return otherGestureRecognizer is UIPanGestureRecognizer\n  }\n  delegate.otherFailureRequirementPolicy = .custom { gestureRecognizer, otherGestureRecognizer in\n    return otherGestureRecognizer is UILongPressGestureRecognizer\n  }\n})\n```\n\nDefault values can be found in [`RxGestureRecognizerDelegate.swift`](Pod/Classes/RxGestureRecognizerDelegate.swift#L56).\n\n### Full customization\nYou can also replace the default delegate by your own, or remove it.\n```swift\nview.rx.tapGesture { [unowned self] gestureRecognizer, delegate in\n  gestureRecognizer.delegate = nil\n  // or\n  gestureRecognizer.delegate = self\n}\n```\n\n## Requirements\n\nThis library depends on both __RxSwift__ and __RxCocoa__.\n\n\n## Installation\n\n### [CocoaPods](https://guides.cocoapods.org/using/using-cocoapods.html)\n\nAdd this to `Podfile`\n\n```swift\npod \"RxGesture\"\n```\n\n```bash\n$ pod install\n```\n\n### [Carthage](https://github.com/Carthage/Carthage)\n\nAdd this to `Cartfile`\n\n```\ngithub \"RxSwiftCommunity/RxGesture\" ~> 1.1.1\n```\n\n```bash\n$ carthage update\n```\n\n## Thanks\n\nEveryone in the RxSwift Slack channel 💯\n\n## License\n\nRxGesture is available under the MIT license. See the LICENSE file for more info.\n"
  },
  {
    "path": "Pods/RxSwift/LICENSE.md",
    "content": "**The MIT License**\n**Copyright © 2015 Krunoslav Zaher**\n**All rights reserved.**\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
  },
  {
    "path": "Pods/RxSwift/Platform/DataStructures/Bag.swift",
    "content": "//\n//  Bag.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 2/28/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport Swift\n\nlet arrayDictionaryMaxSize = 30\n\nstruct BagKey {\n    /**\n    Unique identifier for object added to `Bag`.\n     \n    It's underlying type is UInt64. If we assume there in an idealized CPU that works at 4GHz,\n     it would take ~150 years of continuous running time for it to overflow.\n    */\n    fileprivate let rawValue: UInt64\n}\n\n/**\nData structure that represents a bag of elements typed `T`.\n\nSingle element can be stored multiple times.\n\nTime and space complexity of insertion an deletion is O(n). \n\nIt is suitable for storing small number of elements.\n*/\nstruct Bag<T> : CustomDebugStringConvertible {\n    /// Type of identifier for inserted elements.\n    typealias KeyType = BagKey\n    \n    typealias Entry = (key: BagKey, value: T)\n \n    fileprivate var _nextKey: BagKey = BagKey(rawValue: 0)\n\n    // data\n\n    // first fill inline variables\n    var _key0: BagKey? = nil\n    var _value0: T? = nil\n\n    // then fill \"array dictionary\"\n    var _pairs = ContiguousArray<Entry>()\n\n    // last is sparse dictionary\n    var _dictionary: [BagKey : T]? = nil\n\n    var _onlyFastPath = true\n\n    /// Creates new empty `Bag`.\n    init() {\n    }\n    \n    /**\n    Inserts `value` into bag.\n    \n    - parameter element: Element to insert.\n    - returns: Key that can be used to remove element from bag.\n    */\n    mutating func insert(_ element: T) -> BagKey {\n        let key = _nextKey\n\n        _nextKey = BagKey(rawValue: _nextKey.rawValue &+ 1)\n\n        if _key0 == nil {\n            _key0 = key\n            _value0 = element\n            return key\n        }\n\n        _onlyFastPath = false\n\n        if _dictionary != nil {\n            _dictionary![key] = element\n            return key\n        }\n\n        if _pairs.count < arrayDictionaryMaxSize {\n            _pairs.append((key: key, value: element))\n            return key\n        }\n\n        if _dictionary == nil {\n            _dictionary = [:]\n        }\n\n        _dictionary![key] = element\n        \n        return key\n    }\n    \n    /// - returns: Number of elements in bag.\n    var count: Int {\n        let dictionaryCount: Int = _dictionary?.count ?? 0\n        return (_value0 != nil ? 1 : 0) + _pairs.count + dictionaryCount\n    }\n    \n    /// Removes all elements from bag and clears capacity.\n    mutating func removeAll() {\n        _key0 = nil\n        _value0 = nil\n\n        _pairs.removeAll(keepingCapacity: false)\n        _dictionary?.removeAll(keepingCapacity: false)\n    }\n    \n    /**\n    Removes element with a specific `key` from bag.\n    \n    - parameter key: Key that identifies element to remove from bag.\n    - returns: Element that bag contained, or nil in case element was already removed.\n    */\n    mutating func removeKey(_ key: BagKey) -> T? {\n        if _key0 == key {\n            _key0 = nil\n            let value = _value0!\n            _value0 = nil\n            return value\n        }\n\n        if let existingObject = _dictionary?.removeValue(forKey: key) {\n            return existingObject\n        }\n\n        for i in 0 ..< _pairs.count {\n            if _pairs[i].key == key {\n                let value = _pairs[i].value\n                _pairs.remove(at: i)\n                return value\n            }\n        }\n\n        return nil\n    }\n}\n\nextension Bag {\n    /// A textual representation of `self`, suitable for debugging.\n    var debugDescription : String {\n        return \"\\(self.count) elements in Bag\"\n    }\n}\n\nextension Bag {\n    /// Enumerates elements inside the bag.\n    ///\n    /// - parameter action: Enumeration closure.\n    func forEach(_ action: (T) -> Void) {\n        if _onlyFastPath {\n            if let value0 = _value0 {\n                action(value0)\n            }\n            return\n        }\n\n        let value0 = _value0\n        let dictionary = _dictionary\n\n        if let value0 = value0 {\n            action(value0)\n        }\n\n        for i in 0 ..< _pairs.count {\n            action(_pairs[i].value)\n        }\n\n        if dictionary?.count ?? 0 > 0 {\n            for element in dictionary!.values {\n                action(element)\n            }\n        }\n    }\n}\n\nextension BagKey: Hashable {\n    var hashValue: Int {\n        return rawValue.hashValue\n    }\n}\n\nfunc ==(lhs: BagKey, rhs: BagKey) -> Bool {\n    return lhs.rawValue == rhs.rawValue\n}\n"
  },
  {
    "path": "Pods/RxSwift/Platform/DataStructures/InfiniteSequence.swift",
    "content": "//\n//  InfiniteSequence.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 6/13/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Sequence that repeats `repeatedValue` infinite number of times.\nstruct InfiniteSequence<E> : Sequence {\n    typealias Element = E\n    typealias Iterator = AnyIterator<E>\n    \n    private let _repeatedValue: E\n    \n    init(repeatedValue: E) {\n        _repeatedValue = repeatedValue\n    }\n    \n    func makeIterator() -> Iterator {\n        let repeatedValue = _repeatedValue\n        return AnyIterator {\n            return repeatedValue\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/Platform/DataStructures/PriorityQueue.swift",
    "content": "//\n//  PriorityQueue.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 12/27/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nstruct PriorityQueue<Element> {\n    private let _hasHigherPriority: (Element, Element) -> Bool\n    private let _isEqual: (Element, Element) -> Bool\n\n    fileprivate var _elements = [Element]()\n\n    init(hasHigherPriority: @escaping (Element, Element) -> Bool, isEqual: @escaping (Element, Element) -> Bool) {\n        _hasHigherPriority = hasHigherPriority\n        _isEqual = isEqual\n    }\n\n    mutating func enqueue(_ element: Element) {\n        _elements.append(element)\n        bubbleToHigherPriority(_elements.count - 1)\n    }\n\n    func peek() -> Element? {\n        return _elements.first\n    }\n\n    var isEmpty: Bool {\n        return _elements.count == 0\n    }\n\n    mutating func dequeue() -> Element? {\n        guard let front = peek() else {\n            return nil\n        }\n\n        removeAt(0)\n\n        return front\n    }\n\n    mutating func remove(_ element: Element) {\n        for i in 0 ..< _elements.count {\n            if _isEqual(_elements[i], element) {\n                removeAt(i)\n                return\n            }\n        }\n    }\n\n    private mutating func removeAt(_ index: Int) {\n        let removingLast = index == _elements.count - 1\n        if !removingLast {\n            #if swift(>=3.2)\n            _elements.swapAt(index, _elements.count - 1)\n            #else\n            swap(&_elements[index], &_elements[_elements.count - 1])\n            #endif\n        }\n\n        _ = _elements.popLast()\n\n        if !removingLast {\n            bubbleToHigherPriority(index)\n            bubbleToLowerPriority(index)\n        }\n    }\n\n    private mutating func bubbleToHigherPriority(_ initialUnbalancedIndex: Int) {\n        precondition(initialUnbalancedIndex >= 0)\n        precondition(initialUnbalancedIndex < _elements.count)\n\n        var unbalancedIndex = initialUnbalancedIndex\n\n        while unbalancedIndex > 0 {\n            let parentIndex = (unbalancedIndex - 1) / 2\n            guard _hasHigherPriority(_elements[unbalancedIndex], _elements[parentIndex]) else { break }\n            #if swift(>=3.2)\n            _elements.swapAt(unbalancedIndex, parentIndex)\n            #else\n            swap(&_elements[unbalancedIndex], &_elements[parentIndex])\n            #endif\n            unbalancedIndex = parentIndex\n        }\n    }\n\n    private mutating func bubbleToLowerPriority(_ initialUnbalancedIndex: Int) {\n        precondition(initialUnbalancedIndex >= 0)\n        precondition(initialUnbalancedIndex < _elements.count)\n\n        var unbalancedIndex = initialUnbalancedIndex\n        while true {\n            let leftChildIndex = unbalancedIndex * 2 + 1\n            let rightChildIndex = unbalancedIndex * 2 + 2\n\n            var highestPriorityIndex = unbalancedIndex\n\n            if leftChildIndex < _elements.count && _hasHigherPriority(_elements[leftChildIndex], _elements[highestPriorityIndex]) {\n                highestPriorityIndex = leftChildIndex\n            }\n\n            if rightChildIndex < _elements.count && _hasHigherPriority(_elements[rightChildIndex], _elements[highestPriorityIndex]) {\n                highestPriorityIndex = rightChildIndex\n            }\n\n            guard highestPriorityIndex != unbalancedIndex else { break }\n\n            #if swift(>=3.2)\n            _elements.swapAt(highestPriorityIndex, unbalancedIndex)\n            #else\n            swap(&_elements[highestPriorityIndex], &_elements[unbalancedIndex])\n            #endif\n            unbalancedIndex = highestPriorityIndex\n        }\n    }\n}\n\nextension PriorityQueue : CustomDebugStringConvertible {\n    var debugDescription: String {\n        return _elements.debugDescription\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/Platform/DataStructures/Queue.swift",
    "content": "//\n//  Queue.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 3/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/**\nData structure that represents queue.\n\nComplexity of `enqueue`, `dequeue` is O(1) when number of operations is\naveraged over N operations.\n\nComplexity of `peek` is O(1).\n*/\nstruct Queue<T>: Sequence {\n    /// Type of generator.\n    typealias Generator = AnyIterator<T>\n\n    private let _resizeFactor = 2\n    \n    private var _storage: ContiguousArray<T?>\n    private var _count = 0\n    private var _pushNextIndex = 0\n    private let _initialCapacity: Int\n\n    /**\n    Creates new queue.\n    \n    - parameter capacity: Capacity of newly created queue.\n    */\n    init(capacity: Int) {\n        _initialCapacity = capacity\n\n        _storage = ContiguousArray<T?>(repeating: nil, count: capacity)\n    }\n    \n    private var dequeueIndex: Int {\n        let index = _pushNextIndex - count\n        return index < 0 ? index + _storage.count : index\n    }\n    \n    /// - returns: Is queue empty.\n    var isEmpty: Bool {\n        return count == 0\n    }\n    \n    /// - returns: Number of elements inside queue.\n    var count: Int {\n        return _count\n    }\n    \n    /// - returns: Element in front of a list of elements to `dequeue`.\n    func peek() -> T {\n        precondition(count > 0)\n        \n        return _storage[dequeueIndex]!\n    }\n    \n    mutating private func resizeTo(_ size: Int) {\n        var newStorage = ContiguousArray<T?>(repeating: nil, count: size)\n        \n        let count = _count\n        \n        let dequeueIndex = self.dequeueIndex\n        let spaceToEndOfQueue = _storage.count - dequeueIndex\n        \n        // first batch is from dequeue index to end of array\n        let countElementsInFirstBatch = Swift.min(count, spaceToEndOfQueue)\n        // second batch is wrapped from start of array to end of queue\n        let numberOfElementsInSecondBatch = count - countElementsInFirstBatch\n        \n        newStorage[0 ..< countElementsInFirstBatch] = _storage[dequeueIndex ..< (dequeueIndex + countElementsInFirstBatch)]\n        newStorage[countElementsInFirstBatch ..< (countElementsInFirstBatch + numberOfElementsInSecondBatch)] = _storage[0 ..< numberOfElementsInSecondBatch]\n        \n        _count = count\n        _pushNextIndex = count\n        _storage = newStorage\n    }\n    \n    /// Enqueues `element`.\n    ///\n    /// - parameter element: Element to enqueue.\n    mutating func enqueue(_ element: T) {\n        if count == _storage.count {\n            resizeTo(Swift.max(_storage.count, 1) * _resizeFactor)\n        }\n        \n        _storage[_pushNextIndex] = element\n        _pushNextIndex += 1\n        _count += 1\n        \n        if _pushNextIndex >= _storage.count {\n            _pushNextIndex -= _storage.count\n        }\n    }\n    \n    private mutating func dequeueElementOnly() -> T {\n        precondition(count > 0)\n        \n        let index = dequeueIndex\n\n        defer {\n            _storage[index] = nil\n            _count -= 1\n        }\n\n        return _storage[index]!\n    }\n\n    /// Dequeues element or throws an exception in case queue is empty.\n    ///\n    /// - returns: Dequeued element.\n    mutating func dequeue() -> T? {\n        if self.count == 0 {\n            return nil\n        }\n\n        defer {\n            let downsizeLimit = _storage.count / (_resizeFactor * _resizeFactor)\n            if _count < downsizeLimit && downsizeLimit >= _initialCapacity {\n                resizeTo(_storage.count / _resizeFactor)\n            }\n        }\n\n        return dequeueElementOnly()\n    }\n    \n    /// - returns: Generator of contained elements.\n    func makeIterator() -> AnyIterator<T> {\n        var i = dequeueIndex\n        var count = _count\n\n        return AnyIterator {\n            if count == 0 {\n                return nil\n            }\n\n            defer {\n                count -= 1\n                i += 1\n            }\n\n            if i >= self._storage.count {\n                i -= self._storage.count\n            }\n\n            return self._storage[i]\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/Platform/DispatchQueue+Extensions.swift",
    "content": "//\n//  DispatchQueue+Extensions.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 10/22/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport Dispatch\n\nextension DispatchQueue {\n    private static var token: DispatchSpecificKey<()> = {\n        let key = DispatchSpecificKey<()>()\n        DispatchQueue.main.setSpecific(key: key, value: ())\n        return key\n    }()\n\n    static var isMain: Bool {\n        return DispatchQueue.getSpecific(key: token) != nil\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/Platform/Platform.Darwin.swift",
    "content": "//\n//  Platform.Darwin.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 12/29/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS)\n\n    import Darwin\n    import class Foundation.Thread\n    import func Foundation.OSAtomicCompareAndSwap32Barrier\n    import func Foundation.OSAtomicIncrement32Barrier\n    import func Foundation.OSAtomicDecrement32Barrier\n    import protocol Foundation.NSCopying\n\n    typealias AtomicInt = Int32\n\n    fileprivate func castToUInt32Pointer(_ pointer: UnsafeMutablePointer<Int32>) -> UnsafeMutablePointer<UInt32> {\n        let raw = UnsafeMutableRawPointer(pointer)\n        return raw.assumingMemoryBound(to: UInt32.self)\n    }\n\n    let AtomicCompareAndSwap = OSAtomicCompareAndSwap32Barrier\n    let AtomicIncrement = OSAtomicIncrement32Barrier\n    let AtomicDecrement = OSAtomicDecrement32Barrier\n    func AtomicOr(_ mask: UInt32, _ theValue : UnsafeMutablePointer<Int32>) -> Int32 {\n        return OSAtomicOr32OrigBarrier(mask, castToUInt32Pointer(theValue))\n    }\n    func AtomicFlagSet(_ mask: UInt32, _ theValue : UnsafeMutablePointer<Int32>) -> Bool {\n        // just used to create a barrier\n        OSAtomicXor32OrigBarrier(0, castToUInt32Pointer(theValue))\n        return (theValue.pointee & Int32(mask)) != 0\n    }\n\n    extension Thread {\n\n        static func setThreadLocalStorageValue<T: AnyObject>(_ value: T?, forKey key: NSCopying\n            ) {\n            let currentThread = Thread.current\n            let threadDictionary = currentThread.threadDictionary\n\n            if let newValue = value {\n                threadDictionary[key] = newValue\n            }\n            else {\n                threadDictionary[key] = nil\n            }\n\n        }\n        static func getThreadLocalStorageValueForKey<T>(_ key: NSCopying) -> T? {\n            let currentThread = Thread.current\n            let threadDictionary = currentThread.threadDictionary\n            \n            return threadDictionary[key] as? T\n        }\n    }\n\n    extension AtomicInt {\n        func valueSnapshot() -> Int32 {\n            return self\n        }\n    }\n    \n#endif\n"
  },
  {
    "path": "Pods/RxSwift/Platform/Platform.Linux.swift",
    "content": "//\n//  Platform.Linux.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 12/29/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if os(Linux)\n\n    import XCTest\n    import Glibc\n    import SwiftShims\n    import class Foundation.Thread\n\n    final class AtomicInt {\n        typealias IntegerLiteralType = Int\n        fileprivate var value: Int32 = 0\n        fileprivate var _lock = RecursiveLock()\n\n        func lock() {\n          _lock.lock()\n        }\n        func unlock() {\n          _lock.unlock()\n        }\n\n        func valueSnapshot() -> Int32 {\n            return value\n        }\n    }\n\n    extension AtomicInt: ExpressibleByIntegerLiteral {\n        convenience init(integerLiteral value: Int) {\n            self.init()\n            self.value = Int32(value)\n        }\n    }\n    \n    func >(lhs: AtomicInt, rhs: Int32) -> Bool {\n        return lhs.value > rhs\n    }\n    func ==(lhs: AtomicInt, rhs: Int32) -> Bool {\n        return lhs.value == rhs\n    }\n\n    func AtomicFlagSet(_ mask: UInt32, _ atomic: inout AtomicInt) -> Bool {\n        atomic.lock(); defer { atomic.unlock() }\n        return (atomic.value & Int32(mask)) != 0\n    }\n\n    func AtomicOr(_ mask: UInt32, _ atomic: inout AtomicInt) -> Int32 {\n        atomic.lock(); defer { atomic.unlock() }\n        let value = atomic.value\n        atomic.value |= Int32(mask)\n        return value\n    }\n\n    func AtomicIncrement(_ atomic: inout AtomicInt) -> Int32 {\n        atomic.lock(); defer { atomic.unlock() }\n        atomic.value += 1\n        return atomic.value\n    }\n\n    func AtomicDecrement(_ atomic: inout AtomicInt) -> Int32 {\n        atomic.lock(); defer { atomic.unlock() }\n        atomic.value -= 1\n        return atomic.value\n    }\n\n    func AtomicCompareAndSwap(_ l: Int32, _ r: Int32, _ atomic: inout AtomicInt) -> Bool {\n        atomic.lock(); defer { atomic.unlock() }\n        if atomic.value == l {\n            atomic.value = r\n            return true\n        }\n\n        return false\n    }\n\n    extension Thread {\n\n        static func setThreadLocalStorageValue<T: AnyObject>(_ value: T?, forKey key: String) {\n            let currentThread = Thread.current\n            var threadDictionary = currentThread.threadDictionary\n\n            if let newValue = value {\n                threadDictionary[key] = newValue\n            }\n            else {\n                threadDictionary[key] = nil\n            }\n\n            currentThread.threadDictionary = threadDictionary\n        }\n\n        static func getThreadLocalStorageValueForKey<T: AnyObject>(_ key: String) -> T? {\n            let currentThread = Thread.current\n            let threadDictionary = currentThread.threadDictionary\n\n            return threadDictionary[key] as? T\n        }\n    }\n\n#endif\n"
  },
  {
    "path": "Pods/RxSwift/Platform/RecursiveLock.swift",
    "content": "//\n//  RecursiveLock.swift\n//  Platform\n//\n//  Created by Krunoslav Zaher on 12/18/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport class Foundation.NSRecursiveLock\n\n#if TRACE_RESOURCES\n    class RecursiveLock: NSRecursiveLock {\n        override init() {\n            _ = Resources.incrementTotal()\n            super.init()\n        }\n\n        override func lock() {\n            super.lock()\n            _ = Resources.incrementTotal()\n        }\n\n        override func unlock() {\n            super.unlock()\n            _ = Resources.decrementTotal()\n        }\n\n        deinit {\n            _ = Resources.decrementTotal()\n        }\n    }\n#else\n    typealias RecursiveLock = NSRecursiveLock\n#endif\n"
  },
  {
    "path": "Pods/RxSwift/README.md",
    "content": "<img src=\"assets/Rx_Logo_M.png\" alt=\"Miss Electric Eel 2016\" width=\"36\" height=\"36\"> RxSwift: ReactiveX for Swift\n======================================\n\n[![Travis CI](https://travis-ci.org/ReactiveX/RxSwift.svg?branch=master)](https://travis-ci.org/ReactiveX/RxSwift) ![platforms](https://img.shields.io/badge/platforms-iOS%20%7C%20macOS%20%7C%20tvOS%20%7C%20watchOS%20%7C%20Linux-333333.svg) ![pod](https://img.shields.io/cocoapods/v/RxSwift.svg) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) [![Swift Package Manager compatible](https://img.shields.io/badge/Swift%20Package%20Manager-compatible-brightgreen.svg)](https://github.com/apple/swift-package-manager)\n\n* RxSwift 4.x / Swift 4.x can be found in [**rxswift4.0-swift4.0** branch](https://github.com/ReactiveX/RxSwift/tree/rxswift4.0-swift4.0).\n* RxSwift 3.x / Swift 3.x can be found in [**master** branch](https://github.com/ReactiveX/RxSwift/tree/master).\n\nRx is a [generic abstraction of computation](https://youtu.be/looJcaeboBY) expressed through `Observable<Element>` interface.\n\nThis is a Swift version of [Rx](https://github.com/Reactive-Extensions/Rx.NET).\n\nIt tries to port as many concepts from the original version as possible, but some concepts were adapted for more pleasant and performant integration with iOS/macOS environment.\n\nCross platform documentation can be found on [ReactiveX.io](http://reactivex.io/).\n\nLike the original Rx, its intention is to enable easy composition of asynchronous operations and event/data streams.\n\nKVO observing, async operations and streams are all unified under [abstraction of sequence](Documentation/GettingStarted.md#observables-aka-sequences). This is the reason why Rx is so simple, elegant and powerful.\n\n## I came here because I want to ...\n\n###### ... understand\n\n* [why use rx?](Documentation/Why.md)\n* [the basics, getting started with RxSwift](Documentation/GettingStarted.md)\n* [traits](Documentation/Traits.md) - what are `Single`, `Completable`, `Maybe`, `Driver`, `ControlProperty`, and `Variable` ... and why do they exist?\n* [testing](Documentation/UnitTests.md)\n* [tips and common errors](Documentation/Tips.md)\n* [debugging](Documentation/GettingStarted.md#debugging)\n* [the math behind Rx](Documentation/MathBehindRx.md)\n* [what are hot and cold observable sequences?](Documentation/HotAndColdObservables.md)\n\n###### ... install\n\n* Integrate RxSwift/RxCocoa with my app. [Installation Guide](#installation)\n\n###### ... hack around\n\n* with the example app. [Running Example App](Documentation/ExampleApp.md)\n* with operators in playgrounds. [Playgrounds](Documentation/Playgrounds.md)\n\n###### ... interact\n\n* All of this is great, but it would be nice to talk with other people using RxSwift and exchange experiences. <br />[![Slack channel](http://rxswift-slack.herokuapp.com/badge.svg)](http://rxswift-slack.herokuapp.com/) [Join Slack Channel](http://rxswift-slack.herokuapp.com)\n* Report a problem using the library. [Open an Issue With Bug Template](.github/ISSUE_TEMPLATE.md)\n* Request a new feature. [Open an Issue With Feature Request Template](Documentation/NewFeatureRequestTemplate.md)\n\n\n###### ... compare\n\n* [with other libraries](Documentation/ComparisonWithOtherLibraries.md).\n\n\n###### ... find compatible\n\n* libraries from [RxSwiftCommunity](https://github.com/RxSwiftCommunity).\n* [Pods using RxSwift](https://cocoapods.org/?q=uses%3Arxswift).\n\n###### ... see the broader vision\n\n* Does this exist for Android? [RxJava](https://github.com/ReactiveX/RxJava)\n* Where is all of this going, what is the future, what about reactive architectures, how do you design entire apps this way? [Cycle.js](https://github.com/cyclejs/cycle-core) - this is javascript, but [RxJS](https://github.com/Reactive-Extensions/RxJS) is javascript version of Rx.\n\n## Usage\n\n<table>\n  <tr>\n    <th width=\"30%\">Here's an example</th>\n    <th width=\"30%\">In Action</th>\n  </tr>\n  <tr>\n    <td>Define search for GitHub repositories ...</td>\n    <th rowspan=\"9\"><img src=\"https://raw.githubusercontent.com/kzaher/rxswiftcontent/master/GithubSearch.gif\"></th>\n  </tr>\n  <tr>\n    <td><div class=\"highlight highlight-source-swift\"><pre>\nlet searchResults = searchBar.rx.text.orEmpty\n    .throttle(0.3, scheduler: MainScheduler.instance)\n    .distinctUntilChanged()\n    .flatMapLatest { query -> Observable&lt;[Repository]&gt; in\n        if query.isEmpty {\n            return .just([])\n        }\n        return searchGitHub(query)\n            .catchErrorJustReturn([])\n    }\n    .observeOn(MainScheduler.instance)</pre></div></td>\n  </tr>\n  <tr>\n    <td>... then bind the results to your tableview</td>\n  </tr>\n  <tr>\n    <td width=\"30%\"><div class=\"highlight highlight-source-swift\"><pre>\nsearchResults\n    .bind(to: tableView.rx.items(cellIdentifier: \"Cell\")) {\n        (index, repository: Repository, cell) in\n        cell.textLabel?.text = repository.name\n        cell.detailTextLabel?.text = repository.url\n    }\n    .disposed(by: disposeBag)</pre></div></td>\n  </tr>\n</table>\n\n\n## Requirements\n\n* Xcode 8.0\n* Swift 3.0\n* Swift 2.3 ([use `rxswift-2.0` branch](https://github.com/ReactiveX/RxSwift/tree/rxswift-2.0) instead)\n\n## Installation\n\nRx doesn't contain any external dependencies.\n\nThese are currently the supported options:\n\n### Manual\n\nOpen Rx.xcworkspace, choose `RxExample` and hit run. This method will build everything and run the sample app\n\n### [CocoaPods](https://guides.cocoapods.org/using/using-cocoapods.html)\n\n**Tested with `pod --version`: `1.1.1`**\n\n```ruby\n# Podfile\nuse_frameworks!\n\ntarget 'YOUR_TARGET_NAME' do\n    pod 'RxSwift',    '~> 3.0'\n    pod 'RxCocoa',    '~> 3.0'\nend\n\n# RxTests and RxBlocking make the most sense in the context of unit/integration tests\ntarget 'YOUR_TESTING_TARGET' do\n    pod 'RxBlocking', '~> 3.0'\n    pod 'RxTest',     '~> 3.0'\nend\n```\n\nReplace `YOUR_TARGET_NAME` and then, in the `Podfile` directory, type:\n\n```bash\n$ pod install\n```\n\n### [Carthage](https://github.com/Carthage/Carthage)\n\n**Tested with `carthage version`: `0.18.1`**\n\nAdd this to `Cartfile`\n\n```\ngithub \"ReactiveX/RxSwift\" ~> 3.0\n```\n\n```bash\n$ carthage update\n```\n\n### [Swift Package Manager](https://github.com/apple/swift-package-manager)\n\n**Tested with `swift build --version`: `3.0.0 (swiftpm-19)`**\n\nCreate a `Package.swift` file.\n\n```swift\nimport PackageDescription\n\nlet package = Package(\n    name: \"RxTestProject\",\n    targets: [],\n    dependencies: [\n        .Package(url: \"https://github.com/ReactiveX/RxSwift.git\", majorVersion: 3)\n    ]\n)\n```\n\n```bash\n$ swift build\n```\n\nTo build or test a module with RxTest dependency, set `TEST=1`. ([RxSwift >= 3.4.2](https://github.com/ReactiveX/RxSwift/releases/tag/3.4.2))\n\n```bash\n$ TEST=1 swift test\n```\n\n### Manually using git submodules\n\n* Add RxSwift as a submodule\n\n```bash\n$ git submodule add git@github.com:ReactiveX/RxSwift.git\n```\n\n* Drag `Rx.xcodeproj` into Project Navigator\n* Go to `Project > Targets > Build Phases > Link Binary With Libraries`, click `+` and select `RxSwift-[Platform]` and `RxCocoa-[Platform]` targets\n\n\n## References\n\n* [http://reactivex.io/](http://reactivex.io/)\n* [Reactive Extensions GitHub (GitHub)](https://github.com/Reactive-Extensions)\n* [RxSwift RayWenderlich.com Book](https://store.raywenderlich.com/products/rxswift)\n* [Boxue.io RxSwift Online Course](https://boxueio.com/series/rxswift-101) (Chinese 🇨🇳)\n* [Erik Meijer (Wikipedia)](http://en.wikipedia.org/wiki/Erik_Meijer_%28computer_scientist%29)\n* [Expert to Expert: Brian Beckman and Erik Meijer - Inside the .NET Reactive Framework (Rx) (video)](https://youtu.be/looJcaeboBY)\n* [Reactive Programming Overview (Jafar Husain from Netflix)](https://www.youtube.com/watch?v=dwP1TNXE6fc)\n* [Subject/Observer is Dual to Iterator (paper)](http://csl.stanford.edu/~christos/pldi2010.fit/meijer.duality.pdf)\n* [Rx standard sequence operators visualized (visualization tool)](http://rxmarbles.com/)\n* [Haskell](https://www.haskell.org/)\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/AnyObserver.swift",
    "content": "//\n//  AnyObserver.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/28/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// A type-erased `ObserverType`.\n///\n/// Forwards operations to an arbitrary underlying observer with the same `Element` type, hiding the specifics of the underlying observer type.\npublic struct AnyObserver<Element> : ObserverType {\n    /// The type of elements in sequence that observer can observe.\n    public typealias E = Element\n    \n    /// Anonymous event handler type.\n    public typealias EventHandler = (Event<Element>) -> Void\n\n    private let observer: EventHandler\n\n    /// Construct an instance whose `on(event)` calls `eventHandler(event)`\n    ///\n    /// - parameter eventHandler: Event handler that observes sequences events.\n    public init(eventHandler: @escaping EventHandler) {\n        self.observer = eventHandler\n    }\n    \n    /// Construct an instance whose `on(event)` calls `observer.on(event)`\n    ///\n    /// - parameter observer: Observer that receives sequence events.\n    public init<O : ObserverType>(_ observer: O) where O.E == Element {\n        self.observer = observer.on\n    }\n    \n    /// Send `event` to this observer.\n    ///\n    /// - parameter event: Event instance.\n    public func on(_ event: Event<Element>) {\n        return self.observer(event)\n    }\n\n    /// Erases type of observer and returns canonical observer.\n    ///\n    /// - returns: type erased observer.\n    public func asObserver() -> AnyObserver<E> {\n        return self\n    }\n}\n\nextension AnyObserver {\n    /// Collection of `AnyObserver`s\n    typealias s = Bag<(Event<Element>) -> ()>\n}\n\nextension ObserverType {\n    /// Erases type of observer and returns canonical observer.\n    ///\n    /// - returns: type erased observer.\n    public func asObserver() -> AnyObserver<E> {\n        return AnyObserver(self)\n    }\n\n    /// Transforms observer of type R to type E using custom transform method.\n    /// Each event sent to result observer is transformed and sent to `self`.\n    ///\n    /// - returns: observer that transforms events.\n    public func mapObserver<R>(_ transform: @escaping (R) throws -> E) -> AnyObserver<R> {\n        return AnyObserver { e in\n            self.on(e.map(transform))\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Cancelable.swift",
    "content": "//\n//  Cancelable.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/12/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents disposable resource with state tracking.\npublic protocol Cancelable : Disposable {\n    /// Was resource disposed.\n    var isDisposed: Bool { get }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Concurrency/AsyncLock.swift",
    "content": "//\n//  AsyncLock.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/**\nIn case nobody holds this lock, the work will be queued and executed immediately\non thread that is requesting lock.\n\nIn case there is somebody currently holding that lock, action will be enqueued.\nWhen owned of the lock finishes with it's processing, it will also execute\nand pending work.\n\nThat means that enqueued work could possibly be executed later on a different thread.\n*/\nfinal class AsyncLock<I: InvocableType>\n    : Disposable\n    , Lock\n    , SynchronizedDisposeType {\n    typealias Action = () -> Void\n    \n    var _lock = SpinLock()\n    \n    private var _queue: Queue<I> = Queue(capacity: 0)\n\n    private var _isExecuting: Bool = false\n    private var _hasFaulted: Bool = false\n\n    // lock {\n    func lock() {\n        _lock.lock()\n    }\n\n    func unlock() {\n        _lock.unlock()\n    }\n    // }\n\n    private func enqueue(_ action: I) -> I? {\n        _lock.lock(); defer { _lock.unlock() } // {\n            if _hasFaulted {\n                return nil\n            }\n\n            if _isExecuting {\n                _queue.enqueue(action)\n                return nil\n            }\n\n            _isExecuting = true\n\n            return action\n        // }\n    }\n\n    private func dequeue() -> I? {\n        _lock.lock(); defer { _lock.unlock() } // {\n            if _queue.count > 0 {\n                return _queue.dequeue()\n            }\n            else {\n                _isExecuting = false\n                return nil\n            }\n        // }\n    }\n\n    func invoke(_ action: I) {\n        let firstEnqueuedAction = enqueue(action)\n        \n        if let firstEnqueuedAction = firstEnqueuedAction {\n            firstEnqueuedAction.invoke()\n        }\n        else {\n            // action is enqueued, it's somebody else's concern now\n            return\n        }\n        \n        while true {\n            let nextAction = dequeue()\n\n            if let nextAction = nextAction {\n                nextAction.invoke()\n            }\n            else {\n                return\n            }\n        }\n    }\n    \n    func dispose() {\n        synchronizedDispose()\n    }\n\n    func _synchronized_dispose() {\n        _queue = Queue(capacity: 0)\n        _hasFaulted = true\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Concurrency/Lock.swift",
    "content": "//\n//  Lock.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/31/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nprotocol Lock {\n    func lock()\n    func unlock()\n}\n\n// https://lists.swift.org/pipermail/swift-dev/Week-of-Mon-20151214/000321.html\ntypealias SpinLock = RecursiveLock\n\nextension RecursiveLock : Lock {\n    @inline(__always)\n    final func performLocked(_ action: () -> Void) {\n        lock(); defer { unlock() }\n        action()\n    }\n\n    @inline(__always)\n    final func calculateLocked<T>(_ action: () -> T) -> T {\n        lock(); defer { unlock() }\n        return action()\n    }\n\n    @inline(__always)\n    final func calculateLockedOrFail<T>(_ action: () throws -> T) throws -> T {\n        lock(); defer { unlock() }\n        let result = try action()\n        return result\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Concurrency/LockOwnerType.swift",
    "content": "//\n//  LockOwnerType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 10/25/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nprotocol LockOwnerType : class, Lock {\n    var _lock: RecursiveLock { get }\n}\n\nextension LockOwnerType {\n    func lock() {\n        _lock.lock()\n    }\n\n    func unlock() {\n        _lock.unlock()\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Concurrency/SynchronizedDisposeType.swift",
    "content": "//\n//  SynchronizedDisposeType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 10/25/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nprotocol SynchronizedDisposeType : class, Disposable, Lock {\n    func _synchronized_dispose()\n}\n\nextension SynchronizedDisposeType {\n    func synchronizedDispose() {\n        lock(); defer { unlock() }\n        _synchronized_dispose()\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Concurrency/SynchronizedOnType.swift",
    "content": "//\n//  SynchronizedOnType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 10/25/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nprotocol SynchronizedOnType : class, ObserverType, Lock {\n    func _synchronized_on(_ event: Event<E>)\n}\n\nextension SynchronizedOnType {\n    func synchronizedOn(_ event: Event<E>) {\n        lock(); defer { unlock() }\n        _synchronized_on(event)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Concurrency/SynchronizedUnsubscribeType.swift",
    "content": "//\n//  SynchronizedUnsubscribeType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 10/25/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nprotocol SynchronizedUnsubscribeType : class {\n    associatedtype DisposeKey\n\n    func synchronizedUnsubscribe(_ disposeKey: DisposeKey)\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/ConnectableObservableType.swift",
    "content": "//\n//  ConnectableObservableType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/1/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/**\nRepresents an observable sequence wrapper that can be connected and disconnected from its underlying observable sequence.\n*/\npublic protocol ConnectableObservableType : ObservableType {\n    /**\n    Connects the observable wrapper to its source. All subscribed observers will receive values from the underlying observable sequence as long as the connection is established.\n    \n    - returns: Disposable used to disconnect the observable wrapper from its source, causing subscribed observer to stop receiving values from the underlying observable sequence.\n    */\n    func connect() -> Disposable\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Deprecated.swift",
    "content": "//\n//  Deprecated.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/5/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nextension Observable {\n    /**\n     Converts a optional to an observable sequence.\n     \n     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)\n     \n     - parameter optional: Optional element in the resulting observable sequence.\n     - returns: An observable sequence containing the wrapped value or not from given optional.\n     */\n    @available(*, deprecated, message: \"Implicit conversions from any type to optional type are allowed and that is causing issues with `from` operator overloading.\", renamed: \"from(optional:)\")\n    public static func from(_ optional: E?) -> Observable<E> {\n        return Observable.from(optional: optional)\n    }\n\n    /**\n     Converts a optional to an observable sequence.\n\n     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)\n\n     - parameter optional: Optional element in the resulting observable sequence.\n     - parameter: Scheduler to send the optional element on.\n     - returns: An observable sequence containing the wrapped value or not from given optional.\n     */\n    @available(*, deprecated, message: \"Implicit conversions from any type to optional type are allowed and that is causing issues with `from` operator overloading.\", renamed: \"from(optional:scheduler:)\")\n    public static func from(_ optional: E?, scheduler: ImmediateSchedulerType) -> Observable<E> {\n        return Observable.from(optional: optional, scheduler: scheduler)\n    }\n}\n\nextension ObservableType {\n    /**\n\n    Projects each element of an observable sequence into a new form by incorporating the element's index.\n\n     - seealso: [map operator on reactivex.io](http://reactivex.io/documentation/operators/map.html)\n\n     - parameter selector: A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n     - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source.\n     */\n    @available(*, deprecated, message: \"Please use enumerated().map()\")\n    public func mapWithIndex<R>(_ selector: @escaping (E, Int) throws -> R)\n        -> Observable<R> {\n        return enumerated().map { try selector($0.element, $0.index) }\n    }\n\n\n    /**\n\n     Projects each element of an observable sequence to an observable sequence by incorporating the element's index and merges the resulting observable sequences into one observable sequence.\n\n     - seealso: [flatMap operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html)\n\n     - parameter selector: A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n     - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.\n     */\n    @available(*, deprecated, message: \"Please use enumerated().flatMap()\")\n    public func flatMapWithIndex<O: ObservableConvertibleType>(_ selector: @escaping (E, Int) throws -> O)\n        -> Observable<O.E> {\n        return enumerated().flatMap { try selector($0.element, $0.index) }\n    }\n\n    /**\n\n     Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n     The element's index is used in the logic of the predicate function.\n\n     - seealso: [skipWhile operator on reactivex.io](http://reactivex.io/documentation/operators/skipwhile.html)\n\n     - parameter predicate: A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n     - returns: An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n     */\n    @available(*, deprecated, message: \"Please use enumerated().skipWhile().map()\")\n    public func skipWhileWithIndex(_ predicate: @escaping (E, Int) throws -> Bool) -> Observable<E> {\n        return enumerated().skipWhile { try predicate($0.element, $0.index) }.map { $0.element }\n    }\n\n\n    /**\n\n     Returns elements from an observable sequence as long as a specified condition is true.\n\n     The element's index is used in the logic of the predicate function.\n\n     - seealso: [takeWhile operator on reactivex.io](http://reactivex.io/documentation/operators/takewhile.html)\n\n     - parameter predicate: A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n     - returns: An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n     */\n    @available(*, deprecated, message: \"Please use enumerated().takeWhile().map()\")\n    public func takeWhileWithIndex(_ predicate: @escaping (E, Int) throws -> Bool) -> Observable<E> {\n        return enumerated().takeWhile { try predicate($0.element, $0.index) }.map { $0.element }\n    }\n}\n\nextension Disposable {\n    /// Deprecated in favor of `disposed(by:)`\n    ///\n    ///\n    /// Adds `self` to `bag`.\n    ///\n    /// - parameter bag: `DisposeBag` to add `self` to.\n    @available(*, deprecated, message: \"use disposed(by:) instead\", renamed: \"disposed(by:)\")\n    public func addDisposableTo(_ bag: DisposeBag) {\n        disposed(by: bag)\n    }\n}\n\n\nextension ObservableType {\n\n    /**\n     Returns an observable sequence that shares a single subscription to the underlying sequence, and immediately upon subscription replays latest element in buffer.\n\n     This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n\n     - seealso: [shareReplay operator on reactivex.io](http://reactivex.io/documentation/operators/replay.html)\n\n     - returns: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n     */\n    @available(*, deprecated, message: \"use share(replay: 1) instead\", renamed: \"share(replay:)\")\n    public func shareReplayLatestWhileConnected()\n        -> Observable<E> {\n        return share(replay: 1, scope: .whileConnected)\n    }\n}\n\n\nextension ObservableType {\n\n    /**\n     Returns an observable sequence that shares a single subscription to the underlying sequence, and immediately upon subscription replays maximum number of elements in buffer.\n\n     This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n\n     - seealso: [shareReplay operator on reactivex.io](http://reactivex.io/documentation/operators/replay.html)\n\n     - parameter bufferSize: Maximum element count of the replay buffer.\n     - returns: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n     */\n    @available(*, deprecated, message: \"Suggested replacement is `share(replay: 1)`. In case old 3.x behavior of `shareReplay` is required please use `share(replay: 1, scope: .forever)` instead.\", renamed: \"share(replay:)\")\n    public func shareReplay(_ bufferSize: Int)\n        -> Observable<E> {\n        return self.share(replay: bufferSize, scope: .forever)\n    }\n}\n\n/// Variable is a wrapper for `BehaviorSubject`.\n///\n/// Unlike `BehaviorSubject` it can't terminate with error, and when variable is deallocated\n/// it will complete its observable sequence (`asObservable`).\npublic final class Variable<Element> {\n\n    public typealias E = Element\n\n    private let _subject: BehaviorSubject<Element>\n\n    private var _lock = SpinLock()\n\n    // state\n    private var _value: E\n\n    #if DEBUG\n    fileprivate let _synchronizationTracker = SynchronizationTracker()\n    #endif\n\n    /// Gets or sets current value of variable.\n    ///\n    /// Whenever a new value is set, all the observers are notified of the change.\n    ///\n    /// Even if the newly set value is same as the old value, observers are still notified for change.\n    public var value: E {\n        get {\n            _lock.lock(); defer { _lock.unlock() }\n            return _value\n        }\n        set(newValue) {\n            #if DEBUG\n                _synchronizationTracker.register(synchronizationErrorMessage: .variable)\n                defer { _synchronizationTracker.unregister() }\n            #endif\n            _lock.lock()\n            _value = newValue\n            _lock.unlock()\n\n            _subject.on(.next(newValue))\n        }\n    }\n\n    /// Initializes variable with initial value.\n    ///\n    /// - parameter value: Initial variable value.\n    public init(_ value: Element) {\n        _value = value\n        _subject = BehaviorSubject(value: value)\n    }\n\n    /// - returns: Canonical interface for push style sequence\n    public func asObservable() -> Observable<E> {\n        return _subject\n    }\n\n    deinit {\n        _subject.on(.completed)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposable.swift",
    "content": "//\n//  Disposable.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/8/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Respresents a disposable resource.\npublic protocol Disposable {\n    /// Dispose resource.\n    func dispose()\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposables/AnonymousDisposable.swift",
    "content": "//\n//  AnonymousDisposable.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/15/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents an Action-based disposable.\n///\n/// When dispose method is called, disposal action will be dereferenced.\nfileprivate final class AnonymousDisposable : DisposeBase, Cancelable {\n    public typealias DisposeAction = () -> Void\n\n    private var _isDisposed: AtomicInt = 0\n    private var _disposeAction: DisposeAction?\n\n    /// - returns: Was resource disposed.\n    public var isDisposed: Bool {\n        return _isDisposed == 1\n    }\n\n    /// Constructs a new disposable with the given action used for disposal.\n    ///\n    /// - parameter disposeAction: Disposal action which will be run upon calling `dispose`.\n    fileprivate init(_ disposeAction: @escaping DisposeAction) {\n        _disposeAction = disposeAction\n        super.init()\n    }\n    \n    // Non-deprecated version of the constructor, used by `Disposables.create(with:)`\n    fileprivate init(disposeAction: @escaping DisposeAction) {\n        _disposeAction = disposeAction\n        super.init()\n    }\n    \n    /// Calls the disposal action if and only if the current instance hasn't been disposed yet.\n    ///\n    /// After invoking disposal action, disposal action will be dereferenced.\n    fileprivate func dispose() {\n        if AtomicCompareAndSwap(0, 1, &_isDisposed) {\n            assert(_isDisposed == 1)\n\n            if let action = _disposeAction {\n                _disposeAction = nil\n                action()\n            }\n        }\n    }\n}\n\nextension Disposables {\n    \n    /// Constructs a new disposable with the given action used for disposal.\n    ///\n    /// - parameter dispose: Disposal action which will be run upon calling `dispose`.\n    public static func create(with dispose: @escaping () -> ()) -> Cancelable {\n        return AnonymousDisposable(disposeAction: dispose)\n    }\n    \n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposables/BinaryDisposable.swift",
    "content": "//\n//  BinaryDisposable.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 6/12/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents two disposable resources that are disposed together.\nprivate final class BinaryDisposable : DisposeBase, Cancelable {\n\n    private var _isDisposed: AtomicInt = 0\n\n    // state\n    private var _disposable1: Disposable?\n    private var _disposable2: Disposable?\n\n    /// - returns: Was resource disposed.\n    var isDisposed: Bool {\n        return _isDisposed > 0\n    }\n\n    /// Constructs new binary disposable from two disposables.\n    ///\n    /// - parameter disposable1: First disposable\n    /// - parameter disposable2: Second disposable\n    init(_ disposable1: Disposable, _ disposable2: Disposable) {\n        _disposable1 = disposable1\n        _disposable2 = disposable2\n        super.init()\n    }\n\n    /// Calls the disposal action if and only if the current instance hasn't been disposed yet.\n    ///\n    /// After invoking disposal action, disposal action will be dereferenced.\n    func dispose() {\n        if AtomicCompareAndSwap(0, 1, &_isDisposed) {\n            _disposable1?.dispose()\n            _disposable2?.dispose()\n            _disposable1 = nil\n            _disposable2 = nil\n        }\n    }\n}\n\nextension Disposables {\n    \n    /// Creates a disposable with the given disposables.\n    public static func create(_ disposable1: Disposable, _ disposable2: Disposable) -> Cancelable {\n        return BinaryDisposable(disposable1, disposable2)\n    }\n    \n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposables/BooleanDisposable.swift",
    "content": "//\n//  BooleanDisposable.swift\n//  RxSwift\n//\n//  Created by Junior B. on 10/29/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents a disposable resource that can be checked for disposal status.\npublic final class BooleanDisposable : Cancelable {\n\n    internal static let BooleanDisposableTrue = BooleanDisposable(isDisposed: true)\n    private var _isDisposed = false\n    \n    /// Initializes a new instance of the `BooleanDisposable` class\n    public init() {\n    }\n    \n    /// Initializes a new instance of the `BooleanDisposable` class with given value\n    public init(isDisposed: Bool) {\n        self._isDisposed = isDisposed\n    }\n    \n    /// - returns: Was resource disposed.\n    public var isDisposed: Bool {\n        return _isDisposed\n    }\n    \n    /// Sets the status to disposed, which can be observer through the `isDisposed` property.\n    public func dispose() {\n        _isDisposed = true\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposables/CompositeDisposable.swift",
    "content": "//\n//  CompositeDisposable.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/20/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents a group of disposable resources that are disposed together.\npublic final class CompositeDisposable : DisposeBase, Cancelable {\n    /// Key used to remove disposable from composite disposable\n    public struct DisposeKey {\n        fileprivate let key: BagKey\n        fileprivate init(key: BagKey) {\n            self.key = key\n        }\n    }\n\n    private var _lock = SpinLock()\n    \n    // state\n    private var _disposables: Bag<Disposable>? = Bag()\n\n    public var isDisposed: Bool {\n        _lock.lock(); defer { _lock.unlock() }\n        return _disposables == nil\n    }\n    \n    public override init() {\n    }\n    \n    /// Initializes a new instance of composite disposable with the specified number of disposables.\n    public init(_ disposable1: Disposable, _ disposable2: Disposable) {\n        // This overload is here to make sure we are using optimized version up to 4 arguments.\n        let _ = _disposables!.insert(disposable1)\n        let _ = _disposables!.insert(disposable2)\n    }\n    \n    /// Initializes a new instance of composite disposable with the specified number of disposables.\n    public init(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable) {\n        // This overload is here to make sure we are using optimized version up to 4 arguments.\n        let _ = _disposables!.insert(disposable1)\n        let _ = _disposables!.insert(disposable2)\n        let _ = _disposables!.insert(disposable3)\n    }\n    \n    /// Initializes a new instance of composite disposable with the specified number of disposables.\n    public init(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable, _ disposable4: Disposable, _ disposables: Disposable...) {\n        // This overload is here to make sure we are using optimized version up to 4 arguments.\n        let _ = _disposables!.insert(disposable1)\n        let _ = _disposables!.insert(disposable2)\n        let _ = _disposables!.insert(disposable3)\n        let _ = _disposables!.insert(disposable4)\n        \n        for disposable in disposables {\n            let _ = _disposables!.insert(disposable)\n        }\n    }\n    \n    /// Initializes a new instance of composite disposable with the specified number of disposables.\n    public init(disposables: [Disposable]) {\n        for disposable in disposables {\n            let _ = _disposables!.insert(disposable)\n        }\n    }\n\n    /**\n     Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n     \n     - parameter disposable: Disposable to add.\n     - returns: Key that can be used to remove disposable from composite disposable. In case dispose bag was already\n     disposed `nil` will be returned.\n     */\n    public func insert(_ disposable: Disposable) -> DisposeKey? {\n        let key = _insert(disposable)\n        \n        if key == nil {\n            disposable.dispose()\n        }\n        \n        return key\n    }\n    \n    private func _insert(_ disposable: Disposable) -> DisposeKey? {\n        _lock.lock(); defer { _lock.unlock() }\n\n        let bagKey = _disposables?.insert(disposable)\n        return bagKey.map(DisposeKey.init)\n    }\n    \n    /// - returns: Gets the number of disposables contained in the `CompositeDisposable`.\n    public var count: Int {\n        _lock.lock(); defer { _lock.unlock() }\n        return _disposables?.count ?? 0\n    }\n    \n    /// Removes and disposes the disposable identified by `disposeKey` from the CompositeDisposable.\n    ///\n    /// - parameter disposeKey: Key used to identify disposable to be removed.\n    public func remove(for disposeKey: DisposeKey) {\n        _remove(for: disposeKey)?.dispose()\n    }\n    \n    private func _remove(for disposeKey: DisposeKey) -> Disposable? {\n        _lock.lock(); defer { _lock.unlock() }\n        return _disposables?.removeKey(disposeKey.key)\n    }\n    \n    /// Disposes all disposables in the group and removes them from the group.\n    public func dispose() {\n        if let disposables = _dispose() {\n            disposeAll(in: disposables)\n        }\n    }\n\n    private func _dispose() -> Bag<Disposable>? {\n        _lock.lock(); defer { _lock.unlock() }\n\n        let disposeBag = _disposables\n        _disposables = nil\n\n        return disposeBag\n    }\n}\n\nextension Disposables {\n\n    /// Creates a disposable with the given disposables.\n    public static func create(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable) -> Cancelable {\n        return CompositeDisposable(disposable1, disposable2, disposable3)\n    }\n    \n    /// Creates a disposable with the given disposables.\n    public static func create(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable, _ disposables: Disposable ...) -> Cancelable {\n        var disposables = disposables\n        disposables.append(disposable1)\n        disposables.append(disposable2)\n        disposables.append(disposable3)\n        return CompositeDisposable(disposables: disposables)\n    }\n    \n    /// Creates a disposable with the given disposables.\n    public static func create(_ disposables: [Disposable]) -> Cancelable {\n        switch disposables.count {\n        case 2:\n            return Disposables.create(disposables[0], disposables[1])\n        default:\n            return CompositeDisposable(disposables: disposables)\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposables/Disposables.swift",
    "content": "//\n//  Disposables.swift\n//  RxSwift\n//\n//  Created by Mohsen Ramezanpoor on 01/08/2016.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n/// A collection of utility methods for common disposable operations.\npublic struct Disposables {\n    private init() {}\n}\n\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposables/DisposeBag.swift",
    "content": "//\n//  DisposeBag.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/25/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension Disposable {\n    /// Adds `self` to `bag`\n    ///\n    /// - parameter bag: `DisposeBag` to add `self` to.\n    public func disposed(by bag: DisposeBag) {\n        bag.insert(self)\n    }\n}\n\n/**\nThread safe bag that disposes added disposables on `deinit`.\n\nThis returns ARC (RAII) like resource management to `RxSwift`.\n\nIn case contained disposables need to be disposed, just put a different dispose bag\nor create a new one in its place.\n\n    self.existingDisposeBag = DisposeBag()\n\nIn case explicit disposal is necessary, there is also `CompositeDisposable`.\n*/\npublic final class DisposeBag: DisposeBase {\n    \n    private var _lock = SpinLock()\n    \n    // state\n    private var _disposables = [Disposable]()\n    private var _isDisposed = false\n    \n    /// Constructs new empty dispose bag.\n    public override init() {\n        super.init()\n    }\n    \n    /// Adds `disposable` to be disposed when dispose bag is being deinited.\n    ///\n    /// - parameter disposable: Disposable to add.\n    public func insert(_ disposable: Disposable) {\n        _insert(disposable)?.dispose()\n    }\n    \n    private func _insert(_ disposable: Disposable) -> Disposable? {\n        _lock.lock(); defer { _lock.unlock() }\n        if _isDisposed {\n            return disposable\n        }\n\n        _disposables.append(disposable)\n\n        return nil\n    }\n\n    /// This is internal on purpose, take a look at `CompositeDisposable` instead.\n    private func dispose() {\n        let oldDisposables = _dispose()\n\n        for disposable in oldDisposables {\n            disposable.dispose()\n        }\n    }\n\n    private func _dispose() -> [Disposable] {\n        _lock.lock(); defer { _lock.unlock() }\n\n        let disposables = _disposables\n        \n        _disposables.removeAll(keepingCapacity: false)\n        _isDisposed = true\n        \n        return disposables\n    }\n    \n    deinit {\n        dispose()\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposables/DisposeBase.swift",
    "content": "//\n//  DisposeBase.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 4/4/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Base class for all disposables.\npublic class DisposeBase {\n    init() {\n#if TRACE_RESOURCES\n    let _ = Resources.incrementTotal()\n#endif\n    }\n    \n    deinit {\n#if TRACE_RESOURCES\n    let _ = Resources.decrementTotal()\n#endif\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposables/NopDisposable.swift",
    "content": "//\n//  NopDisposable.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/15/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents a disposable that does nothing on disposal.\n///\n/// Nop = No Operation\nfileprivate struct NopDisposable : Disposable {\n \n    fileprivate static let noOp: Disposable = NopDisposable()\n    \n    fileprivate init() {\n        \n    }\n    \n    /// Does nothing.\n    public func dispose() {\n    }\n}\n\nextension Disposables {\n    /**\n     Creates a disposable that does nothing on disposal.\n     */\n    static public func create() -> Disposable {\n        return NopDisposable.noOp\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposables/RefCountDisposable.swift",
    "content": "//\n//  RefCountDisposable.swift\n//  RxSwift\n//\n//  Created by Junior B. on 10/29/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\npublic final class RefCountDisposable : DisposeBase, Cancelable {\n    private var _lock = SpinLock()\n    private var _disposable = nil as Disposable?\n    private var _primaryDisposed = false\n    private var _count = 0\n\n    /// - returns: Was resource disposed.\n    public var isDisposed: Bool {\n        _lock.lock(); defer { _lock.unlock() }\n        return _disposable == nil\n    }\n\n    /// Initializes a new instance of the `RefCountDisposable`.\n    public init(disposable: Disposable) {\n        _disposable = disposable\n        super.init()\n    }\n\n    /**\n     Holds a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n\n     When getter is called, a dependent disposable contributing to the reference count that manages the underlying disposable's lifetime is returned.\n     */\n    public func retain() -> Disposable {\n        return _lock.calculateLocked {\n            if let _ = _disposable {\n\n                do {\n                    let _ = try incrementChecked(&_count)\n                } catch (_) {\n                    rxFatalError(\"RefCountDisposable increment failed\")\n                }\n\n                return RefCountInnerDisposable(self)\n            } else {\n                return Disposables.create()\n            }\n        }\n    }\n\n    /// Disposes the underlying disposable only when all dependent disposables have been disposed.\n    public func dispose() {\n        let oldDisposable: Disposable? = _lock.calculateLocked {\n            if let oldDisposable = _disposable, !_primaryDisposed\n            {\n                _primaryDisposed = true\n\n                if (_count == 0)\n                {\n                    _disposable = nil\n                    return oldDisposable\n                }\n            }\n\n            return nil\n        }\n\n        if let disposable = oldDisposable {\n            disposable.dispose()\n        }\n    }\n\n    fileprivate func release() {\n        let oldDisposable: Disposable? = _lock.calculateLocked {\n            if let oldDisposable = _disposable {\n                do {\n                    let _ = try decrementChecked(&_count)\n                } catch (_) {\n                    rxFatalError(\"RefCountDisposable decrement on release failed\")\n                }\n\n                guard _count >= 0 else {\n                    rxFatalError(\"RefCountDisposable counter is lower than 0\")\n                }\n\n                if _primaryDisposed && _count == 0 {\n                    _disposable = nil\n                    return oldDisposable\n                }\n            }\n\n            return nil\n        }\n\n        if let disposable = oldDisposable {\n            disposable.dispose()\n        }\n    }\n}\n\ninternal final class RefCountInnerDisposable: DisposeBase, Disposable\n{\n    private let _parent: RefCountDisposable\n    private var _isDisposed: AtomicInt = 0\n\n    init(_ parent: RefCountDisposable)\n    {\n        _parent = parent\n        super.init()\n    }\n\n    internal func dispose()\n    {\n        if AtomicCompareAndSwap(0, 1, &_isDisposed) {\n            _parent.release()\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposables/ScheduledDisposable.swift",
    "content": "//\n//  ScheduledDisposable.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 6/13/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nprivate let disposeScheduledDisposable: (ScheduledDisposable) -> Disposable = { sd in\n    sd.disposeInner()\n    return Disposables.create()\n}\n\n/// Represents a disposable resource whose disposal invocation will be scheduled on the specified scheduler.\npublic final class ScheduledDisposable : Cancelable {\n    public let scheduler: ImmediateSchedulerType\n\n    private var _isDisposed: AtomicInt = 0\n\n    // state\n    private var _disposable: Disposable?\n\n    /// - returns: Was resource disposed.\n    public var isDisposed: Bool {\n        return _isDisposed == 1\n    }\n\n    /**\n    Initializes a new instance of the `ScheduledDisposable` that uses a `scheduler` on which to dispose the `disposable`.\n\n    - parameter scheduler: Scheduler where the disposable resource will be disposed on.\n    - parameter disposable: Disposable resource to dispose on the given scheduler.\n    */\n    public init(scheduler: ImmediateSchedulerType, disposable: Disposable) {\n        self.scheduler = scheduler\n        _disposable = disposable\n    }\n\n    /// Disposes the wrapped disposable on the provided scheduler.\n    public func dispose() {\n        let _ = scheduler.schedule(self, action: disposeScheduledDisposable)\n    }\n\n    func disposeInner() {\n        if AtomicCompareAndSwap(0, 1, &_isDisposed) {\n            _disposable!.dispose()\n            _disposable = nil\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposables/SerialDisposable.swift",
    "content": "//\n//  SerialDisposable.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/12/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents a disposable resource whose underlying disposable resource can be replaced by another disposable resource, causing automatic disposal of the previous underlying disposable resource.\npublic final class SerialDisposable : DisposeBase, Cancelable {\n    private var _lock = SpinLock()\n    \n    // state\n    private var _current = nil as Disposable?\n    private var _isDisposed = false\n    \n    /// - returns: Was resource disposed.\n    public var isDisposed: Bool {\n        return _isDisposed\n    }\n    \n    /// Initializes a new instance of the `SerialDisposable`.\n    override public init() {\n        super.init()\n    }\n    \n    /**\n    Gets or sets the underlying disposable.\n    \n    Assigning this property disposes the previous disposable object.\n    \n    If the `SerialDisposable` has already been disposed, assignment to this property causes immediate disposal of the given disposable object.\n    */\n    public var disposable: Disposable {\n        get {\n            return _lock.calculateLocked {\n                return self.disposable\n            }\n        }\n        set (newDisposable) {\n            let disposable: Disposable? = _lock.calculateLocked {\n                if _isDisposed {\n                    return newDisposable\n                }\n                else {\n                    let toDispose = _current\n                    _current = newDisposable\n                    return toDispose\n                }\n            }\n            \n            if let disposable = disposable {\n                disposable.dispose()\n            }\n        }\n    }\n    \n    /// Disposes the underlying disposable as well as all future replacements.\n    public func dispose() {\n        _dispose()?.dispose()\n    }\n\n    private func _dispose() -> Disposable? {\n        _lock.lock(); defer { _lock.unlock() }\n        if _isDisposed {\n            return nil\n        }\n        else {\n            _isDisposed = true\n            let current = _current\n            _current = nil\n            return current\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposables/SingleAssignmentDisposable.swift",
    "content": "//\n//  SingleAssignmentDisposable.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/15/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/**\nRepresents a disposable resource which only allows a single assignment of its underlying disposable resource.\n\nIf an underlying disposable resource has already been set, future attempts to set the underlying disposable resource will throw an exception.\n*/\npublic final class SingleAssignmentDisposable : DisposeBase, Cancelable {\n\n    fileprivate enum DisposeState: UInt32 {\n        case disposed = 1\n        case disposableSet = 2\n    }\n\n    // Jeej, swift API consistency rules\n    fileprivate enum DisposeStateInt32: Int32 {\n        case disposed = 1\n        case disposableSet = 2\n    }\n\n    // state\n    private var _state: AtomicInt = 0\n    private var _disposable = nil as Disposable?\n\n    /// - returns: A value that indicates whether the object is disposed.\n    public var isDisposed: Bool {\n        return AtomicFlagSet(DisposeState.disposed.rawValue, &_state)\n    }\n\n    /// Initializes a new instance of the `SingleAssignmentDisposable`.\n    public override init() {\n        super.init()\n    }\n\n    /// Gets or sets the underlying disposable. After disposal, the result of getting this property is undefined.\n    ///\n    /// **Throws exception if the `SingleAssignmentDisposable` has already been assigned to.**\n    public func setDisposable(_ disposable: Disposable) {\n        _disposable = disposable\n\n        let previousState = AtomicOr(DisposeState.disposableSet.rawValue, &_state)\n        \n        if (previousState & DisposeStateInt32.disposableSet.rawValue) != 0 {\n            rxFatalError(\"oldState.disposable != nil\")\n        }\n\n        if (previousState & DisposeStateInt32.disposed.rawValue) != 0 {\n            disposable.dispose()\n            _disposable = nil\n        }\n    }\n\n    /// Disposes the underlying disposable.\n    public func dispose() {\n        let previousState = AtomicOr(DisposeState.disposed.rawValue, &_state)\n\n        if (previousState & DisposeStateInt32.disposed.rawValue) != 0 {\n            return\n        }\n\n        if (previousState & DisposeStateInt32.disposableSet.rawValue) != 0 {\n            guard let disposable = _disposable else {\n                rxFatalError(\"Disposable not set\")\n            }\n            disposable.dispose()\n            _disposable = nil\n        }\n    }\n\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Disposables/SubscriptionDisposable.swift",
    "content": "//\n//  SubscriptionDisposable.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 10/25/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nstruct SubscriptionDisposable<T: SynchronizedUnsubscribeType> : Disposable {\n    private let _key: T.DisposeKey\n    private weak var _owner: T?\n\n    init(owner: T, key: T.DisposeKey) {\n        _owner = owner\n        _key = key\n    }\n\n    func dispose() {\n        _owner?.synchronizedUnsubscribe(_key)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Errors.swift",
    "content": "//\n//  Errors.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/28/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nlet RxErrorDomain       = \"RxErrorDomain\"\nlet RxCompositeFailures = \"RxCompositeFailures\"\n\n/// Generic Rx error codes.\npublic enum RxError\n    : Swift.Error\n    , CustomDebugStringConvertible {\n    /// Unknown error occurred.\n    case unknown\n    /// Performing an action on disposed object.\n    case disposed(object: AnyObject)\n    /// Aritmetic overflow error.\n    case overflow\n    /// Argument out of range error.\n    case argumentOutOfRange\n    /// Sequence doesn't contain any elements.\n    case noElements\n    /// Sequence contains more than one element.\n    case moreThanOneElement\n    /// Timeout error.\n    case timeout\n}\n\nextension RxError {\n    /// A textual representation of `self`, suitable for debugging.\n    public var debugDescription: String {\n        switch self {\n        case .unknown:\n            return \"Unknown error occurred.\"\n        case .disposed(let object):\n            return \"Object `\\(object)` was already disposed.\"\n        case .overflow:\n            return \"Arithmetic overflow occurred.\"\n        case .argumentOutOfRange:\n            return \"Argument out of range.\"\n        case .noElements:\n            return \"Sequence doesn't contain any elements.\"\n        case .moreThanOneElement:\n            return \"Sequence contains more than one element.\"\n        case .timeout:\n            return \"Sequence timeout.\"\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Event.swift",
    "content": "//\n//  Event.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/8/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents a sequence event.\n///\n/// Sequence grammar: \n/// **next\\* (error | completed)**\npublic enum Event<Element> {\n    /// Next element is produced.\n    case next(Element)\n\n    /// Sequence terminated with an error.\n    case error(Swift.Error)\n\n    /// Sequence completed successfully.\n    case completed\n}\n\nextension Event : CustomDebugStringConvertible {\n    /// - returns: Description of event.\n    public var debugDescription: String {\n        switch self {\n        case .next(let value):\n            return \"next(\\(value))\"\n        case .error(let error):\n            return \"error(\\(error))\"\n        case .completed:\n            return \"completed\"\n        }\n    }\n}\n\nextension Event {\n    /// Is `completed` or `error` event.\n    public var isStopEvent: Bool {\n        switch self {\n        case .next: return false\n        case .error, .completed: return true\n        }\n    }\n\n    /// If `next` event, returns element value.\n    public var element: Element? {\n        if case .next(let value) = self {\n            return value\n        }\n        return nil\n    }\n\n    /// If `error` event, returns error.\n    public var error: Swift.Error? {\n        if case .error(let error) = self {\n            return error\n        }\n        return nil\n    }\n\n    /// If `completed` event, returns true.\n    public var isCompleted: Bool {\n        if case .completed = self {\n            return true\n        }\n        return false\n    }\n}\n\nextension Event {\n    /// Maps sequence elements using transform. If error happens during the transform .error\n    /// will be returned as value\n    public func map<Result>(_ transform: (Element) throws -> Result) -> Event<Result> {\n        do {\n            switch self {\n            case let .next(element):\n                return .next(try transform(element))\n            case let .error(error):\n                return .error(error)\n            case .completed:\n                return .completed\n            }\n        }\n        catch let e {\n            return .error(e)\n        }\n    }\n}\n\n/// A type that can be converted to `Event<Element>`.\npublic protocol EventConvertible {\n    /// Type of element in event\n    associatedtype ElementType\n\n    /// Event representation of this instance\n    var event: Event<ElementType> { get }\n}\n\nextension Event : EventConvertible {\n    /// Event representation of this instance\n    public var event: Event<Element> {\n        return self\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Extensions/Bag+Rx.swift",
    "content": "//\n//  Bag+Rx.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 10/19/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n\n// MARK: forEach\n\n@inline(__always)\nfunc dispatch<E>(_ bag: Bag<(Event<E>) -> ()>, _ event: Event<E>) {\n    if bag._onlyFastPath {\n        bag._value0?(event)\n        return\n    }\n\n    let value0 = bag._value0\n    let dictionary = bag._dictionary\n\n    if let value0 = value0 {\n        value0(event)\n    }\n\n    let pairs = bag._pairs\n    for i in 0 ..< pairs.count {\n        pairs[i].value(event)\n    }\n\n    if let dictionary = dictionary {\n        for element in dictionary.values {\n            element(event)\n        }\n    }\n}\n\n/// Dispatches `dispose` to all disposables contained inside bag.\nfunc disposeAll(in bag: Bag<Disposable>) {\n    if bag._onlyFastPath {\n        bag._value0?.dispose()\n        return\n    }\n\n    let value0 = bag._value0\n    let dictionary = bag._dictionary\n\n    if let value0 = value0 {\n        value0.dispose()\n    }\n\n    let pairs = bag._pairs\n    for i in 0 ..< pairs.count {\n        pairs[i].value.dispose()\n    }\n\n    if let dictionary = dictionary {\n        for element in dictionary.values {\n            element.dispose()\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Extensions/String+Rx.swift",
    "content": "//\n//  String+Rx.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 12/25/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension String {\n    /// This is needed because on Linux Swift doesn't have `rangeOfString(..., options: .BackwardsSearch)`\n    func lastIndexOf(_ character: Character) -> Index? {\n        var index = endIndex\n        while index > startIndex {\n            index = self.index(before: index)\n            if self[index] == character {\n                return index\n            }\n        }\n\n        return nil\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/GroupedObservable.swift",
    "content": "//\n//  GroupedObservable.swift\n//  RxSwift\n//\n//  Created by Tomi Koskinen on 01/12/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents an observable sequence of elements that have a common key.\npublic struct GroupedObservable<Key, Element> : ObservableType {\n    public typealias E = Element\n\n    /// Gets the common key.\n    public let key: Key\n\n    private let source: Observable<Element>\n\n    /// Initializes grouped observable sequence with key and source observable sequence.\n    ///\n    /// - parameter key: Grouped observable sequence key\n    /// - parameter source: Observable sequence that represents sequence of elements for the key\n    /// - returns: Grouped observable sequence of elements for the specific key\n    public init(key: Key, source: Observable<Element>) {\n        self.key = key\n        self.source = source\n    }\n\n    /// Subscribes `observer` to receive events for this sequence.\n    public func subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == E {\n        return self.source.subscribe(observer)\n    }\n\n    /// Converts `self` to `Observable` sequence. \n    public func asObservable() -> Observable<Element> {\n        return source\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/ImmediateSchedulerType.swift",
    "content": "//\n//  ImmediateSchedulerType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 5/31/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents an object that immediately schedules units of work.\npublic protocol ImmediateSchedulerType {\n    /**\n    Schedules an action to be executed immediately.\n    \n    - parameter state: State passed to the action to be executed.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    func schedule<StateType>(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable\n}\n\nextension ImmediateSchedulerType {\n    /**\n    Schedules an action to be executed recursively.\n    \n    - parameter state: State passed to the action to be executed.\n    - parameter action: Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    public func scheduleRecursive<State>(_ state: State, action: @escaping (_ state: State, _ recurse: (State) -> ()) -> ()) -> Disposable {\n        let recursiveScheduler = RecursiveImmediateScheduler(action: action, scheduler: self)\n        \n        recursiveScheduler.schedule(state)\n        \n        return Disposables.create(with: recursiveScheduler.dispose)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observable.swift",
    "content": "//\n//  Observable.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/8/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// A type-erased `ObservableType`. \n///\n/// It represents a push style sequence.\npublic class Observable<Element> : ObservableType {\n    /// Type of elements in sequence.\n    public typealias E = Element\n    \n    init() {\n#if TRACE_RESOURCES\n        let _ = Resources.incrementTotal()\n#endif\n    }\n    \n    public func subscribe<O: ObserverType>(_ observer: O) -> Disposable where O.E == E {\n        rxAbstractMethod()\n    }\n    \n    public func asObservable() -> Observable<E> {\n        return self\n    }\n    \n    deinit {\n#if TRACE_RESOURCES\n        let _ = Resources.decrementTotal()\n#endif\n    }\n\n    // this is kind of ugly I know :(\n    // Swift compiler reports \"Not supported yet\" when trying to override protocol extensions, so ¯\\_(ツ)_/¯\n\n    /// Optimizations for map operator\n    internal func composeMap<R>(_ transform: @escaping (Element) throws -> R) -> Observable<R> {\n        return _map(source: self, transform: transform)\n    }\n}\n\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/ObservableConvertibleType.swift",
    "content": "//\n//  ObservableConvertibleType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 9/17/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Type that can be converted to observable sequence (`Observable<E>`).\npublic protocol ObservableConvertibleType {\n    /// Type of elements in sequence.\n    associatedtype E\n\n    /// Converts `self` to `Observable` sequence.\n    ///\n    /// - returns: Observable sequence that represents `self`.\n    func asObservable() -> Observable<E>\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/ObservableType+Extensions.swift",
    "content": "//\n//  ObservableType+Extensions.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if DEBUG\n    import Foundation\n#endif\n\nextension ObservableType {\n    /**\n     Subscribes an event handler to an observable sequence.\n     \n     - parameter on: Action to invoke for each event in the observable sequence.\n     - returns: Subscription object used to unsubscribe from the observable sequence.\n     */\n    public func subscribe(_ on: @escaping (Event<E>) -> Void)\n        -> Disposable {\n            let observer = AnonymousObserver { e in\n                on(e)\n            }\n            return self.asObservable().subscribe(observer)\n    }\n    \n    \n    /**\n     Subscribes an element handler, an error handler, a completion handler and disposed handler to an observable sequence.\n     \n     - parameter onNext: Action to invoke for each element in the observable sequence.\n     - parameter onError: Action to invoke upon errored termination of the observable sequence.\n     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.\n     - parameter onDisposed: Action to invoke upon any type of termination of sequence (if the sequence has\n     gracefully completed, errored, or if the generation is canceled by disposing subscription).\n     - returns: Subscription object used to unsubscribe from the observable sequence.\n     */\n    public func subscribe(onNext: ((E) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onDisposed: (() -> Void)? = nil)\n        -> Disposable {\n            #if DEBUG\n                let disposable: Disposable\n                \n                if let disposed = onDisposed {\n                    disposable = Disposables.create(with: disposed)\n                }\n                else {\n                    disposable = Disposables.create()\n                }\n                \n                let synchronizationTracker = SynchronizationTracker()\n\n                let callStack = Thread.callStackSymbols\n\n                let observer = AnonymousObserver<E> { event in\n                    \n                    synchronizationTracker.register(synchronizationErrorMessage: .default)\n                    defer { synchronizationTracker.unregister() }\n                    \n                    switch event {\n                    case .next(let value):\n                        onNext?(value)\n                    case .error(let error):\n                        if let onError = onError {\n                            onError(error)\n                        }\n                        else {\n                            Hooks.defaultErrorHandler(callStack, error)\n                        }\n                        disposable.dispose()\n                    case .completed:\n                        onCompleted?()\n                        disposable.dispose()\n                    }\n                }\n                return Disposables.create(\n                    self.asObservable().subscribe(observer),\n                    disposable\n                )\n            #else\n                let disposable: Disposable\n                \n                if let disposed = onDisposed {\n                    disposable = Disposables.create(with: disposed)\n                }\n                else {\n                    disposable = Disposables.create()\n                }\n                \n                let observer = AnonymousObserver<E> { event in\n                    switch event {\n                    case .next(let value):\n                        onNext?(value)\n                    case .error(let error):\n                        if let onError = onError {\n                            onError(error)\n                        }\n                        else {\n                            Hooks.defaultErrorHandler([], error)\n                        }\n                        disposable.dispose()\n                    case .completed:\n                        onCompleted?()\n                        disposable.dispose()\n                    }\n                }\n                return Disposables.create(\n                    self.asObservable().subscribe(observer),\n                    disposable\n                )\n            #endif\n            \n    }\n}\n\nimport class Foundation.NSRecursiveLock\n\nextension Hooks {\n    public typealias DefaultErrorHandler = (_ subscriptionCallStack: [String], _ error: Error) -> ()\n\n    fileprivate static let _lock = RecursiveLock()\n    fileprivate static var _defaultErrorHandler: DefaultErrorHandler = { subscriptionCallStack, error in\n        #if DEBUG\n            let serializedCallStack = subscriptionCallStack.joined(separator: \"\\n\")\n            print(\"Unhandled error happened: \\(error)\\n subscription called from:\\n\\(serializedCallStack)\")\n        #endif\n    }\n\n    /// Error handler called in case onError handler wasn't provided.\n    public static var defaultErrorHandler: DefaultErrorHandler {\n        get {\n            _lock.lock(); defer { _lock.unlock() }\n            return _defaultErrorHandler\n        }\n        set {\n            _lock.lock(); defer { _lock.unlock() }\n            _defaultErrorHandler = newValue\n        }\n    }\n}\n\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/ObservableType.swift",
    "content": "//\n//  ObservableType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 8/8/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents a push style sequence.\npublic protocol ObservableType : ObservableConvertibleType {\n    /**\n    Subscribes `observer` to receive events for this sequence.\n    \n    ### Grammar\n    \n    **Next\\* (Error | Completed)?**\n    \n    * sequences can produce zero or more elements so zero or more `Next` events can be sent to `observer`\n    * once an `Error` or `Completed` event is sent, the sequence terminates and can't produce any other elements\n    \n    It is possible that events are sent from different threads, but no two events can be sent concurrently to\n    `observer`.\n    \n    ### Resource Management\n    \n    When sequence sends `Complete` or `Error` event all internal resources that compute sequence elements\n    will be freed.\n    \n    To cancel production of sequence elements and free resources immediately, call `dispose` on returned\n    subscription.\n    \n    - returns: Subscription for `observer` that can be used to cancel production of sequence elements and free resources.\n    */\n    func subscribe<O: ObserverType>(_ observer: O) -> Disposable where O.E == E\n}\n\nextension ObservableType {\n    \n    /// Default implementation of converting `ObservableType` to `Observable`.\n    public func asObservable() -> Observable<E> {\n        // temporary workaround\n        //return Observable.create(subscribe: self.subscribe)\n        return Observable.create { o in\n            return self.subscribe(o)\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/AddRef.swift",
    "content": "//\n//  AddRef.swift\n//  RxSwift\n//\n//  Created by Junior B. on 30/10/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nfinal class AddRefSink<O: ObserverType> : Sink<O>, ObserverType {\n    typealias Element = O.E\n    \n    override init(observer: O, cancel: Cancelable) {\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next(_):\n            forwardOn(event)\n        case .completed, .error(_):\n            forwardOn(event)\n            dispose()\n        }\n    }\n}\n\nfinal class AddRef<Element> : Producer<Element> {\n    typealias EventHandler = (Event<Element>) throws -> Void\n    \n    private let _source: Observable<Element>\n    private let _refCount: RefCountDisposable\n    \n    init(source: Observable<Element>, refCount: RefCountDisposable) {\n        _source = source\n        _refCount = refCount\n    }\n    \n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let releaseDisposable = _refCount.retain()\n        let sink = AddRefSink(observer: observer, cancel: cancel)\n        let subscription = Disposables.create(releaseDisposable, _source.subscribe(sink))\n\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Amb.swift",
    "content": "//\n//  Amb.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 6/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Propagates the observable sequence that reacts first.\n\n     - seealso: [amb operator on reactivex.io](http://reactivex.io/documentation/operators/amb.html)\n\n     - returns: An observable sequence that surfaces any of the given sequences, whichever reacted first.\n     */\n    public static func amb<S: Sequence>(_ sequence: S) -> Observable<E>\n        where S.Iterator.Element == Observable<E> {\n            return sequence.reduce(Observable<S.Iterator.Element.E>.never()) { a, o in\n                return a.amb(o.asObservable())\n            }\n    }\n}\n\nextension ObservableType {\n\n    /**\n     Propagates the observable sequence that reacts first.\n\n     - seealso: [amb operator on reactivex.io](http://reactivex.io/documentation/operators/amb.html)\n\n     - parameter right: Second observable sequence.\n     - returns: An observable sequence that surfaces either of the given sequences, whichever reacted first.\n     */\n    public func amb<O2: ObservableType>\n        (_ right: O2)\n        -> Observable<E> where O2.E == E {\n        return Amb(left: asObservable(), right: right.asObservable())\n    }\n}\n\nfileprivate enum AmbState {\n    case neither\n    case left\n    case right\n}\n\nfinal fileprivate class AmbObserver<O: ObserverType> : ObserverType {\n    typealias Element = O.E\n    typealias Parent = AmbSink<O>\n    typealias This = AmbObserver<O>\n    typealias Sink = (This, Event<Element>) -> Void\n    \n    fileprivate let _parent: Parent\n    fileprivate var _sink: Sink\n    fileprivate var _cancel: Disposable\n    \n    init(parent: Parent, cancel: Disposable, sink: @escaping Sink) {\n#if TRACE_RESOURCES\n        let _ = Resources.incrementTotal()\n#endif\n        \n        _parent = parent\n        _sink = sink\n        _cancel = cancel\n    }\n    \n    func on(_ event: Event<Element>) {\n        _sink(self, event)\n        if event.isStopEvent {\n            _cancel.dispose()\n        }\n    }\n    \n    deinit {\n#if TRACE_RESOURCES\n        let _ = Resources.decrementTotal()\n#endif\n    }\n}\n\nfinal fileprivate class AmbSink<O: ObserverType> : Sink<O> {\n    typealias ElementType = O.E\n    typealias Parent = Amb<ElementType>\n    typealias AmbObserverType = AmbObserver<O>\n\n    private let _parent: Parent\n    \n    private let _lock = RecursiveLock()\n    // state\n    private var _choice = AmbState.neither\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n        let disposeAll = Disposables.create(subscription1, subscription2)\n        \n        let forwardEvent = { (o: AmbObserverType, event: Event<ElementType>) -> Void in\n            self.forwardOn(event)\n            if event.isStopEvent {\n                self.dispose()\n            }\n        }\n\n        let decide = { (o: AmbObserverType, event: Event<ElementType>, me: AmbState, otherSubscription: Disposable) in\n            self._lock.performLocked {\n                if self._choice == .neither {\n                    self._choice = me\n                    o._sink = forwardEvent\n                    o._cancel = disposeAll\n                    otherSubscription.dispose()\n                }\n                \n                if self._choice == me {\n                    self.forwardOn(event)\n                    if event.isStopEvent {\n                        self.dispose()\n                    }\n                }\n            }\n        }\n        \n        let sink1 = AmbObserver(parent: self, cancel: subscription1) { o, e in\n            decide(o, e, .left, subscription2)\n        }\n        \n        let sink2 = AmbObserver(parent: self, cancel: subscription1) { o, e in\n            decide(o, e, .right, subscription1)\n        }\n        \n        subscription1.setDisposable(_parent._left.subscribe(sink1))\n        subscription2.setDisposable(_parent._right.subscribe(sink2))\n        \n        return disposeAll\n    }\n}\n\nfinal fileprivate class Amb<Element>: Producer<Element> {\n    fileprivate let _left: Observable<Element>\n    fileprivate let _right: Observable<Element>\n    \n    init(left: Observable<Element>, right: Observable<Element>) {\n        _left = left\n        _right = right\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = AmbSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/AsMaybe.swift",
    "content": "//\n//  AsMaybe.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/12/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nfileprivate final class AsMaybeSink<O: ObserverType> : Sink<O>, ObserverType {\n    typealias ElementType = O.E\n    typealias E = ElementType\n\n    private var _element: Event<E>? = nil\n\n    func on(_ event: Event<E>) {\n        switch event {\n        case .next:\n            if _element != nil {\n                forwardOn(.error(RxError.moreThanOneElement))\n                dispose()\n            }\n\n            _element = event\n        case .error:\n            forwardOn(event)\n            dispose()\n        case .completed:\n            if let element = _element {\n                forwardOn(element)\n            }\n            forwardOn(.completed)\n            dispose()\n        }\n    }\n}\n\nfinal class AsMaybe<Element>: Producer<Element> {\n    fileprivate let _source: Observable<Element>\n\n    init(source: Observable<Element>) {\n        _source = source\n    }\n\n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = AsMaybeSink(observer: observer, cancel: cancel)\n        let subscription = _source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/AsSingle.swift",
    "content": "//\n//  AsSingle.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/12/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nfileprivate final class AsSingleSink<O: ObserverType> : Sink<O>, ObserverType {\n    typealias ElementType = O.E\n    typealias E = ElementType\n\n    private var _element: Event<E>? = nil\n\n    func on(_ event: Event<E>) {\n        switch event {\n        case .next:\n            if _element != nil {\n                forwardOn(.error(RxError.moreThanOneElement))\n                dispose()\n            }\n\n            _element = event\n        case .error:\n            forwardOn(event)\n            dispose()\n        case .completed:\n            if let element = _element {\n                forwardOn(element)\n                forwardOn(.completed)\n            }\n            else {\n                forwardOn(.error(RxError.noElements))\n            }\n            dispose()\n        }\n    }\n}\n\nfinal class AsSingle<Element>: Producer<Element> {\n    fileprivate let _source: Observable<Element>\n\n    init(source: Observable<Element>) {\n        _source = source\n    }\n\n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = AsSingleSink(observer: observer, cancel: cancel)\n        let subscription = _source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Buffer.swift",
    "content": "//\n//  Buffer.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 9/13/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Projects each element of an observable sequence into a buffer that's sent out when either it's full or a given amount of time has elapsed, using the specified scheduler to run timers.\n\n     A useful real-world analogy of this overload is the behavior of a ferry leaving the dock when all seats are taken, or at the scheduled time of departure, whichever event occurs first.\n\n     - seealso: [buffer operator on reactivex.io](http://reactivex.io/documentation/operators/buffer.html)\n\n     - parameter timeSpan: Maximum time length of a buffer.\n     - parameter count: Maximum element count of a buffer.\n     - parameter scheduler: Scheduler to run buffering timers on.\n     - returns: An observable sequence of buffers.\n     */\n    public func buffer(timeSpan: RxTimeInterval, count: Int, scheduler: SchedulerType)\n        -> Observable<[E]> {\n        return BufferTimeCount(source: self.asObservable(), timeSpan: timeSpan, count: count, scheduler: scheduler)\n    }\n}\n\nfinal fileprivate class BufferTimeCount<Element> : Producer<[Element]> {\n    \n    fileprivate let _timeSpan: RxTimeInterval\n    fileprivate let _count: Int\n    fileprivate let _scheduler: SchedulerType\n    fileprivate let _source: Observable<Element>\n    \n    init(source: Observable<Element>, timeSpan: RxTimeInterval, count: Int, scheduler: SchedulerType) {\n        _source = source\n        _timeSpan = timeSpan\n        _count = count\n        _scheduler = scheduler\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == [Element] {\n        let sink = BufferTimeCountSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\nfinal fileprivate class BufferTimeCountSink<Element, O: ObserverType>\n    : Sink<O>\n    , LockOwnerType\n    , ObserverType\n    , SynchronizedOnType where O.E == [Element] {\n    typealias Parent = BufferTimeCount<Element>\n    typealias E = Element\n    \n    private let _parent: Parent\n    \n    let _lock = RecursiveLock()\n    \n    // state\n    private let _timerD = SerialDisposable()\n    private var _buffer = [Element]()\n    private var _windowID = 0\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n \n    func run() -> Disposable {\n        createTimer(_windowID)\n        return Disposables.create(_timerD, _parent._source.subscribe(self))\n    }\n    \n    func startNewWindowAndSendCurrentOne() {\n        _windowID = _windowID &+ 1\n        let windowID = _windowID\n        \n        let buffer = _buffer\n        _buffer = []\n        forwardOn(.next(buffer))\n        \n        createTimer(windowID)\n    }\n    \n    func on(_ event: Event<E>) {\n        synchronizedOn(event)\n    }\n\n    func _synchronized_on(_ event: Event<E>) {\n        switch event {\n        case .next(let element):\n            _buffer.append(element)\n            \n            if _buffer.count == _parent._count {\n                startNewWindowAndSendCurrentOne()\n            }\n            \n        case .error(let error):\n            _buffer = []\n            forwardOn(.error(error))\n            dispose()\n        case .completed:\n            forwardOn(.next(_buffer))\n            forwardOn(.completed)\n            dispose()\n        }\n    }\n    \n    func createTimer(_ windowID: Int) {\n        if _timerD.isDisposed {\n            return\n        }\n        \n        if _windowID != windowID {\n            return\n        }\n\n        let nextTimer = SingleAssignmentDisposable()\n        \n        _timerD.disposable = nextTimer\n\n        let disposable = _parent._scheduler.scheduleRelative(windowID, dueTime: _parent._timeSpan) { previousWindowID in\n            self._lock.performLocked {\n                if previousWindowID != self._windowID {\n                    return\n                }\n             \n                self.startNewWindowAndSendCurrentOne()\n            }\n            \n            return Disposables.create()\n        }\n\n        nextTimer.setDisposable(disposable)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Catch.swift",
    "content": "//\n//  Catch.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 4/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Continues an observable sequence that is terminated by an error with the observable sequence produced by the handler.\n\n     - seealso: [catch operator on reactivex.io](http://reactivex.io/documentation/operators/catch.html)\n\n     - parameter handler: Error handler function, producing another observable sequence.\n     - returns: An observable sequence containing the source sequence's elements, followed by the elements produced by the handler's resulting observable sequence in case an error occurred.\n     */\n    public func catchError(_ handler: @escaping (Swift.Error) throws -> Observable<E>)\n        -> Observable<E> {\n        return Catch(source: asObservable(), handler: handler)\n    }\n\n    /**\n     Continues an observable sequence that is terminated by an error with a single element.\n\n     - seealso: [catch operator on reactivex.io](http://reactivex.io/documentation/operators/catch.html)\n\n     - parameter element: Last element in an observable sequence in case error occurs.\n     - returns: An observable sequence containing the source sequence's elements, followed by the `element` in case an error occurred.\n     */\n    public func catchErrorJustReturn(_ element: E)\n        -> Observable<E> {\n        return Catch(source: asObservable(), handler: { _ in Observable.just(element) })\n    }\n    \n}\n\nextension ObservableType {\n    /**\n     Continues an observable sequence that is terminated by an error with the next observable sequence.\n\n     - seealso: [catch operator on reactivex.io](http://reactivex.io/documentation/operators/catch.html)\n\n     - returns: An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n     */\n    public static func catchError<S: Sequence>(_ sequence: S) -> Observable<E>\n        where S.Iterator.Element == Observable<E> {\n        return CatchSequence(sources: sequence)\n    }\n}\n\nextension ObservableType {\n\n    /**\n     Repeats the source observable sequence until it successfully terminates.\n\n     **This could potentially create an infinite sequence.**\n\n     - seealso: [retry operator on reactivex.io](http://reactivex.io/documentation/operators/retry.html)\n\n     - returns: Observable sequence to repeat until it successfully terminates.\n     */\n    public func retry() -> Observable<E> {\n        return CatchSequence(sources: InfiniteSequence(repeatedValue: self.asObservable()))\n    }\n\n    /**\n     Repeats the source observable sequence the specified number of times in case of an error or until it successfully terminates.\n\n     If you encounter an error and want it to retry once, then you must use `retry(2)`\n\n     - seealso: [retry operator on reactivex.io](http://reactivex.io/documentation/operators/retry.html)\n\n     - parameter maxAttemptCount: Maximum number of times to repeat the sequence.\n     - returns: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n     */\n    public func retry(_ maxAttemptCount: Int)\n        -> Observable<E> {\n        return CatchSequence(sources: Swift.repeatElement(self.asObservable(), count: maxAttemptCount))\n    }\n}\n\n// catch with callback\n\nfinal fileprivate class CatchSinkProxy<O: ObserverType> : ObserverType {\n    typealias E = O.E\n    typealias Parent = CatchSink<O>\n    \n    private let _parent: Parent\n    \n    init(parent: Parent) {\n        _parent = parent\n    }\n    \n    func on(_ event: Event<E>) {\n        _parent.forwardOn(event)\n        \n        switch event {\n        case .next:\n            break\n        case .error, .completed:\n            _parent.dispose()\n        }\n    }\n}\n\nfinal fileprivate class CatchSink<O: ObserverType> : Sink<O>, ObserverType {\n    typealias E = O.E\n    typealias Parent = Catch<E>\n    \n    private let _parent: Parent\n    private let _subscription = SerialDisposable()\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        let d1 = SingleAssignmentDisposable()\n        _subscription.disposable = d1\n        d1.setDisposable(_parent._source.subscribe(self))\n\n        return _subscription\n    }\n    \n    func on(_ event: Event<E>) {\n        switch event {\n        case .next:\n            forwardOn(event)\n        case .completed:\n            forwardOn(event)\n            dispose()\n        case .error(let error):\n            do {\n                let catchSequence = try _parent._handler(error)\n\n                let observer = CatchSinkProxy(parent: self)\n                \n                _subscription.disposable = catchSequence.subscribe(observer)\n            }\n            catch let e {\n                forwardOn(.error(e))\n                dispose()\n            }\n        }\n    }\n}\n\nfinal fileprivate class Catch<Element> : Producer<Element> {\n    typealias Handler = (Swift.Error) throws -> Observable<Element>\n    \n    fileprivate let _source: Observable<Element>\n    fileprivate let _handler: Handler\n    \n    init(source: Observable<Element>, handler: @escaping Handler) {\n        _source = source\n        _handler = handler\n    }\n    \n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = CatchSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n// catch enumerable\n\nfinal fileprivate class CatchSequenceSink<S: Sequence, O: ObserverType>\n    : TailRecursiveSink<S, O>\n    , ObserverType where S.Iterator.Element : ObservableConvertibleType, S.Iterator.Element.E == O.E {\n    typealias Element = O.E\n    typealias Parent = CatchSequence<S>\n    \n    private var _lastError: Swift.Error?\n    \n    override init(observer: O, cancel: Cancelable) {\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next:\n            forwardOn(event)\n        case .error(let error):\n            _lastError = error\n            schedule(.moveNext)\n        case .completed:\n            forwardOn(event)\n            dispose()\n        }\n    }\n\n    override func subscribeToNext(_ source: Observable<E>) -> Disposable {\n        return source.subscribe(self)\n    }\n    \n    override func done() {\n        if let lastError = _lastError {\n            forwardOn(.error(lastError))\n        }\n        else {\n            forwardOn(.completed)\n        }\n        \n        self.dispose()\n    }\n    \n    override func extract(_ observable: Observable<Element>) -> SequenceGenerator? {\n        if let onError = observable as? CatchSequence<S> {\n            return (onError.sources.makeIterator(), nil)\n        }\n        else {\n            return nil\n        }\n    }\n}\n\nfinal fileprivate class CatchSequence<S: Sequence> : Producer<S.Iterator.Element.E> where S.Iterator.Element : ObservableConvertibleType {\n    typealias Element = S.Iterator.Element.E\n    \n    let sources: S\n    \n    init(sources: S) {\n        self.sources = sources\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = CatchSequenceSink<S, O>(observer: observer, cancel: cancel)\n        let subscription = sink.run((self.sources.makeIterator(), nil))\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/CombineLatest+Collection.swift",
    "content": "//\n//  CombineLatest+Collection.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 8/29/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n     - seealso: [combinelatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n     - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n     - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n     */\n    public static func combineLatest<C: Collection>(_ collection: C, _ resultSelector: @escaping ([C.Iterator.Element.E]) throws -> E) -> Observable<E>\n        where C.Iterator.Element: ObservableType {\n        return CombineLatestCollectionType(sources: collection, resultSelector: resultSelector)\n    }\n\n    /**\n     Merges the specified observable sequences into one observable sequence whenever any of the observable sequences produces an element.\n\n     - seealso: [combinelatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n     - returns: An observable sequence containing the result of combining elements of the sources.\n     */\n    public static func combineLatest<C: Collection>(_ collection: C) -> Observable<[E]>\n        where C.Iterator.Element: ObservableType, C.Iterator.Element.E == E {\n        return CombineLatestCollectionType(sources: collection, resultSelector: { $0 })\n    }\n}\n\nfinal fileprivate class CombineLatestCollectionTypeSink<C: Collection, O: ObserverType>\n    : Sink<O> where C.Iterator.Element : ObservableConvertibleType {\n    typealias R = O.E\n    typealias Parent = CombineLatestCollectionType<C, R>\n    typealias SourceElement = C.Iterator.Element.E\n    \n    let _parent: Parent\n    \n    let _lock = RecursiveLock()\n\n    // state\n    var _numberOfValues = 0\n    var _values: [SourceElement?]\n    var _isDone: [Bool]\n    var _numberOfDone = 0\n    var _subscriptions: [SingleAssignmentDisposable]\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        _values = [SourceElement?](repeating: nil, count: parent._count)\n        _isDone = [Bool](repeating: false, count: parent._count)\n        _subscriptions = Array<SingleAssignmentDisposable>()\n        _subscriptions.reserveCapacity(parent._count)\n        \n        for _ in 0 ..< parent._count {\n            _subscriptions.append(SingleAssignmentDisposable())\n        }\n        \n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<SourceElement>, atIndex: Int) {\n        _lock.lock(); defer { _lock.unlock() } // {\n            switch event {\n            case .next(let element):\n                if _values[atIndex] == nil {\n                   _numberOfValues += 1\n                }\n                \n                _values[atIndex] = element\n                \n                if _numberOfValues < _parent._count {\n                    let numberOfOthersThatAreDone = self._numberOfDone - (_isDone[atIndex] ? 1 : 0)\n                    if numberOfOthersThatAreDone == self._parent._count - 1 {\n                        forwardOn(.completed)\n                        dispose()\n                    }\n                    return\n                }\n                \n                do {\n                    let result = try _parent._resultSelector(_values.map { $0! })\n                    forwardOn(.next(result))\n                }\n                catch let error {\n                    forwardOn(.error(error))\n                    dispose()\n                }\n                \n            case .error(let error):\n                forwardOn(.error(error))\n                dispose()\n            case .completed:\n                if _isDone[atIndex] {\n                    return\n                }\n                \n                _isDone[atIndex] = true\n                _numberOfDone += 1\n                \n                if _numberOfDone == self._parent._count {\n                    forwardOn(.completed)\n                    dispose()\n                }\n                else {\n                    _subscriptions[atIndex].dispose()\n                }\n            }\n        // }\n    }\n    \n    func run() -> Disposable {\n        var j = 0\n        for i in _parent._sources {\n            let index = j\n            let source = i.asObservable()\n            let disposable = source.subscribe(AnyObserver { event in\n                self.on(event, atIndex: index)\n            })\n\n            _subscriptions[j].setDisposable(disposable)\n            \n            j += 1\n        }\n\n        if _parent._sources.isEmpty {\n            self.forwardOn(.completed)\n        }\n        \n        return Disposables.create(_subscriptions)\n    }\n}\n\nfinal fileprivate class CombineLatestCollectionType<C: Collection, R> : Producer<R> where C.Iterator.Element : ObservableConvertibleType {\n    typealias ResultSelector = ([C.Iterator.Element.E]) throws -> R\n    \n    let _sources: C\n    let _resultSelector: ResultSelector\n    let _count: Int\n\n    init(sources: C, resultSelector: @escaping ResultSelector) {\n        _sources = sources\n        _resultSelector = resultSelector\n        _count = Int(Int64(self._sources.count))\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R {\n        let sink = CombineLatestCollectionTypeSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/CombineLatest+arity.swift",
    "content": "// This file is autogenerated. Take a look at `Preprocessor` target in RxSwift project \n//\n//  CombineLatest+arity.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 4/22/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n\n\n// 2\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType>\n        (_ source1: O1, _ source2: O2, resultSelector: @escaping (O1.E, O2.E) throws -> E)\n            -> Observable<E> {\n        return CombineLatest2(\n            source1: source1.asObservable(), source2: source2.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType>\n        (_ source1: O1, _ source2: O2)\n            -> Observable<(O1.E, O2.E)> {\n        return CombineLatest2(\n            source1: source1.asObservable(), source2: source2.asObservable(),\n            resultSelector: { ($0, $1) }\n        )\n    }\n}\n\nfinal class CombineLatestSink2_<E1, E2, O: ObserverType> : CombineLatestSink<O> {\n    typealias R = O.E\n    typealias Parent = CombineLatest2<E1, E2, R>\n\n    let _parent: Parent\n\n    var _latestElement1: E1! = nil\n    var _latestElement2: E2! = nil\n\n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(arity: 2, observer: observer, cancel: cancel)\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n\n        let observer1 = CombineLatestObserver(lock: _lock, parent: self, index: 0, setLatestValue: { (e: E1) -> Void in self._latestElement1 = e }, this: subscription1)\n        let observer2 = CombineLatestObserver(lock: _lock, parent: self, index: 1, setLatestValue: { (e: E2) -> Void in self._latestElement2 = e }, this: subscription2)\n\n         subscription1.setDisposable(_parent._source1.subscribe(observer1))\n         subscription2.setDisposable(_parent._source2.subscribe(observer2))\n\n        return Disposables.create([\n                subscription1,\n                subscription2\n        ])\n    }\n\n    override func getResult() throws -> R {\n        return try _parent._resultSelector(_latestElement1, _latestElement2)\n    }\n}\n\nfinal class CombineLatest2<E1, E2, R> : Producer<R> {\n    typealias ResultSelector = (E1, E2) throws -> R\n\n    let _source1: Observable<E1>\n    let _source2: Observable<E2>\n\n    let _resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, resultSelector: @escaping ResultSelector) {\n        _source1 = source1\n        _source2 = source2\n\n        _resultSelector = resultSelector\n    }\n\n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R {\n        let sink = CombineLatestSink2_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n\n// 3\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType, O3: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, resultSelector: @escaping (O1.E, O2.E, O3.E) throws -> E)\n            -> Observable<E> {\n        return CombineLatest3(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType, O3: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3)\n            -> Observable<(O1.E, O2.E, O3.E)> {\n        return CombineLatest3(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(),\n            resultSelector: { ($0, $1, $2) }\n        )\n    }\n}\n\nfinal class CombineLatestSink3_<E1, E2, E3, O: ObserverType> : CombineLatestSink<O> {\n    typealias R = O.E\n    typealias Parent = CombineLatest3<E1, E2, E3, R>\n\n    let _parent: Parent\n\n    var _latestElement1: E1! = nil\n    var _latestElement2: E2! = nil\n    var _latestElement3: E3! = nil\n\n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(arity: 3, observer: observer, cancel: cancel)\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n        let subscription3 = SingleAssignmentDisposable()\n\n        let observer1 = CombineLatestObserver(lock: _lock, parent: self, index: 0, setLatestValue: { (e: E1) -> Void in self._latestElement1 = e }, this: subscription1)\n        let observer2 = CombineLatestObserver(lock: _lock, parent: self, index: 1, setLatestValue: { (e: E2) -> Void in self._latestElement2 = e }, this: subscription2)\n        let observer3 = CombineLatestObserver(lock: _lock, parent: self, index: 2, setLatestValue: { (e: E3) -> Void in self._latestElement3 = e }, this: subscription3)\n\n         subscription1.setDisposable(_parent._source1.subscribe(observer1))\n         subscription2.setDisposable(_parent._source2.subscribe(observer2))\n         subscription3.setDisposable(_parent._source3.subscribe(observer3))\n\n        return Disposables.create([\n                subscription1,\n                subscription2,\n                subscription3\n        ])\n    }\n\n    override func getResult() throws -> R {\n        return try _parent._resultSelector(_latestElement1, _latestElement2, _latestElement3)\n    }\n}\n\nfinal class CombineLatest3<E1, E2, E3, R> : Producer<R> {\n    typealias ResultSelector = (E1, E2, E3) throws -> R\n\n    let _source1: Observable<E1>\n    let _source2: Observable<E2>\n    let _source3: Observable<E3>\n\n    let _resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, source3: Observable<E3>, resultSelector: @escaping ResultSelector) {\n        _source1 = source1\n        _source2 = source2\n        _source3 = source3\n\n        _resultSelector = resultSelector\n    }\n\n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R {\n        let sink = CombineLatestSink3_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n\n// 4\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E) throws -> E)\n            -> Observable<E> {\n        return CombineLatest4(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4)\n            -> Observable<(O1.E, O2.E, O3.E, O4.E)> {\n        return CombineLatest4(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(),\n            resultSelector: { ($0, $1, $2, $3) }\n        )\n    }\n}\n\nfinal class CombineLatestSink4_<E1, E2, E3, E4, O: ObserverType> : CombineLatestSink<O> {\n    typealias R = O.E\n    typealias Parent = CombineLatest4<E1, E2, E3, E4, R>\n\n    let _parent: Parent\n\n    var _latestElement1: E1! = nil\n    var _latestElement2: E2! = nil\n    var _latestElement3: E3! = nil\n    var _latestElement4: E4! = nil\n\n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(arity: 4, observer: observer, cancel: cancel)\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n        let subscription3 = SingleAssignmentDisposable()\n        let subscription4 = SingleAssignmentDisposable()\n\n        let observer1 = CombineLatestObserver(lock: _lock, parent: self, index: 0, setLatestValue: { (e: E1) -> Void in self._latestElement1 = e }, this: subscription1)\n        let observer2 = CombineLatestObserver(lock: _lock, parent: self, index: 1, setLatestValue: { (e: E2) -> Void in self._latestElement2 = e }, this: subscription2)\n        let observer3 = CombineLatestObserver(lock: _lock, parent: self, index: 2, setLatestValue: { (e: E3) -> Void in self._latestElement3 = e }, this: subscription3)\n        let observer4 = CombineLatestObserver(lock: _lock, parent: self, index: 3, setLatestValue: { (e: E4) -> Void in self._latestElement4 = e }, this: subscription4)\n\n         subscription1.setDisposable(_parent._source1.subscribe(observer1))\n         subscription2.setDisposable(_parent._source2.subscribe(observer2))\n         subscription3.setDisposable(_parent._source3.subscribe(observer3))\n         subscription4.setDisposable(_parent._source4.subscribe(observer4))\n\n        return Disposables.create([\n                subscription1,\n                subscription2,\n                subscription3,\n                subscription4\n        ])\n    }\n\n    override func getResult() throws -> R {\n        return try _parent._resultSelector(_latestElement1, _latestElement2, _latestElement3, _latestElement4)\n    }\n}\n\nfinal class CombineLatest4<E1, E2, E3, E4, R> : Producer<R> {\n    typealias ResultSelector = (E1, E2, E3, E4) throws -> R\n\n    let _source1: Observable<E1>\n    let _source2: Observable<E2>\n    let _source3: Observable<E3>\n    let _source4: Observable<E4>\n\n    let _resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, source3: Observable<E3>, source4: Observable<E4>, resultSelector: @escaping ResultSelector) {\n        _source1 = source1\n        _source2 = source2\n        _source3 = source3\n        _source4 = source4\n\n        _resultSelector = resultSelector\n    }\n\n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R {\n        let sink = CombineLatestSink4_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n\n// 5\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E) throws -> E)\n            -> Observable<E> {\n        return CombineLatest5(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5)\n            -> Observable<(O1.E, O2.E, O3.E, O4.E, O5.E)> {\n        return CombineLatest5(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(),\n            resultSelector: { ($0, $1, $2, $3, $4) }\n        )\n    }\n}\n\nfinal class CombineLatestSink5_<E1, E2, E3, E4, E5, O: ObserverType> : CombineLatestSink<O> {\n    typealias R = O.E\n    typealias Parent = CombineLatest5<E1, E2, E3, E4, E5, R>\n\n    let _parent: Parent\n\n    var _latestElement1: E1! = nil\n    var _latestElement2: E2! = nil\n    var _latestElement3: E3! = nil\n    var _latestElement4: E4! = nil\n    var _latestElement5: E5! = nil\n\n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(arity: 5, observer: observer, cancel: cancel)\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n        let subscription3 = SingleAssignmentDisposable()\n        let subscription4 = SingleAssignmentDisposable()\n        let subscription5 = SingleAssignmentDisposable()\n\n        let observer1 = CombineLatestObserver(lock: _lock, parent: self, index: 0, setLatestValue: { (e: E1) -> Void in self._latestElement1 = e }, this: subscription1)\n        let observer2 = CombineLatestObserver(lock: _lock, parent: self, index: 1, setLatestValue: { (e: E2) -> Void in self._latestElement2 = e }, this: subscription2)\n        let observer3 = CombineLatestObserver(lock: _lock, parent: self, index: 2, setLatestValue: { (e: E3) -> Void in self._latestElement3 = e }, this: subscription3)\n        let observer4 = CombineLatestObserver(lock: _lock, parent: self, index: 3, setLatestValue: { (e: E4) -> Void in self._latestElement4 = e }, this: subscription4)\n        let observer5 = CombineLatestObserver(lock: _lock, parent: self, index: 4, setLatestValue: { (e: E5) -> Void in self._latestElement5 = e }, this: subscription5)\n\n         subscription1.setDisposable(_parent._source1.subscribe(observer1))\n         subscription2.setDisposable(_parent._source2.subscribe(observer2))\n         subscription3.setDisposable(_parent._source3.subscribe(observer3))\n         subscription4.setDisposable(_parent._source4.subscribe(observer4))\n         subscription5.setDisposable(_parent._source5.subscribe(observer5))\n\n        return Disposables.create([\n                subscription1,\n                subscription2,\n                subscription3,\n                subscription4,\n                subscription5\n        ])\n    }\n\n    override func getResult() throws -> R {\n        return try _parent._resultSelector(_latestElement1, _latestElement2, _latestElement3, _latestElement4, _latestElement5)\n    }\n}\n\nfinal class CombineLatest5<E1, E2, E3, E4, E5, R> : Producer<R> {\n    typealias ResultSelector = (E1, E2, E3, E4, E5) throws -> R\n\n    let _source1: Observable<E1>\n    let _source2: Observable<E2>\n    let _source3: Observable<E3>\n    let _source4: Observable<E4>\n    let _source5: Observable<E5>\n\n    let _resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, source3: Observable<E3>, source4: Observable<E4>, source5: Observable<E5>, resultSelector: @escaping ResultSelector) {\n        _source1 = source1\n        _source2 = source2\n        _source3 = source3\n        _source4 = source4\n        _source5 = source5\n\n        _resultSelector = resultSelector\n    }\n\n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R {\n        let sink = CombineLatestSink5_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n\n// 6\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType, O6: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E) throws -> E)\n            -> Observable<E> {\n        return CombineLatest6(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType, O6: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6)\n            -> Observable<(O1.E, O2.E, O3.E, O4.E, O5.E, O6.E)> {\n        return CombineLatest6(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(),\n            resultSelector: { ($0, $1, $2, $3, $4, $5) }\n        )\n    }\n}\n\nfinal class CombineLatestSink6_<E1, E2, E3, E4, E5, E6, O: ObserverType> : CombineLatestSink<O> {\n    typealias R = O.E\n    typealias Parent = CombineLatest6<E1, E2, E3, E4, E5, E6, R>\n\n    let _parent: Parent\n\n    var _latestElement1: E1! = nil\n    var _latestElement2: E2! = nil\n    var _latestElement3: E3! = nil\n    var _latestElement4: E4! = nil\n    var _latestElement5: E5! = nil\n    var _latestElement6: E6! = nil\n\n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(arity: 6, observer: observer, cancel: cancel)\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n        let subscription3 = SingleAssignmentDisposable()\n        let subscription4 = SingleAssignmentDisposable()\n        let subscription5 = SingleAssignmentDisposable()\n        let subscription6 = SingleAssignmentDisposable()\n\n        let observer1 = CombineLatestObserver(lock: _lock, parent: self, index: 0, setLatestValue: { (e: E1) -> Void in self._latestElement1 = e }, this: subscription1)\n        let observer2 = CombineLatestObserver(lock: _lock, parent: self, index: 1, setLatestValue: { (e: E2) -> Void in self._latestElement2 = e }, this: subscription2)\n        let observer3 = CombineLatestObserver(lock: _lock, parent: self, index: 2, setLatestValue: { (e: E3) -> Void in self._latestElement3 = e }, this: subscription3)\n        let observer4 = CombineLatestObserver(lock: _lock, parent: self, index: 3, setLatestValue: { (e: E4) -> Void in self._latestElement4 = e }, this: subscription4)\n        let observer5 = CombineLatestObserver(lock: _lock, parent: self, index: 4, setLatestValue: { (e: E5) -> Void in self._latestElement5 = e }, this: subscription5)\n        let observer6 = CombineLatestObserver(lock: _lock, parent: self, index: 5, setLatestValue: { (e: E6) -> Void in self._latestElement6 = e }, this: subscription6)\n\n         subscription1.setDisposable(_parent._source1.subscribe(observer1))\n         subscription2.setDisposable(_parent._source2.subscribe(observer2))\n         subscription3.setDisposable(_parent._source3.subscribe(observer3))\n         subscription4.setDisposable(_parent._source4.subscribe(observer4))\n         subscription5.setDisposable(_parent._source5.subscribe(observer5))\n         subscription6.setDisposable(_parent._source6.subscribe(observer6))\n\n        return Disposables.create([\n                subscription1,\n                subscription2,\n                subscription3,\n                subscription4,\n                subscription5,\n                subscription6\n        ])\n    }\n\n    override func getResult() throws -> R {\n        return try _parent._resultSelector(_latestElement1, _latestElement2, _latestElement3, _latestElement4, _latestElement5, _latestElement6)\n    }\n}\n\nfinal class CombineLatest6<E1, E2, E3, E4, E5, E6, R> : Producer<R> {\n    typealias ResultSelector = (E1, E2, E3, E4, E5, E6) throws -> R\n\n    let _source1: Observable<E1>\n    let _source2: Observable<E2>\n    let _source3: Observable<E3>\n    let _source4: Observable<E4>\n    let _source5: Observable<E5>\n    let _source6: Observable<E6>\n\n    let _resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, source3: Observable<E3>, source4: Observable<E4>, source5: Observable<E5>, source6: Observable<E6>, resultSelector: @escaping ResultSelector) {\n        _source1 = source1\n        _source2 = source2\n        _source3 = source3\n        _source4 = source4\n        _source5 = source5\n        _source6 = source6\n\n        _resultSelector = resultSelector\n    }\n\n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R {\n        let sink = CombineLatestSink6_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n\n// 7\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType, O6: ObservableType, O7: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E) throws -> E)\n            -> Observable<E> {\n        return CombineLatest7(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(), source7: source7.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType, O6: ObservableType, O7: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7)\n            -> Observable<(O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E)> {\n        return CombineLatest7(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(), source7: source7.asObservable(),\n            resultSelector: { ($0, $1, $2, $3, $4, $5, $6) }\n        )\n    }\n}\n\nfinal class CombineLatestSink7_<E1, E2, E3, E4, E5, E6, E7, O: ObserverType> : CombineLatestSink<O> {\n    typealias R = O.E\n    typealias Parent = CombineLatest7<E1, E2, E3, E4, E5, E6, E7, R>\n\n    let _parent: Parent\n\n    var _latestElement1: E1! = nil\n    var _latestElement2: E2! = nil\n    var _latestElement3: E3! = nil\n    var _latestElement4: E4! = nil\n    var _latestElement5: E5! = nil\n    var _latestElement6: E6! = nil\n    var _latestElement7: E7! = nil\n\n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(arity: 7, observer: observer, cancel: cancel)\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n        let subscription3 = SingleAssignmentDisposable()\n        let subscription4 = SingleAssignmentDisposable()\n        let subscription5 = SingleAssignmentDisposable()\n        let subscription6 = SingleAssignmentDisposable()\n        let subscription7 = SingleAssignmentDisposable()\n\n        let observer1 = CombineLatestObserver(lock: _lock, parent: self, index: 0, setLatestValue: { (e: E1) -> Void in self._latestElement1 = e }, this: subscription1)\n        let observer2 = CombineLatestObserver(lock: _lock, parent: self, index: 1, setLatestValue: { (e: E2) -> Void in self._latestElement2 = e }, this: subscription2)\n        let observer3 = CombineLatestObserver(lock: _lock, parent: self, index: 2, setLatestValue: { (e: E3) -> Void in self._latestElement3 = e }, this: subscription3)\n        let observer4 = CombineLatestObserver(lock: _lock, parent: self, index: 3, setLatestValue: { (e: E4) -> Void in self._latestElement4 = e }, this: subscription4)\n        let observer5 = CombineLatestObserver(lock: _lock, parent: self, index: 4, setLatestValue: { (e: E5) -> Void in self._latestElement5 = e }, this: subscription5)\n        let observer6 = CombineLatestObserver(lock: _lock, parent: self, index: 5, setLatestValue: { (e: E6) -> Void in self._latestElement6 = e }, this: subscription6)\n        let observer7 = CombineLatestObserver(lock: _lock, parent: self, index: 6, setLatestValue: { (e: E7) -> Void in self._latestElement7 = e }, this: subscription7)\n\n         subscription1.setDisposable(_parent._source1.subscribe(observer1))\n         subscription2.setDisposable(_parent._source2.subscribe(observer2))\n         subscription3.setDisposable(_parent._source3.subscribe(observer3))\n         subscription4.setDisposable(_parent._source4.subscribe(observer4))\n         subscription5.setDisposable(_parent._source5.subscribe(observer5))\n         subscription6.setDisposable(_parent._source6.subscribe(observer6))\n         subscription7.setDisposable(_parent._source7.subscribe(observer7))\n\n        return Disposables.create([\n                subscription1,\n                subscription2,\n                subscription3,\n                subscription4,\n                subscription5,\n                subscription6,\n                subscription7\n        ])\n    }\n\n    override func getResult() throws -> R {\n        return try _parent._resultSelector(_latestElement1, _latestElement2, _latestElement3, _latestElement4, _latestElement5, _latestElement6, _latestElement7)\n    }\n}\n\nfinal class CombineLatest7<E1, E2, E3, E4, E5, E6, E7, R> : Producer<R> {\n    typealias ResultSelector = (E1, E2, E3, E4, E5, E6, E7) throws -> R\n\n    let _source1: Observable<E1>\n    let _source2: Observable<E2>\n    let _source3: Observable<E3>\n    let _source4: Observable<E4>\n    let _source5: Observable<E5>\n    let _source6: Observable<E6>\n    let _source7: Observable<E7>\n\n    let _resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, source3: Observable<E3>, source4: Observable<E4>, source5: Observable<E5>, source6: Observable<E6>, source7: Observable<E7>, resultSelector: @escaping ResultSelector) {\n        _source1 = source1\n        _source2 = source2\n        _source3 = source3\n        _source4 = source4\n        _source5 = source5\n        _source6 = source6\n        _source7 = source7\n\n        _resultSelector = resultSelector\n    }\n\n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R {\n        let sink = CombineLatestSink7_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n\n// 8\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - parameter resultSelector: Function to invoke whenever any of the sources produces an element.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType, O6: ObservableType, O7: ObservableType, O8: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E) throws -> E)\n            -> Observable<E> {\n        return CombineLatest8(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(), source7: source7.asObservable(), source8: source8.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever any of the observable sequences produces an element.\n\n    - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func combineLatest<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType, O6: ObservableType, O7: ObservableType, O8: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8)\n            -> Observable<(O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E)> {\n        return CombineLatest8(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(), source7: source7.asObservable(), source8: source8.asObservable(),\n            resultSelector: { ($0, $1, $2, $3, $4, $5, $6, $7) }\n        )\n    }\n}\n\nfinal class CombineLatestSink8_<E1, E2, E3, E4, E5, E6, E7, E8, O: ObserverType> : CombineLatestSink<O> {\n    typealias R = O.E\n    typealias Parent = CombineLatest8<E1, E2, E3, E4, E5, E6, E7, E8, R>\n\n    let _parent: Parent\n\n    var _latestElement1: E1! = nil\n    var _latestElement2: E2! = nil\n    var _latestElement3: E3! = nil\n    var _latestElement4: E4! = nil\n    var _latestElement5: E5! = nil\n    var _latestElement6: E6! = nil\n    var _latestElement7: E7! = nil\n    var _latestElement8: E8! = nil\n\n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(arity: 8, observer: observer, cancel: cancel)\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n        let subscription3 = SingleAssignmentDisposable()\n        let subscription4 = SingleAssignmentDisposable()\n        let subscription5 = SingleAssignmentDisposable()\n        let subscription6 = SingleAssignmentDisposable()\n        let subscription7 = SingleAssignmentDisposable()\n        let subscription8 = SingleAssignmentDisposable()\n\n        let observer1 = CombineLatestObserver(lock: _lock, parent: self, index: 0, setLatestValue: { (e: E1) -> Void in self._latestElement1 = e }, this: subscription1)\n        let observer2 = CombineLatestObserver(lock: _lock, parent: self, index: 1, setLatestValue: { (e: E2) -> Void in self._latestElement2 = e }, this: subscription2)\n        let observer3 = CombineLatestObserver(lock: _lock, parent: self, index: 2, setLatestValue: { (e: E3) -> Void in self._latestElement3 = e }, this: subscription3)\n        let observer4 = CombineLatestObserver(lock: _lock, parent: self, index: 3, setLatestValue: { (e: E4) -> Void in self._latestElement4 = e }, this: subscription4)\n        let observer5 = CombineLatestObserver(lock: _lock, parent: self, index: 4, setLatestValue: { (e: E5) -> Void in self._latestElement5 = e }, this: subscription5)\n        let observer6 = CombineLatestObserver(lock: _lock, parent: self, index: 5, setLatestValue: { (e: E6) -> Void in self._latestElement6 = e }, this: subscription6)\n        let observer7 = CombineLatestObserver(lock: _lock, parent: self, index: 6, setLatestValue: { (e: E7) -> Void in self._latestElement7 = e }, this: subscription7)\n        let observer8 = CombineLatestObserver(lock: _lock, parent: self, index: 7, setLatestValue: { (e: E8) -> Void in self._latestElement8 = e }, this: subscription8)\n\n         subscription1.setDisposable(_parent._source1.subscribe(observer1))\n         subscription2.setDisposable(_parent._source2.subscribe(observer2))\n         subscription3.setDisposable(_parent._source3.subscribe(observer3))\n         subscription4.setDisposable(_parent._source4.subscribe(observer4))\n         subscription5.setDisposable(_parent._source5.subscribe(observer5))\n         subscription6.setDisposable(_parent._source6.subscribe(observer6))\n         subscription7.setDisposable(_parent._source7.subscribe(observer7))\n         subscription8.setDisposable(_parent._source8.subscribe(observer8))\n\n        return Disposables.create([\n                subscription1,\n                subscription2,\n                subscription3,\n                subscription4,\n                subscription5,\n                subscription6,\n                subscription7,\n                subscription8\n        ])\n    }\n\n    override func getResult() throws -> R {\n        return try _parent._resultSelector(_latestElement1, _latestElement2, _latestElement3, _latestElement4, _latestElement5, _latestElement6, _latestElement7, _latestElement8)\n    }\n}\n\nfinal class CombineLatest8<E1, E2, E3, E4, E5, E6, E7, E8, R> : Producer<R> {\n    typealias ResultSelector = (E1, E2, E3, E4, E5, E6, E7, E8) throws -> R\n\n    let _source1: Observable<E1>\n    let _source2: Observable<E2>\n    let _source3: Observable<E3>\n    let _source4: Observable<E4>\n    let _source5: Observable<E5>\n    let _source6: Observable<E6>\n    let _source7: Observable<E7>\n    let _source8: Observable<E8>\n\n    let _resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, source3: Observable<E3>, source4: Observable<E4>, source5: Observable<E5>, source6: Observable<E6>, source7: Observable<E7>, source8: Observable<E8>, resultSelector: @escaping ResultSelector) {\n        _source1 = source1\n        _source2 = source2\n        _source3 = source3\n        _source4 = source4\n        _source5 = source5\n        _source6 = source6\n        _source7 = source7\n        _source8 = source8\n\n        _resultSelector = resultSelector\n    }\n\n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R {\n        let sink = CombineLatestSink8_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/CombineLatest.swift",
    "content": "//\n//  CombineLatest.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nprotocol CombineLatestProtocol : class {\n    func next(_ index: Int)\n    func fail(_ error: Swift.Error)\n    func done(_ index: Int)\n}\n\nclass CombineLatestSink<O: ObserverType>\n    : Sink<O>\n    , CombineLatestProtocol {\n    typealias Element = O.E\n   \n    let _lock = RecursiveLock()\n\n    private let _arity: Int\n    private var _numberOfValues = 0\n    private var _numberOfDone = 0\n    private var _hasValue: [Bool]\n    private var _isDone: [Bool]\n   \n    init(arity: Int, observer: O, cancel: Cancelable) {\n        _arity = arity\n        _hasValue = [Bool](repeating: false, count: arity)\n        _isDone = [Bool](repeating: false, count: arity)\n        \n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func getResult() throws -> Element {\n        rxAbstractMethod()\n    }\n    \n    func next(_ index: Int) {\n        if !_hasValue[index] {\n            _hasValue[index] = true\n            _numberOfValues += 1\n        }\n\n        if _numberOfValues == _arity {\n            do {\n                let result = try getResult()\n                forwardOn(.next(result))\n            }\n            catch let e {\n                forwardOn(.error(e))\n                dispose()\n            }\n        }\n        else {\n            var allOthersDone = true\n\n            for i in 0 ..< _arity {\n                if i != index && !_isDone[i] {\n                    allOthersDone = false\n                    break\n                }\n            }\n            \n            if allOthersDone {\n                forwardOn(.completed)\n                dispose()\n            }\n        }\n    }\n    \n    func fail(_ error: Swift.Error) {\n        forwardOn(.error(error))\n        dispose()\n    }\n    \n    func done(_ index: Int) {\n        if _isDone[index] {\n            return\n        }\n\n        _isDone[index] = true\n        _numberOfDone += 1\n\n        if _numberOfDone == _arity {\n            forwardOn(.completed)\n            dispose()\n        }\n    }\n}\n\nfinal class CombineLatestObserver<ElementType>\n    : ObserverType\n    , LockOwnerType\n    , SynchronizedOnType {\n    typealias Element = ElementType\n    typealias ValueSetter = (Element) -> Void\n    \n    private let _parent: CombineLatestProtocol\n    \n    let _lock: RecursiveLock\n    private let _index: Int\n    private let _this: Disposable\n    private let _setLatestValue: ValueSetter\n    \n    init(lock: RecursiveLock, parent: CombineLatestProtocol, index: Int, setLatestValue: @escaping ValueSetter, this: Disposable) {\n        _lock = lock\n        _parent = parent\n        _index = index\n        _this = this\n        _setLatestValue = setLatestValue\n    }\n    \n    func on(_ event: Event<Element>) {\n        synchronizedOn(event)\n    }\n\n    func _synchronized_on(_ event: Event<Element>) {\n        switch event {\n        case .next(let value):\n            _setLatestValue(value)\n            _parent.next(_index)\n        case .error(let error):\n            _this.dispose()\n            _parent.fail(error)\n        case .completed:\n            _this.dispose()\n            _parent.done(_index)\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Concat.swift",
    "content": "//\n//  Concat.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Concatenates the second observable sequence to `self` upon successful termination of `self`.\n\n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n\n     - parameter second: Second observable sequence.\n     - returns: An observable sequence that contains the elements of `self`, followed by those of the second sequence.\n     */\n    public func concat<O: ObservableConvertibleType>(_ second: O) -> Observable<E> where O.E == E {\n        return Observable.concat([self.asObservable(), second.asObservable()])\n    }\n}\n\nextension ObservableType {\n    /**\n     Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully.\n\n     This operator has tail recursive optimizations that will prevent stack overflow.\n\n     Optimizations will be performed in cases equivalent to following:\n\n     [1, [2, [3, .....].concat()].concat].concat()\n\n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n\n     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.\n     */\n    public static func concat<S: Sequence >(_ sequence: S) -> Observable<E>\n        where S.Iterator.Element == Observable<E> {\n            return Concat(sources: sequence, count: nil)\n    }\n\n    /**\n     Concatenates all observable sequences in the given collection, as long as the previous observable sequence terminated successfully.\n\n     This operator has tail recursive optimizations that will prevent stack overflow.\n\n     Optimizations will be performed in cases equivalent to following:\n\n     [1, [2, [3, .....].concat()].concat].concat()\n\n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n\n     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.\n     */\n    public static func concat<S: Collection >(_ collection: S) -> Observable<E>\n        where S.Iterator.Element == Observable<E> {\n            return Concat(sources: collection, count: Int64(collection.count))\n    }\n\n    /**\n     Concatenates all observable sequences in the given collection, as long as the previous observable sequence terminated successfully.\n\n     This operator has tail recursive optimizations that will prevent stack overflow.\n\n     Optimizations will be performed in cases equivalent to following:\n\n     [1, [2, [3, .....].concat()].concat].concat()\n\n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n\n     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.\n     */\n    public static func concat(_ sources: Observable<E> ...) -> Observable<E> {\n        return Concat(sources: sources, count: Int64(sources.count))\n    }\n}\n\nfinal fileprivate class ConcatSink<S: Sequence, O: ObserverType>\n    : TailRecursiveSink<S, O>\n    , ObserverType where S.Iterator.Element : ObservableConvertibleType, S.Iterator.Element.E == O.E {\n    typealias Element = O.E\n    \n    override init(observer: O, cancel: Cancelable) {\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>){\n        switch event {\n        case .next:\n            forwardOn(event)\n        case .error:\n            forwardOn(event)\n            dispose()\n        case .completed:\n            schedule(.moveNext)\n        }\n    }\n\n    override func subscribeToNext(_ source: Observable<E>) -> Disposable {\n        return source.subscribe(self)\n    }\n    \n    override func extract(_ observable: Observable<E>) -> SequenceGenerator? {\n        if let source = observable as? Concat<S> {\n            return (source._sources.makeIterator(), source._count)\n        }\n        else {\n            return nil\n        }\n    }\n}\n\nfinal fileprivate class Concat<S: Sequence> : Producer<S.Iterator.Element.E> where S.Iterator.Element : ObservableConvertibleType {\n    typealias Element = S.Iterator.Element.E\n    \n    fileprivate let _sources: S\n    fileprivate let _count: IntMax?\n\n    init(sources: S, count: IntMax?) {\n        _sources = sources\n        _count = count\n    }\n    \n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = ConcatSink<S, O>(observer: observer, cancel: cancel)\n        let subscription = sink.run((_sources.makeIterator(), _count))\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Create.swift",
    "content": "//\n//  Create.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/8/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    // MARK: create\n\n    /**\n     Creates an observable sequence from a specified subscribe method implementation.\n\n     - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html)\n\n     - parameter subscribe: Implementation of the resulting observable sequence's `subscribe` method.\n     - returns: The observable sequence with the specified implementation for the `subscribe` method.\n     */\n    public static func create(_ subscribe: @escaping (AnyObserver<E>) -> Disposable) -> Observable<E> {\n        return AnonymousObservable(subscribe)\n    }\n}\n\nfinal fileprivate class AnonymousObservableSink<O: ObserverType> : Sink<O>, ObserverType {\n    typealias E = O.E\n    typealias Parent = AnonymousObservable<E>\n\n    // state\n    private var _isStopped: AtomicInt = 0\n\n    #if DEBUG\n        fileprivate let _synchronizationTracker = SynchronizationTracker()\n    #endif\n\n    override init(observer: O, cancel: Cancelable) {\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func on(_ event: Event<E>) {\n        #if DEBUG\n            _synchronizationTracker.register(synchronizationErrorMessage: .default)\n            defer { _synchronizationTracker.unregister() }\n        #endif\n        switch event {\n        case .next:\n            if _isStopped == 1 {\n                return\n            }\n            forwardOn(event)\n        case .error, .completed:\n            if AtomicCompareAndSwap(0, 1, &_isStopped) {\n                forwardOn(event)\n                dispose()\n            }\n        }\n    }\n\n    func run(_ parent: Parent) -> Disposable {\n        return parent._subscribeHandler(AnyObserver(self))\n    }\n}\n\nfinal fileprivate class AnonymousObservable<Element> : Producer<Element> {\n    typealias SubscribeHandler = (AnyObserver<Element>) -> Disposable\n\n    let _subscribeHandler: SubscribeHandler\n\n    init(_ subscribeHandler: @escaping SubscribeHandler) {\n        _subscribeHandler = subscribeHandler\n    }\n\n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = AnonymousObservableSink(observer: observer, cancel: cancel)\n        let subscription = sink.run(self)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Debounce.swift",
    "content": "//\n//  Debounce.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 9/11/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Ignores elements from an observable sequence which are followed by another element within a specified relative time duration, using the specified scheduler to run throttling timers.\n\n     - seealso: [debounce operator on reactivex.io](http://reactivex.io/documentation/operators/debounce.html)\n\n     - parameter dueTime: Throttling duration for each element.\n     - parameter scheduler: Scheduler to run the throttle timers on.\n     - returns: The throttled sequence.\n     */\n    public func debounce(_ dueTime: RxTimeInterval, scheduler: SchedulerType)\n        -> Observable<E> {\n            return Debounce(source: self.asObservable(), dueTime: dueTime, scheduler: scheduler)\n    }\n}\n\nfinal fileprivate class DebounceSink<O: ObserverType>\n    : Sink<O>\n    , ObserverType\n    , LockOwnerType\n    , SynchronizedOnType {\n    typealias Element = O.E\n    typealias ParentType = Debounce<Element>\n\n    private let _parent: ParentType\n\n    let _lock = RecursiveLock()\n\n    // state\n    private var _id = 0 as UInt64\n    private var _value: Element? = nil\n\n    let cancellable = SerialDisposable()\n\n    init(parent: ParentType, observer: O, cancel: Cancelable) {\n        _parent = parent\n\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func run() -> Disposable {\n        let subscription = _parent._source.subscribe(self)\n\n        return Disposables.create(subscription, cancellable)\n    }\n\n    func on(_ event: Event<Element>) {\n        synchronizedOn(event)\n    }\n\n    func _synchronized_on(_ event: Event<Element>) {\n        switch event {\n        case .next(let element):\n            _id = _id &+ 1\n            let currentId = _id\n            _value = element\n\n\n            let scheduler = _parent._scheduler\n            let dueTime = _parent._dueTime\n\n            let d = SingleAssignmentDisposable()\n            self.cancellable.disposable = d\n            d.setDisposable(scheduler.scheduleRelative(currentId, dueTime: dueTime, action: self.propagate))\n        case .error:\n            _value = nil\n            forwardOn(event)\n            dispose()\n        case .completed:\n            if let value = _value {\n                _value = nil\n                forwardOn(.next(value))\n            }\n            forwardOn(.completed)\n            dispose()\n        }\n    }\n\n    func propagate(_ currentId: UInt64) -> Disposable {\n        _lock.lock(); defer { _lock.unlock() } // {\n        let originalValue = _value\n\n        if let value = originalValue, _id == currentId {\n            _value = nil\n            forwardOn(.next(value))\n        }\n        // }\n        return Disposables.create()\n    }\n}\n\nfinal fileprivate class Debounce<Element> : Producer<Element> {\n\n    fileprivate let _source: Observable<Element>\n    fileprivate let _dueTime: RxTimeInterval\n    fileprivate let _scheduler: SchedulerType\n\n    init(source: Observable<Element>, dueTime: RxTimeInterval, scheduler: SchedulerType) {\n        _source = source\n        _dueTime = dueTime\n        _scheduler = scheduler\n    }\n\n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = DebounceSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n    \n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Debug.swift",
    "content": "//\n//  Debug.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 5/2/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport struct Foundation.Date\nimport class Foundation.DateFormatter\n\nextension ObservableType {\n\n    /**\n     Prints received events for all observers on standard output.\n\n     - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html)\n\n     - parameter identifier: Identifier that is printed together with event description to standard output.\n     - parameter trimOutput: Should output be trimmed to max 40 characters.\n     - returns: An observable sequence whose events are printed to standard output.\n     */\n    public func debug(_ identifier: String? = nil, trimOutput: Bool = false, file: String = #file, line: UInt = #line, function: String = #function)\n        -> Observable<E> {\n            return Debug(source: self, identifier: identifier, trimOutput: trimOutput, file: file, line: line, function: function)\n    }\n}\n\nfileprivate let dateFormat = \"yyyy-MM-dd HH:mm:ss.SSS\"\n\nfileprivate func logEvent(_ identifier: String, dateFormat: DateFormatter, content: String) {\n    print(\"\\(dateFormat.string(from: Date())): \\(identifier) -> \\(content)\")\n}\n\nfinal fileprivate class DebugSink<Source: ObservableType, O: ObserverType> : Sink<O>, ObserverType where O.E == Source.E {\n    typealias Element = O.E\n    typealias Parent = Debug<Source>\n    \n    private let _parent: Parent\n    private let _timestampFormatter = DateFormatter()\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        _timestampFormatter.dateFormat = dateFormat\n\n        logEvent(_parent._identifier, dateFormat: _timestampFormatter, content: \"subscribed\")\n\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>) {\n        let maxEventTextLength = 40\n        let eventText = \"\\(event)\"\n\n        let eventNormalized = (eventText.count > maxEventTextLength) && _parent._trimOutput\n            ? String(eventText.prefix(maxEventTextLength / 2)) + \"...\" + String(eventText.suffix(maxEventTextLength / 2))\n            : eventText\n\n        logEvent(_parent._identifier, dateFormat: _timestampFormatter, content: \"Event \\(eventNormalized)\")\n\n        forwardOn(event)\n        if event.isStopEvent {\n            dispose()\n        }\n    }\n    \n    override func dispose() {\n        if !self.disposed {\n            logEvent(_parent._identifier, dateFormat: _timestampFormatter, content: \"isDisposed\")\n        }\n        super.dispose()\n    }\n}\n\nfinal fileprivate class Debug<Source: ObservableType> : Producer<Source.E> {\n    fileprivate let _identifier: String\n    fileprivate let _trimOutput: Bool\n    fileprivate let _source: Source\n\n    init(source: Source, identifier: String?, trimOutput: Bool, file: String, line: UInt, function: String) {\n        _trimOutput = trimOutput\n        if let identifier = identifier {\n            _identifier = identifier\n        }\n        else {\n            let trimmedFile: String\n            if let lastIndex = file.lastIndexOf(\"/\") {\n                trimmedFile = String(file[file.index(after: lastIndex) ..< file.endIndex])\n            }\n            else {\n                trimmedFile = file\n            }\n            _identifier = \"\\(trimmedFile):\\(line) (\\(function))\"\n        }\n        _source = source\n    }\n    \n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Source.E {\n        let sink = DebugSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = _source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/DefaultIfEmpty.swift",
    "content": "//\n//  DefaultIfEmpty.swift\n//  RxSwift\n//\n//  Created by sergdort on 23/12/2016.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Emits elements from the source observable sequence, or a default element if the source observable sequence is empty.\n\n     - seealso: [DefaultIfEmpty operator on reactivex.io](http://reactivex.io/documentation/operators/defaultifempty.html)\n\n     - parameter default: Default element to be sent if the source does not emit any elements\n     - returns: An observable sequence which emits default element end completes in case the original sequence is empty\n     */\n    public func ifEmpty(default: E) -> Observable<E> {\n        return DefaultIfEmpty(source: self.asObservable(), default: `default`)\n    }\n}\n\nfinal fileprivate class DefaultIfEmptySink<O: ObserverType>: Sink<O>, ObserverType {\n    typealias E = O.E\n    private let _default: E\n    private var _isEmpty = true\n    \n    init(default: E, observer: O, cancel: Cancelable) {\n        _default = `default`\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<E>) {\n        switch event {\n        case .next(_):\n            _isEmpty = false\n            forwardOn(event)\n        case .error(_):\n            forwardOn(event)\n            dispose()\n        case .completed:\n            if _isEmpty {\n                forwardOn(.next(_default))\n            }\n            forwardOn(.completed)\n            dispose()\n        }\n    }\n}\n\nfinal fileprivate class DefaultIfEmpty<SourceType>: Producer<SourceType> {\n    private let _source: Observable<SourceType>\n    private let _default: SourceType\n    \n    init(source: Observable<SourceType>, `default`: SourceType) {\n        _source = source\n        _default = `default`\n    }\n    \n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == SourceType {\n        let sink = DefaultIfEmptySink(default: _default, observer: observer, cancel: cancel)\n        let subscription = _source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Deferred.swift",
    "content": "//\n//  Deferred.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 4/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n\n     - seealso: [defer operator on reactivex.io](http://reactivex.io/documentation/operators/defer.html)\n\n     - parameter observableFactory: Observable factory function to invoke for each observer that subscribes to the resulting sequence.\n     - returns: An observable sequence whose observers trigger an invocation of the given observable factory function.\n     */\n    public static func deferred(_ observableFactory: @escaping () throws -> Observable<E>)\n        -> Observable<E> {\n        return Deferred(observableFactory: observableFactory)\n    }\n}\n\nfinal fileprivate class DeferredSink<S: ObservableType, O: ObserverType> : Sink<O>, ObserverType where S.E == O.E {\n    typealias E = O.E\n\n    private let _observableFactory: () throws -> S\n\n    init(observableFactory: @escaping () throws -> S, observer: O, cancel: Cancelable) {\n        _observableFactory = observableFactory\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        do {\n            let result = try _observableFactory()\n            return result.subscribe(self)\n        }\n        catch let e {\n            forwardOn(.error(e))\n            dispose()\n            return Disposables.create()\n        }\n    }\n    \n    func on(_ event: Event<E>) {\n        forwardOn(event)\n        \n        switch event {\n        case .next:\n            break\n        case .error:\n            dispose()\n        case .completed:\n            dispose()\n        }\n    }\n}\n\nfinal fileprivate class Deferred<S: ObservableType> : Producer<S.E> {\n    typealias Factory = () throws -> S\n    \n    private let _observableFactory : Factory\n    \n    init(observableFactory: @escaping Factory) {\n        _observableFactory = observableFactory\n    }\n    \n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == S.E {\n        let sink = DeferredSink(observableFactory: _observableFactory, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Delay.swift",
    "content": "//\n//  Delay.swift\n//  RxSwift\n//\n//  Created by tarunon on 2016/02/09.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport struct Foundation.Date\n\nextension ObservableType {\n\n    /**\n     Returns an observable sequence by the source observable sequence shifted forward in time by a specified delay. Error events from the source observable sequence are not delayed.\n\n     - seealso: [delay operator on reactivex.io](http://reactivex.io/documentation/operators/delay.html)\n\n     - parameter dueTime: Relative time shift of the source by.\n     - parameter scheduler: Scheduler to run the subscription delay timer on.\n     - returns: the source Observable shifted in time by the specified delay.\n     */\n    public func delay(_ dueTime: RxTimeInterval, scheduler: SchedulerType)\n        -> Observable<E> {\n            return Delay(source: self.asObservable(), dueTime: dueTime, scheduler: scheduler)\n    }\n}\n\nfinal fileprivate class DelaySink<O: ObserverType>\n    : Sink<O>\n    , ObserverType {\n    typealias E = O.E\n    typealias Source = Observable<E>\n    typealias DisposeKey = Bag<Disposable>.KeyType\n    \n    private let _lock = RecursiveLock()\n\n    private let _dueTime: RxTimeInterval\n    private let _scheduler: SchedulerType\n    \n    private let _sourceSubscription = SingleAssignmentDisposable()\n    private let _cancelable = SerialDisposable()\n\n    // is scheduled some action\n    private var _active = false\n    // is \"run loop\" on different scheduler running\n    private var _running = false\n    private var _errorEvent: Event<E>? = nil\n\n    // state\n    private var _queue = Queue<(eventTime: RxTime, event: Event<E>)>(capacity: 0)\n    private var _disposed = false\n    \n    init(observer: O, dueTime: RxTimeInterval, scheduler: SchedulerType, cancel: Cancelable) {\n        _dueTime = dueTime\n        _scheduler = scheduler\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    // All of these complications in this method are caused by the fact that \n    // error should be propagated immediately. Error can be potentially received on different\n    // scheduler so this process needs to be synchronized somehow.\n    //\n    // Another complication is that scheduler is potentially concurrent so internal queue is used.\n    func drainQueue(state: (), scheduler: AnyRecursiveScheduler<()>) {\n\n        _lock.lock()    // {\n            let hasFailed = _errorEvent != nil\n            if !hasFailed {\n                _running = true\n            }\n        _lock.unlock()  // }\n\n        if hasFailed {\n            return\n        }\n\n        var ranAtLeastOnce = false\n\n        while true {\n            _lock.lock() // {\n                let errorEvent = _errorEvent\n\n                let eventToForwardImmediatelly = ranAtLeastOnce ? nil : _queue.dequeue()?.event\n                let nextEventToScheduleOriginalTime: Date? = ranAtLeastOnce && !_queue.isEmpty ? _queue.peek().eventTime : nil\n\n                if let _ = errorEvent {\n                }\n                else  {\n                    if let _ = eventToForwardImmediatelly {\n                    }\n                    else if let _ = nextEventToScheduleOriginalTime {\n                        _running = false\n                    }\n                    else {\n                        _running = false\n                        _active = false\n                    }\n                }\n            _lock.unlock() // {\n\n            if let errorEvent = errorEvent {\n                self.forwardOn(errorEvent)\n                self.dispose()\n                return\n            }\n            else {\n                if let eventToForwardImmediatelly = eventToForwardImmediatelly {\n                    ranAtLeastOnce = true\n                    self.forwardOn(eventToForwardImmediatelly)\n                    if case .completed = eventToForwardImmediatelly {\n                        self.dispose()\n                        return\n                    }\n                }\n                else if let nextEventToScheduleOriginalTime = nextEventToScheduleOriginalTime {\n                    let elapsedTime = _scheduler.now.timeIntervalSince(nextEventToScheduleOriginalTime)\n                    let interval = _dueTime - elapsedTime\n                    let normalizedInterval = interval < 0.0 ? 0.0 : interval\n                    scheduler.schedule((), dueTime: normalizedInterval)\n                    return\n                }\n                else {\n                    return\n                }\n            }\n        }\n    }\n    \n    func on(_ event: Event<E>) {\n        if event.isStopEvent {\n            _sourceSubscription.dispose()\n        }\n\n        switch event {\n        case .error(_):\n            _lock.lock()    // {\n                let shouldSendImmediatelly = !_running\n                _queue = Queue(capacity: 0)\n                _errorEvent = event\n            _lock.unlock()  // }\n\n            if shouldSendImmediatelly {\n                forwardOn(event)\n                dispose()\n            }\n        default:\n            _lock.lock()    // {\n                let shouldSchedule = !_active\n                _active = true\n                _queue.enqueue((_scheduler.now, event))\n            _lock.unlock()  // }\n\n            if shouldSchedule {\n                _cancelable.disposable = _scheduler.scheduleRecursive((), dueTime: _dueTime, action: self.drainQueue)\n            }\n        }\n    }\n    \n    func run(source: Observable<E>) -> Disposable {\n        _sourceSubscription.setDisposable(source.subscribe(self))\n        return Disposables.create(_sourceSubscription, _cancelable)\n    }\n}\n\nfinal fileprivate class Delay<Element>: Producer<Element> {\n    private let _source: Observable<Element>\n    private let _dueTime: RxTimeInterval\n    private let _scheduler: SchedulerType\n    \n    init(source: Observable<Element>, dueTime: RxTimeInterval, scheduler: SchedulerType) {\n        _source = source\n        _dueTime = dueTime\n        _scheduler = scheduler\n    }\n\n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = DelaySink(observer: observer, dueTime: _dueTime, scheduler: _scheduler, cancel: cancel)\n        let subscription = sink.run(source: _source)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/DelaySubscription.swift",
    "content": "//\n//  DelaySubscription.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 6/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Time shifts the observable sequence by delaying the subscription with the specified relative time duration, using the specified scheduler to run timers.\n\n     - seealso: [delay operator on reactivex.io](http://reactivex.io/documentation/operators/delay.html)\n\n     - parameter dueTime: Relative time shift of the subscription.\n     - parameter scheduler: Scheduler to run the subscription delay timer on.\n     - returns: Time-shifted sequence.\n     */\n    public func delaySubscription(_ dueTime: RxTimeInterval, scheduler: SchedulerType)\n        -> Observable<E> {\n        return DelaySubscription(source: self.asObservable(), dueTime: dueTime, scheduler: scheduler)\n    }\n}\n\nfinal fileprivate class DelaySubscriptionSink<O: ObserverType>\n    : Sink<O>, ObserverType {\n    typealias E = O.E\n    typealias Parent = DelaySubscription<E>\n    \n    private let _parent: Parent\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<E>) {\n        forwardOn(event)\n        if event.isStopEvent {\n            dispose()\n        }\n    }\n    \n}\n\nfinal fileprivate class DelaySubscription<Element>: Producer<Element> {\n    private let _source: Observable<Element>\n    private let _dueTime: RxTimeInterval\n    private let _scheduler: SchedulerType\n    \n    init(source: Observable<Element>, dueTime: RxTimeInterval, scheduler: SchedulerType) {\n        _source = source\n        _dueTime = dueTime\n        _scheduler = scheduler\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = DelaySubscriptionSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = _scheduler.scheduleRelative((), dueTime: _dueTime) { _ in\n            return self._source.subscribe(sink)\n        }\n\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Dematerialize.swift",
    "content": "//\n//  Dematerialize.swift\n//  RxSwift\n//\n//  Created by Jamie Pinkham on 3/13/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType where E: EventConvertible {\n    /**\n     Convert any previously materialized Observable into it's original form.\n     - seealso: [materialize operator on reactivex.io](http://reactivex.io/documentation/operators/materialize-dematerialize.html)\n     - returns: The dematerialized observable sequence.\n     */\n    public func dematerialize() -> Observable<E.ElementType> {\n        return Dematerialize(source: self.asObservable())\n    }\n\n}\n\nfileprivate final class DematerializeSink<Element: EventConvertible, O: ObserverType>: Sink<O>, ObserverType where O.E == Element.ElementType {\n    fileprivate func on(_ event: Event<Element>) {\n        switch event {\n        case .next(let element):\n            forwardOn(element.event)\n            if element.event.isStopEvent {\n                dispose()\n            }\n        case .completed:\n            forwardOn(.completed)\n            dispose()\n        case .error(let error):\n            forwardOn(.error(error))\n            dispose()\n        }\n    }\n}\n\nfinal fileprivate class Dematerialize<Element: EventConvertible>: Producer<Element.ElementType>  {\n    private let _source: Observable<Element>\n    \n    init(source: Observable<Element>) {\n        _source = source\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element.ElementType {\n        let sink = DematerializeSink<Element, O>(observer: observer, cancel: cancel)\n        let subscription = _source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/DistinctUntilChanged.swift",
    "content": "//\n//  DistinctUntilChanged.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/15/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType where E: Equatable {\n\n    /**\n     Returns an observable sequence that contains only distinct contiguous elements according to equality operator.\n\n     - seealso: [distinct operator on reactivex.io](http://reactivex.io/documentation/operators/distinct.html)\n\n     - returns: An observable sequence only containing the distinct contiguous elements, based on equality operator, from the source sequence.\n     */\n    public func distinctUntilChanged()\n        -> Observable<E> {\n            return self.distinctUntilChanged({ $0 }, comparer: { ($0 == $1) })\n    }\n}\n\nextension ObservableType {\n    /**\n     Returns an observable sequence that contains only distinct contiguous elements according to the `keySelector`.\n\n     - seealso: [distinct operator on reactivex.io](http://reactivex.io/documentation/operators/distinct.html)\n\n     - parameter keySelector: A function to compute the comparison key for each element.\n     - returns: An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n     */\n    public func distinctUntilChanged<K: Equatable>(_ keySelector: @escaping (E) throws -> K)\n        -> Observable<E> {\n            return self.distinctUntilChanged(keySelector, comparer: { $0 == $1 })\n    }\n\n    /**\n     Returns an observable sequence that contains only distinct contiguous elements according to the `comparer`.\n\n     - seealso: [distinct operator on reactivex.io](http://reactivex.io/documentation/operators/distinct.html)\n\n     - parameter comparer: Equality comparer for computed key values.\n     - returns: An observable sequence only containing the distinct contiguous elements, based on `comparer`, from the source sequence.\n     */\n    public func distinctUntilChanged(_ comparer: @escaping (E, E) throws -> Bool)\n        -> Observable<E> {\n            return self.distinctUntilChanged({ $0 }, comparer: comparer)\n    }\n\n    /**\n     Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer.\n\n     - seealso: [distinct operator on reactivex.io](http://reactivex.io/documentation/operators/distinct.html)\n\n     - parameter keySelector: A function to compute the comparison key for each element.\n     - parameter comparer: Equality comparer for computed key values.\n     - returns: An observable sequence only containing the distinct contiguous elements, based on a computed key value and the comparer, from the source sequence.\n     */\n    public func distinctUntilChanged<K>(_ keySelector: @escaping (E) throws -> K, comparer: @escaping (K, K) throws -> Bool)\n        -> Observable<E> {\n            return DistinctUntilChanged(source: self.asObservable(), selector: keySelector, comparer: comparer)\n    }\n}\n\nfinal fileprivate class DistinctUntilChangedSink<O: ObserverType, Key>: Sink<O>, ObserverType {\n    typealias E = O.E\n    \n    private let _parent: DistinctUntilChanged<E, Key>\n    private var _currentKey: Key? = nil\n    \n    init(parent: DistinctUntilChanged<E, Key>, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<E>) {\n        switch event {\n        case .next(let value):\n            do {\n                let key = try _parent._selector(value)\n                var areEqual = false\n                if let currentKey = _currentKey {\n                    areEqual = try _parent._comparer(currentKey, key)\n                }\n                \n                if areEqual {\n                    return\n                }\n                \n                _currentKey = key\n                \n                forwardOn(event)\n            }\n            catch let error {\n                forwardOn(.error(error))\n                dispose()\n            }\n        case .error, .completed:\n            forwardOn(event)\n            dispose()\n        }\n    }\n}\n\nfinal fileprivate class DistinctUntilChanged<Element, Key>: Producer<Element> {\n    typealias KeySelector = (Element) throws -> Key\n    typealias EqualityComparer = (Key, Key) throws -> Bool\n    \n    fileprivate let _source: Observable<Element>\n    fileprivate let _selector: KeySelector\n    fileprivate let _comparer: EqualityComparer\n    \n    init(source: Observable<Element>, selector: @escaping KeySelector, comparer: @escaping EqualityComparer) {\n        _source = source\n        _selector = selector\n        _comparer = comparer\n    }\n    \n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = DistinctUntilChangedSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = _source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Do.swift",
    "content": "//\n//  Do.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Invokes an action for each event in the observable sequence, and propagates all observer messages through the result sequence.\n\n     - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html)\n\n     - parameter onNext: Action to invoke for each element in the observable sequence.\n     - parameter onError: Action to invoke upon errored termination of the observable sequence.\n     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.\n     - parameter onSubscribe: Action to invoke before subscribing to source observable sequence.\n     - parameter onSubscribed: Action to invoke after subscribing to source observable sequence.\n     - parameter onDispose: Action to invoke after subscription to source observable has been disposed for any reason. It can be either because sequence terminates for some reason or observer subscription being disposed.\n     - returns: The source sequence with the side-effecting behavior applied.\n     */\n    public func `do`(onNext: ((E) throws -> Void)? = nil, onError: ((Swift.Error) throws -> Void)? = nil, onCompleted: (() throws -> Void)? = nil, onSubscribe: (() -> ())? = nil, onSubscribed: (() -> ())? = nil, onDispose: (() -> ())? = nil)\n        -> Observable<E> {\n            return Do(source: self.asObservable(), eventHandler: { e in\n                switch e {\n                case .next(let element):\n                    try onNext?(element)\n                case .error(let e):\n                    try onError?(e)\n                case .completed:\n                    try onCompleted?()\n                }\n            }, onSubscribe: onSubscribe, onSubscribed: onSubscribed, onDispose: onDispose)\n    }\n}\n\nfinal fileprivate class DoSink<O: ObserverType> : Sink<O>, ObserverType {\n    typealias Element = O.E\n    typealias EventHandler = (Event<Element>) throws -> Void\n    \n    private let _eventHandler: EventHandler\n    \n    init(eventHandler: @escaping EventHandler, observer: O, cancel: Cancelable) {\n        _eventHandler = eventHandler\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>) {\n        do {\n            try _eventHandler(event)\n            forwardOn(event)\n            if event.isStopEvent {\n                dispose()\n            }\n        }\n        catch let error {\n            forwardOn(.error(error))\n            dispose()\n        }\n    }\n}\n\nfinal fileprivate class Do<Element> : Producer<Element> {\n    typealias EventHandler = (Event<Element>) throws -> Void\n    \n    fileprivate let _source: Observable<Element>\n    fileprivate let _eventHandler: EventHandler\n    fileprivate let _onSubscribe: (() -> ())?\n    fileprivate let _onSubscribed: (() -> ())?\n    fileprivate let _onDispose: (() -> ())?\n    \n    init(source: Observable<Element>, eventHandler: @escaping EventHandler, onSubscribe: (() -> ())?, onSubscribed: (() -> ())?, onDispose: (() -> ())?) {\n        _source = source\n        _eventHandler = eventHandler\n        _onSubscribe = onSubscribe\n        _onSubscribed = onSubscribed\n        _onDispose = onDispose\n    }\n    \n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        _onSubscribe?()\n        let sink = DoSink(eventHandler: _eventHandler, observer: observer, cancel: cancel)\n        let subscription = _source.subscribe(sink)\n        _onSubscribed?()\n        let onDispose = _onDispose\n        let allSubscriptions = Disposables.create {\n            subscription.dispose()\n            onDispose?()\n        }\n        return (sink: sink, subscription: allSubscriptions)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/ElementAt.swift",
    "content": "//\n//  ElementAt.swift\n//  RxSwift\n//\n//  Created by Junior B. on 21/10/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Returns a sequence emitting only element _n_ emitted by an Observable\n\n     - seealso: [elementAt operator on reactivex.io](http://reactivex.io/documentation/operators/elementat.html)\n\n     - parameter index: The index of the required element (starting from 0).\n     - returns: An observable sequence that emits the desired element as its own sole emission.\n     */\n    public func elementAt(_ index: Int)\n        -> Observable<E> {\n        return ElementAt(source: asObservable(), index: index, throwOnEmpty: true)\n    }\n}\n\nfinal fileprivate class ElementAtSink<O: ObserverType> : Sink<O>, ObserverType {\n    typealias SourceType = O.E\n    typealias Parent = ElementAt<SourceType>\n    \n    let _parent: Parent\n    var _i: Int\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        _i = parent._index\n        \n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<SourceType>) {\n        switch event {\n        case .next(_):\n\n            if (_i == 0) {\n                forwardOn(event)\n                forwardOn(.completed)\n                self.dispose()\n            }\n            \n            do {\n                let _ = try decrementChecked(&_i)\n            } catch(let e) {\n                forwardOn(.error(e))\n                dispose()\n                return\n            }\n            \n        case .error(let e):\n            forwardOn(.error(e))\n            self.dispose()\n        case .completed:\n            if (_parent._throwOnEmpty) {\n                forwardOn(.error(RxError.argumentOutOfRange))\n            } else {\n                forwardOn(.completed)\n            }\n            \n            self.dispose()\n        }\n    }\n}\n\nfinal fileprivate class ElementAt<SourceType> : Producer<SourceType> {\n    \n    let _source: Observable<SourceType>\n    let _throwOnEmpty: Bool\n    let _index: Int\n    \n    init(source: Observable<SourceType>, index: Int, throwOnEmpty: Bool) {\n        if index < 0 {\n            rxFatalError(\"index can't be negative\")\n        }\n\n        self._source = source\n        self._index = index\n        self._throwOnEmpty = throwOnEmpty\n    }\n    \n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == SourceType {\n        let sink = ElementAtSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = _source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Empty.swift",
    "content": "//\n//  Empty.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 8/30/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Returns an empty observable sequence, using the specified scheduler to send out the single `Completed` message.\n\n     - seealso: [empty operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)\n\n     - returns: An observable sequence with no elements.\n     */\n    public static func empty() -> Observable<E> {\n        return EmptyProducer<E>()\n    }\n}\n\nfinal fileprivate class EmptyProducer<Element> : Producer<Element> {\n    override func subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == Element {\n        observer.on(.completed)\n        return Disposables.create()\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Enumerated.swift",
    "content": "//\n//  Enumerated.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 8/6/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Enumerates the elements of an observable sequence.\n\n     - seealso: [map operator on reactivex.io](http://reactivex.io/documentation/operators/map.html)\n\n     - returns: An observable sequence that contains tuples of source sequence elements and their indexes.\n     */\n    public func enumerated()\n        -> Observable<(index: Int, element: E)> {\n        return Enumerated(source: self.asObservable())\n    }\n}\n\nfinal fileprivate class EnumeratedSink<Element, O : ObserverType>: Sink<O>, ObserverType where O.E == (index: Int, element: Element) {\n    typealias E = Element\n    var index = 0\n    \n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next(let value):\n            do {\n                let nextIndex = try incrementChecked(&index)\n                let next = (index: nextIndex, element: value)\n                forwardOn(.next(next))\n            }\n            catch let e {\n                forwardOn(.error(e))\n                dispose()\n            }\n        case .completed:\n            forwardOn(.completed)\n            dispose()\n        case .error(let error):\n            forwardOn(.error(error))\n            dispose()\n        }\n    }\n}\n\nfinal fileprivate class Enumerated<Element> : Producer<(index: Int, element: Element)> {\n    private let _source: Observable<Element>\n\n    init(source: Observable<Element>) {\n        _source = source\n    }\n\n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == (index: Int, element: Element) {\n        let sink = EnumeratedSink<Element, O>(observer: observer, cancel: cancel)\n        let subscription = _source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Error.swift",
    "content": "//\n//  Error.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 8/30/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Returns an observable sequence that terminates with an `error`.\n\n     - seealso: [throw operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)\n\n     - returns: The observable sequence that terminates with specified error.\n     */\n    public static func error(_ error: Swift.Error) -> Observable<E> {\n        return ErrorProducer(error: error)\n    }\n}\n\nfinal fileprivate class ErrorProducer<Element> : Producer<Element> {\n    private let _error: Swift.Error\n    \n    init(error: Swift.Error) {\n        _error = error\n    }\n    \n    override func subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == Element {\n        observer.on(.error(_error))\n        return Disposables.create()\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Filter.swift",
    "content": "//\n//  Filter.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/17/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Filters the elements of an observable sequence based on a predicate.\n\n     - seealso: [filter operator on reactivex.io](http://reactivex.io/documentation/operators/filter.html)\n\n     - parameter predicate: A function to test each source element for a condition.\n     - returns: An observable sequence that contains elements from the input sequence that satisfy the condition.\n     */\n    public func filter(_ predicate: @escaping (E) throws -> Bool)\n        -> Observable<E> {\n        return Filter(source: asObservable(), predicate: predicate)\n    }\n}\n\nextension ObservableType {\n\n    /**\n     Skips elements and completes (or errors) when the receiver completes (or errors). Equivalent to filter that always returns false.\n\n     - seealso: [ignoreElements operator on reactivex.io](http://reactivex.io/documentation/operators/ignoreelements.html)\n\n     - returns: An observable sequence that skips all elements of the source sequence.\n     */\n    public func ignoreElements()\n        -> Completable {\n            return flatMap { _ in\n                return Observable<Never>.empty()\n            }\n            .asCompletable()\n    }\n}\n\nfinal fileprivate class FilterSink<O : ObserverType>: Sink<O>, ObserverType {\n    typealias Predicate = (Element) throws -> Bool\n    typealias Element = O.E\n    \n    private let _predicate: Predicate\n    \n    init(predicate: @escaping Predicate, observer: O, cancel: Cancelable) {\n        _predicate = predicate\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>) {\n        switch event {\n            case .next(let value):\n                do {\n                    let satisfies = try _predicate(value)\n                    if satisfies {\n                        forwardOn(.next(value))\n                    }\n                }\n                catch let e {\n                    forwardOn(.error(e))\n                    dispose()\n                }\n            case .completed, .error:\n                forwardOn(event)\n                dispose()\n        }\n    }\n}\n\nfinal fileprivate class Filter<Element> : Producer<Element> {\n    typealias Predicate = (Element) throws -> Bool\n    \n    private let _source: Observable<Element>\n    private let _predicate: Predicate\n    \n    init(source: Observable<Element>, predicate: @escaping Predicate) {\n        _source = source\n        _predicate = predicate\n    }\n    \n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = FilterSink(predicate: _predicate, observer: observer, cancel: cancel)\n        let subscription = _source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/First.swift",
    "content": "//\n//  First.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 7/31/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nfileprivate final class FirstSink<Element, O: ObserverType> : Sink<O>, ObserverType where O.E == Element? {\n    typealias E = Element\n    typealias Parent = First<E>\n\n    func on(_ event: Event<E>) {\n        switch event {\n        case .next(let value):\n            forwardOn(.next(value))\n            forwardOn(.completed)\n            dispose()\n        case .error(let error):\n            forwardOn(.error(error))\n            dispose()\n        case .completed:\n            forwardOn(.next(nil))\n            forwardOn(.completed)\n            dispose()\n        }\n    }\n}\n\nfinal class First<Element>: Producer<Element?> {\n    fileprivate let _source: Observable<Element>\n\n    init(source: Observable<Element>) {\n        _source = source\n    }\n\n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element? {\n        let sink = FirstSink(observer: observer, cancel: cancel)\n        let subscription = _source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Generate.swift",
    "content": "//\n//  Generate.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 9/2/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler\n     to run the loop send out observer messages.\n\n     - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html)\n\n     - parameter initialState: Initial state.\n     - parameter condition: Condition to terminate generation (upon returning `false`).\n     - parameter iterate: Iteration step function.\n     - parameter scheduler: Scheduler on which to run the generator loop.\n     - returns: The generated sequence.\n     */\n    public static func generate(initialState: E, condition: @escaping (E) throws -> Bool, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance, iterate: @escaping (E) throws -> E) -> Observable<E> {\n        return Generate(initialState: initialState, condition: condition, iterate: iterate, resultSelector: { $0 }, scheduler: scheduler)\n    }\n}\n\nfinal fileprivate class GenerateSink<S, O: ObserverType> : Sink<O> {\n    typealias Parent = Generate<S, O.E>\n    \n    private let _parent: Parent\n    \n    private var _state: S\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        _state = parent._initialState\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        return _parent._scheduler.scheduleRecursive(true) { (isFirst, recurse) -> Void in\n            do {\n                if !isFirst {\n                    self._state = try self._parent._iterate(self._state)\n                }\n                \n                if try self._parent._condition(self._state) {\n                    let result = try self._parent._resultSelector(self._state)\n                    self.forwardOn(.next(result))\n                    \n                    recurse(false)\n                }\n                else {\n                    self.forwardOn(.completed)\n                    self.dispose()\n                }\n            }\n            catch let error {\n                self.forwardOn(.error(error))\n                self.dispose()\n            }\n        }\n    }\n}\n\nfinal fileprivate class Generate<S, E> : Producer<E> {\n    fileprivate let _initialState: S\n    fileprivate let _condition: (S) throws -> Bool\n    fileprivate let _iterate: (S) throws -> S\n    fileprivate let _resultSelector: (S) throws -> E\n    fileprivate let _scheduler: ImmediateSchedulerType\n    \n    init(initialState: S, condition: @escaping (S) throws -> Bool, iterate: @escaping (S) throws -> S, resultSelector: @escaping (S) throws -> E, scheduler: ImmediateSchedulerType) {\n        _initialState = initialState\n        _condition = condition\n        _iterate = iterate\n        _resultSelector = resultSelector\n        _scheduler = scheduler\n        super.init()\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {\n        let sink = GenerateSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/GroupBy.swift",
    "content": "//\n//  GroupBy.swift\n//  RxSwift\n//\n//  Created by Tomi Koskinen on 01/12/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /*\n     Groups the elements of an observable sequence according to a specified key selector function.\n\n     - seealso: [groupBy operator on reactivex.io](http://reactivex.io/documentation/operators/groupby.html)\n\n     - parameter keySelector: A function to extract the key for each element.\n     - returns: A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n     */\n    public func groupBy<K: Hashable>(keySelector: @escaping (E) throws -> K)\n        -> Observable<GroupedObservable<K,E>> {\n        return GroupBy(source: self.asObservable(), selector: keySelector)\n    }\n}\n\nfinal fileprivate class GroupedObservableImpl<Key, Element> : Observable<Element> {\n    private var _subject: PublishSubject<Element>\n    private var _refCount: RefCountDisposable\n    \n    init(key: Key, subject: PublishSubject<Element>, refCount: RefCountDisposable) {\n        _subject = subject\n        _refCount = refCount\n    }\n\n    override public func subscribe<O: ObserverType>(_ observer: O) -> Disposable where O.E == E {\n        let release = _refCount.retain()\n        let subscription = _subject.subscribe(observer)\n        return Disposables.create(release, subscription)\n    }\n}\n\n\nfinal fileprivate class GroupBySink<Key: Hashable, Element, O: ObserverType>\n    : Sink<O>\n    , ObserverType where O.E == GroupedObservable<Key, Element> {\n    typealias E = Element\n    typealias ResultType = O.E\n    typealias Parent = GroupBy<Key, Element>\n\n    private let _parent: Parent\n    private let _subscription = SingleAssignmentDisposable()\n    private var _refCountDisposable: RefCountDisposable!\n    private var _groupedSubjectTable: [Key: PublishSubject<Element>]\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        _groupedSubjectTable = [Key: PublishSubject<Element>]()\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        _refCountDisposable = RefCountDisposable(disposable: _subscription)\n        \n        _subscription.setDisposable(_parent._source.subscribe(self))\n        \n        return _refCountDisposable\n    }\n    \n    private func onGroupEvent(key: Key, value: Element) {\n        if let writer = _groupedSubjectTable[key] {\n            writer.on(.next(value))\n        } else {\n            let writer = PublishSubject<Element>()\n            _groupedSubjectTable[key] = writer\n            \n            let group = GroupedObservable(\n                key: key,\n                source: GroupedObservableImpl(key: key, subject: writer, refCount: _refCountDisposable)\n            )\n            \n            forwardOn(.next(group))\n            writer.on(.next(value))\n        }\n    }\n\n    final func on(_ event: Event<Element>) {\n        switch event {\n        case let .next(value):\n            do {\n                let groupKey = try _parent._selector(value)\n                onGroupEvent(key: groupKey, value: value)\n            }\n            catch let e {\n                error(e)\n                return\n            }\n        case let .error(e):\n            error(e)\n        case .completed:\n            forwardOnGroups(event: .completed)\n            forwardOn(.completed)\n            _subscription.dispose()\n            dispose()\n        }\n    }\n\n    final func error(_ error: Swift.Error) {\n        forwardOnGroups(event: .error(error))\n        forwardOn(.error(error))\n        _subscription.dispose()\n        dispose()\n    }\n    \n    final func forwardOnGroups(event: Event<Element>) {\n        for writer in _groupedSubjectTable.values {\n            writer.on(event)\n        }\n    }\n}\n\nfinal fileprivate class GroupBy<Key: Hashable, Element>: Producer<GroupedObservable<Key,Element>> {\n    typealias KeySelector = (Element) throws -> Key\n\n    fileprivate let _source: Observable<Element>\n    fileprivate let _selector: KeySelector\n    \n    init(source: Observable<Element>, selector: @escaping KeySelector) {\n        _source = source\n        _selector = selector\n    }\n\n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == GroupedObservable<Key,Element> {\n        let sink = GroupBySink(parent: self, observer: observer, cancel: cancel)\n        return (sink: sink, subscription: sink.run())\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Just.swift",
    "content": "//\n//  Just.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 8/30/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Returns an observable sequence that contains a single element.\n\n     - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html)\n\n     - parameter element: Single element in the resulting observable sequence.\n     - returns: An observable sequence containing the single specified element.\n     */\n    public static func just(_ element: E) -> Observable<E> {\n        return Just(element: element)\n    }\n\n    /**\n     Returns an observable sequence that contains a single element.\n\n     - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html)\n\n     - parameter element: Single element in the resulting observable sequence.\n     - parameter: Scheduler to send the single element on.\n     - returns: An observable sequence containing the single specified element.\n     */\n    public static func just(_ element: E, scheduler: ImmediateSchedulerType) -> Observable<E> {\n        return JustScheduled(element: element, scheduler: scheduler)\n    }\n}\n\nfinal fileprivate class JustScheduledSink<O: ObserverType> : Sink<O> {\n    typealias Parent = JustScheduled<O.E>\n\n    private let _parent: Parent\n\n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func run() -> Disposable {\n        let scheduler = _parent._scheduler\n        return scheduler.schedule(_parent._element) { element in\n            self.forwardOn(.next(element))\n            return scheduler.schedule(()) { _ in\n                self.forwardOn(.completed)\n                self.dispose()\n                return Disposables.create()\n            }\n        }\n    }\n}\n\nfinal fileprivate class JustScheduled<Element> : Producer<Element> {\n    fileprivate let _scheduler: ImmediateSchedulerType\n    fileprivate let _element: Element\n\n    init(element: Element, scheduler: ImmediateSchedulerType) {\n        _scheduler = scheduler\n        _element = element\n    }\n\n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {\n        let sink = JustScheduledSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\nfinal fileprivate class Just<Element> : Producer<Element> {\n    private let _element: Element\n    \n    init(element: Element) {\n        _element = element\n    }\n    \n    override func subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == Element {\n        observer.on(.next(_element))\n        observer.on(.completed)\n        return Disposables.create()\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Map.swift",
    "content": "//\n//  Map.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/15/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Projects each element of an observable sequence into a new form.\n\n     - seealso: [map operator on reactivex.io](http://reactivex.io/documentation/operators/map.html)\n\n     - parameter transform: A transform function to apply to each source element.\n     - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source.\n\n     */\n    public func map<R>(_ transform: @escaping (E) throws -> R)\n        -> Observable<R> {\n        return self.asObservable().composeMap(transform)\n    }\n}\n\nfinal fileprivate class MapSink<SourceType, O : ObserverType> : Sink<O>, ObserverType {\n    typealias Transform = (SourceType) throws -> ResultType\n\n    typealias ResultType = O.E\n    typealias Element = SourceType\n\n    private let _transform: Transform\n    \n    init(transform: @escaping Transform, observer: O, cancel: Cancelable) {\n        _transform = transform\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func on(_ event: Event<SourceType>) {\n        switch event {\n        case .next(let element):\n            do {\n                let mappedElement = try _transform(element)\n                forwardOn(.next(mappedElement))\n            }\n            catch let e {\n                forwardOn(.error(e))\n                dispose()\n            }\n        case .error(let error):\n            forwardOn(.error(error))\n            dispose()\n        case .completed:\n            forwardOn(.completed)\n            dispose()\n        }\n    }\n}\n\n#if TRACE_RESOURCES\n    fileprivate var _numberOfMapOperators: AtomicInt = 0\n    extension Resources {\n        public static var numberOfMapOperators: Int32 {\n            return _numberOfMapOperators.valueSnapshot()\n        }\n    }\n#endif\n\ninternal func _map<Element, R>(source: Observable<Element>, transform: @escaping (Element) throws -> R) -> Observable<R> {\n    return Map(source: source, transform: transform)\n}\n\nfinal fileprivate class Map<SourceType, ResultType>: Producer<ResultType> {\n    typealias Transform = (SourceType) throws -> ResultType\n\n    private let _source: Observable<SourceType>\n\n    private let _transform: Transform\n\n    init(source: Observable<SourceType>, transform: @escaping Transform) {\n        _source = source\n        _transform = transform\n\n#if TRACE_RESOURCES\n        let _ = AtomicIncrement(&_numberOfMapOperators)\n#endif\n    }\n\n    override func composeMap<R>(_ selector: @escaping (ResultType) throws -> R) -> Observable<R> {\n        let originalSelector = _transform\n        return Map<SourceType, R>(source: _source, transform: { (s: SourceType) throws -> R in\n            let r: ResultType = try originalSelector(s)\n            return try selector(r)\n        })\n    }\n    \n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == ResultType {\n        let sink = MapSink(transform: _transform, observer: observer, cancel: cancel)\n        let subscription = _source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n\n    #if TRACE_RESOURCES\n    deinit {\n        let _ = AtomicDecrement(&_numberOfMapOperators)\n    }\n    #endif\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Materialize.swift",
    "content": "//\n//  Materialize.swift\n//  RxSwift\n//\n//  Created by sergdort on 08/03/2017.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Convert any Observable into an Observable of its events.\n     - seealso: [materialize operator on reactivex.io](http://reactivex.io/documentation/operators/materialize-dematerialize.html)\n     - returns: An observable sequence that wraps events in an Event<E>. The returned Observable never errors, but it does complete after observing all of the events of the underlying Observable.\n     */\n    public func materialize() -> Observable<Event<E>> {\n        return Materialize(source: self.asObservable())\n    }\n}\n\nfileprivate final class MaterializeSink<Element, O: ObserverType>: Sink<O>, ObserverType where O.E == Event<Element> {\n    \n    func on(_ event: Event<Element>) {\n        forwardOn(.next(event))\n        if event.isStopEvent {\n            forwardOn(.completed)\n            dispose()\n        }\n    }\n}\n\nfinal fileprivate class Materialize<Element>: Producer<Event<Element>> {\n    private let _source: Observable<Element>\n    \n    init(source: Observable<Element>) {\n        _source = source\n    }\n\n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {\n        let sink = MaterializeSink(observer: observer, cancel: cancel)\n        let subscription = _source.subscribe(sink)\n\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Merge.swift",
    "content": "//\n//  Merge.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/28/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n\n     - seealso: [flatMap operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html)\n\n     - parameter selector: A transform function to apply to each element.\n     - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.\n     */\n    public func flatMap<O: ObservableConvertibleType>(_ selector: @escaping (E) throws -> O)\n        -> Observable<O.E> {\n            return FlatMap(source: asObservable(), selector: selector)\n    }\n\n}\n\nextension ObservableType {\n\n    /**\n     Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n     If element is received while there is some projected observable sequence being merged it will simply be ignored.\n\n     - seealso: [flatMapFirst operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html)\n\n     - parameter selector: A transform function to apply to element that was observed while no observable is executing in parallel.\n     - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence that was received while no other sequence was being calculated.\n     */\n    public func flatMapFirst<O: ObservableConvertibleType>(_ selector: @escaping (E) throws -> O)\n        -> Observable<O.E> {\n            return FlatMapFirst(source: asObservable(), selector: selector)\n    }\n}\n\nextension ObservableType where E : ObservableConvertibleType {\n\n    /**\n     Merges elements from all observable sequences in the given enumerable sequence into a single observable sequence.\n\n     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)\n\n     - returns: The observable sequence that merges the elements of the observable sequences.\n     */\n    public func merge() -> Observable<E.E> {\n        return Merge(source: asObservable())\n    }\n\n    /**\n     Merges elements from all inner observable sequences into a single observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n\n     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)\n\n     - parameter maxConcurrent: Maximum number of inner observable sequences being subscribed to concurrently.\n     - returns: The observable sequence that merges the elements of the inner sequences.\n     */\n    public func merge(maxConcurrent: Int)\n        -> Observable<E.E> {\n        return MergeLimited(source: asObservable(), maxConcurrent: maxConcurrent)\n    }\n}\n\nextension ObservableType where E : ObservableConvertibleType {\n\n    /**\n     Concatenates all inner observable sequences, as long as the previous observable sequence terminated successfully.\n\n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n\n     - returns: An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n     */\n    public func concat() -> Observable<E.E> {\n        return merge(maxConcurrent: 1)\n    }\n}\n\nextension ObservableType {\n    /**\n     Merges elements from all observable sequences from collection into a single observable sequence.\n\n     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)\n\n     - parameter sources: Collection of observable sequences to merge.\n     - returns: The observable sequence that merges the elements of the observable sequences.\n     */\n    public static func merge<C: Collection>(_ sources: C) -> Observable<E> where C.Iterator.Element == Observable<E> {\n        return MergeArray(sources: Array(sources))\n    }\n\n    /**\n     Merges elements from all observable sequences from array into a single observable sequence.\n\n     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)\n\n     - parameter sources: Array of observable sequences to merge.\n     - returns: The observable sequence that merges the elements of the observable sequences.\n     */\n    public static func merge(_ sources: [Observable<E>]) -> Observable<E> {\n        return MergeArray(sources: sources)\n    }\n\n    /**\n     Merges elements from all observable sequences into a single observable sequence.\n\n     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)\n\n     - parameter sources: Collection of observable sequences to merge.\n     - returns: The observable sequence that merges the elements of the observable sequences.\n     */\n    public static func merge(_ sources: Observable<E>...) -> Observable<E> {\n        return MergeArray(sources: sources)\n    }\n}\n\n// MARK: concatMap\n\nextension ObservableType {\n    /**\n     Projects each element of an observable sequence to an observable sequence and concatenates the resulting observable sequences into one observable sequence.\n     \n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n     \n     - returns: An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n     */\n    \n    public func concatMap<O: ObservableConvertibleType>(_ selector: @escaping (E) throws -> O)\n        -> Observable<O.E> {\n            return ConcatMap(source: asObservable(), selector: selector)\n    }\n}\n\nfileprivate final class MergeLimitedSinkIter<SourceElement, SourceSequence: ObservableConvertibleType, Observer: ObserverType>\n    : ObserverType\n    , LockOwnerType\n    , SynchronizedOnType where SourceSequence.E == Observer.E {\n    typealias E = Observer.E\n    typealias DisposeKey = CompositeDisposable.DisposeKey\n    typealias Parent = MergeLimitedSink<SourceElement, SourceSequence, Observer>\n    \n    private let _parent: Parent\n    private let _disposeKey: DisposeKey\n\n    var _lock: RecursiveLock {\n        return _parent._lock\n    }\n    \n    init(parent: Parent, disposeKey: DisposeKey) {\n        _parent = parent\n        _disposeKey = disposeKey\n    }\n    \n    func on(_ event: Event<E>) {\n        synchronizedOn(event)\n    }\n\n    func _synchronized_on(_ event: Event<E>) {\n        switch event {\n        case .next:\n            _parent.forwardOn(event)\n        case .error:\n            _parent.forwardOn(event)\n            _parent.dispose()\n        case .completed:\n            _parent._group.remove(for: _disposeKey)\n            if let next = _parent._queue.dequeue() {\n                _parent.subscribe(next, group: _parent._group)\n            }\n            else {\n                _parent._activeCount = _parent._activeCount - 1\n                \n                if _parent._stopped && _parent._activeCount == 0 {\n                    _parent.forwardOn(.completed)\n                    _parent.dispose()\n                }\n            }\n        }\n    }\n}\n\nfileprivate final class ConcatMapSink<SourceElement, SourceSequence: ObservableConvertibleType, Observer: ObserverType>: MergeLimitedSink<SourceElement, SourceSequence, Observer> where Observer.E == SourceSequence.E {\n    typealias Selector = (SourceElement) throws -> SourceSequence\n    \n    private let _selector: Selector\n    \n    init(selector: @escaping Selector, observer: Observer, cancel: Cancelable) {\n        _selector = selector\n        super.init(maxConcurrent: 1, observer: observer, cancel: cancel)\n    }\n    \n    override func performMap(_ element: SourceElement) throws -> SourceSequence {\n        return try _selector(element)\n    }\n}\n\nfileprivate final class MergeLimitedBasicSink<SourceSequence: ObservableConvertibleType, Observer: ObserverType>: MergeLimitedSink<SourceSequence, SourceSequence, Observer> where Observer.E == SourceSequence.E {\n    \n    override func performMap(_ element: SourceSequence) throws -> SourceSequence {\n        return element\n    }\n}\n\nfileprivate class MergeLimitedSink<SourceElement, SourceSequence: ObservableConvertibleType, Observer: ObserverType>\n    : Sink<Observer>\n    , ObserverType where Observer.E == SourceSequence.E  {\n    typealias QueueType = Queue<SourceSequence>\n\n    let _maxConcurrent: Int\n\n    let _lock = RecursiveLock()\n\n    // state\n    var _stopped = false\n    var _activeCount = 0\n    var _queue = QueueType(capacity: 2)\n    \n    let _sourceSubscription = SingleAssignmentDisposable()\n    let _group = CompositeDisposable()\n    \n    init(maxConcurrent: Int, observer: Observer, cancel: Cancelable) {\n        _maxConcurrent = maxConcurrent\n        \n        let _ = _group.insert(_sourceSubscription)\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run(_ source: Observable<SourceElement>) -> Disposable {\n        let _ = _group.insert(_sourceSubscription)\n        \n        let disposable = source.subscribe(self)\n        _sourceSubscription.setDisposable(disposable)\n        return _group\n    }\n    \n    func subscribe(_ innerSource: SourceSequence, group: CompositeDisposable) {\n        let subscription = SingleAssignmentDisposable()\n        \n        let key = group.insert(subscription)\n        \n        if let key = key {\n            let observer = MergeLimitedSinkIter(parent: self, disposeKey: key)\n            \n            let disposable = innerSource.asObservable().subscribe(observer)\n            subscription.setDisposable(disposable)\n        }\n    }\n    \n    func performMap(_ element: SourceElement) throws -> SourceSequence {\n        rxAbstractMethod()\n    }\n\n    @inline(__always)\n    final private func nextElementArrived(element: SourceElement) -> SourceSequence? {\n        _lock.lock(); defer { _lock.unlock() } // {\n            let subscribe: Bool\n            if _activeCount < _maxConcurrent {\n                _activeCount += 1\n                subscribe = true\n            }\n            else {\n                do {\n                    let value = try performMap(element)\n                    _queue.enqueue(value)\n                } catch {\n                    forwardOn(.error(error))\n                    dispose()\n                }\n                subscribe = false\n            }\n\n            if subscribe {\n                do {\n                    return try performMap(element)\n                } catch {\n                    forwardOn(.error(error))\n                    dispose()\n                }\n            }\n\n            return nil\n        // }\n    }\n\n    func on(_ event: Event<SourceElement>) {\n        switch event {\n        case .next(let element):\n            if let sequence = self.nextElementArrived(element: element) {\n                self.subscribe(sequence, group: _group)\n            }\n        case .error(let error):\n            _lock.lock(); defer { _lock.unlock() }\n\n            forwardOn(.error(error))\n            dispose()\n        case .completed:\n            _lock.lock(); defer { _lock.unlock() }\n\n            if _activeCount == 0 {\n                forwardOn(.completed)\n                dispose()\n            }\n            else {\n                _sourceSubscription.dispose()\n            }\n\n            _stopped = true\n        }\n    }\n}\n\nfinal fileprivate class MergeLimited<SourceSequence: ObservableConvertibleType> : Producer<SourceSequence.E> {\n    private let _source: Observable<SourceSequence>\n    private let _maxConcurrent: Int\n    \n    init(source: Observable<SourceSequence>, maxConcurrent: Int) {\n        _source = source\n        _maxConcurrent = maxConcurrent\n    }\n    \n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == SourceSequence.E {\n        let sink = MergeLimitedBasicSink<SourceSequence, O>(maxConcurrent: _maxConcurrent, observer: observer, cancel: cancel)\n        let subscription = sink.run(_source)\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n// MARK: Merge\n\nfileprivate final class MergeBasicSink<S: ObservableConvertibleType, O: ObserverType> : MergeSink<S, S, O> where O.E == S.E {\n    override func performMap(_ element: S) throws -> S {\n        return element\n    }\n}\n\n// MARK: flatMap\n\nfileprivate final class FlatMapSink<SourceElement, SourceSequence: ObservableConvertibleType, Observer: ObserverType> : MergeSink<SourceElement, SourceSequence, Observer> where Observer.E == SourceSequence.E {\n    typealias Selector = (SourceElement) throws -> SourceSequence\n\n    private let _selector: Selector\n\n    init(selector: @escaping Selector, observer: Observer, cancel: Cancelable) {\n        _selector = selector\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    override func performMap(_ element: SourceElement) throws -> SourceSequence {\n        return try _selector(element)\n    }\n}\n\n// MARK: FlatMapFirst\n\nfileprivate final class FlatMapFirstSink<SourceElement, SourceSequence: ObservableConvertibleType, Observer: ObserverType> : MergeSink<SourceElement, SourceSequence, Observer> where Observer.E == SourceSequence.E {\n    typealias Selector = (SourceElement) throws -> SourceSequence\n\n    private let _selector: Selector\n\n    override var subscribeNext: Bool {\n        return _activeCount == 0\n    }\n\n    init(selector: @escaping Selector, observer: Observer, cancel: Cancelable) {\n        _selector = selector\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    override func performMap(_ element: SourceElement) throws -> SourceSequence {\n        return try _selector(element)\n    }\n}\n\nfileprivate final class MergeSinkIter<SourceElement, SourceSequence: ObservableConvertibleType, Observer: ObserverType> : ObserverType where Observer.E == SourceSequence.E {\n    typealias Parent = MergeSink<SourceElement, SourceSequence, Observer>\n    typealias DisposeKey = CompositeDisposable.DisposeKey\n    typealias E = Observer.E\n    \n    private let _parent: Parent\n    private let _disposeKey: DisposeKey\n\n    init(parent: Parent, disposeKey: DisposeKey) {\n        _parent = parent\n        _disposeKey = disposeKey\n    }\n    \n    func on(_ event: Event<E>) {\n        _parent._lock.lock(); defer { _parent._lock.unlock() } // lock {\n            switch event {\n            case .next(let value):\n                _parent.forwardOn(.next(value))\n            case .error(let error):\n                _parent.forwardOn(.error(error))\n                _parent.dispose()\n            case .completed:\n                _parent._group.remove(for: _disposeKey)\n                _parent._activeCount -= 1\n                _parent.checkCompleted()\n            }\n        // }\n    }\n}\n\n\nfileprivate class MergeSink<SourceElement, SourceSequence: ObservableConvertibleType, Observer: ObserverType>\n    : Sink<Observer>\n    , ObserverType where Observer.E == SourceSequence.E {\n    typealias ResultType = Observer.E\n    typealias Element = SourceElement\n\n    let _lock = RecursiveLock()\n\n    var subscribeNext: Bool {\n        return true\n    }\n\n    // state\n    let _group = CompositeDisposable()\n    let _sourceSubscription = SingleAssignmentDisposable()\n\n    var _activeCount = 0\n    var _stopped = false\n\n    override init(observer: Observer, cancel: Cancelable) {\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func performMap(_ element: SourceElement) throws -> SourceSequence {\n        rxAbstractMethod()\n    }\n\n    @inline(__always)\n    final private func nextElementArrived(element: SourceElement) -> SourceSequence? {\n        _lock.lock(); defer { _lock.unlock() } // {\n            if !subscribeNext {\n                return nil\n            }\n\n            do {\n                let value = try performMap(element)\n                _activeCount += 1\n                return value\n            }\n            catch let e {\n                forwardOn(.error(e))\n                dispose()\n                return nil\n            }\n        // }\n    }\n    \n    func on(_ event: Event<SourceElement>) {\n        switch event {\n        case .next(let element):\n            if let value = nextElementArrived(element: element) {\n                subscribeInner(value.asObservable())\n            }\n        case .error(let error):\n            _lock.lock(); defer { _lock.unlock() }\n            forwardOn(.error(error))\n            dispose()\n        case .completed:\n            _lock.lock(); defer { _lock.unlock() }\n            _stopped = true\n            _sourceSubscription.dispose()\n            checkCompleted()\n        }\n    }\n\n    func subscribeInner(_ source: Observable<Observer.E>) {\n        let iterDisposable = SingleAssignmentDisposable()\n        if let disposeKey = _group.insert(iterDisposable) {\n            let iter = MergeSinkIter(parent: self, disposeKey: disposeKey)\n            let subscription = source.subscribe(iter)\n            iterDisposable.setDisposable(subscription)\n        }\n    }\n\n    func run(_ sources: [Observable<Observer.E>]) -> Disposable {\n        _activeCount += sources.count\n\n        for source in sources {\n            subscribeInner(source)\n        }\n\n        _stopped = true\n\n        checkCompleted()\n\n        return _group\n    }\n\n    @inline(__always)\n    func checkCompleted() {\n        if _stopped && _activeCount == 0 {\n            self.forwardOn(.completed)\n            self.dispose()\n        }\n    }\n    \n    func run(_ source: Observable<SourceElement>) -> Disposable {\n        let _ = _group.insert(_sourceSubscription)\n\n        let subscription = source.subscribe(self)\n        _sourceSubscription.setDisposable(subscription)\n        \n        return _group\n    }\n}\n\n// MARK: Producers\n\nfinal fileprivate class FlatMap<SourceElement, SourceSequence: ObservableConvertibleType>: Producer<SourceSequence.E> {\n    typealias Selector = (SourceElement) throws -> SourceSequence\n\n    private let _source: Observable<SourceElement>\n    \n    private let _selector: Selector\n\n    init(source: Observable<SourceElement>, selector: @escaping Selector) {\n        _source = source\n        _selector = selector\n    }\n    \n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == SourceSequence.E {\n        let sink = FlatMapSink(selector: _selector, observer: observer, cancel: cancel)\n        let subscription = sink.run(_source)\n        return (sink: sink, subscription: subscription)\n    }\n}\n\nfinal fileprivate class FlatMapFirst<SourceElement, SourceSequence: ObservableConvertibleType>: Producer<SourceSequence.E> {\n    typealias Selector = (SourceElement) throws -> SourceSequence\n\n    private let _source: Observable<SourceElement>\n\n    private let _selector: Selector\n\n    init(source: Observable<SourceElement>, selector: @escaping Selector) {\n        _source = source\n        _selector = selector\n    }\n\n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == SourceSequence.E {\n        let sink = FlatMapFirstSink<SourceElement, SourceSequence, O>(selector: _selector, observer: observer, cancel: cancel)\n        let subscription = sink.run(_source)\n        return (sink: sink, subscription: subscription)\n    }\n}\n\nfinal class ConcatMap<SourceElement, SourceSequence: ObservableConvertibleType>: Producer<SourceSequence.E> {\n    typealias Selector = (SourceElement) throws -> SourceSequence\n    \n    private let _source: Observable<SourceElement>\n    private let _selector: Selector\n    \n    init(source: Observable<SourceElement>, selector: @escaping Selector) {\n        _source = source\n        _selector = selector\n    }\n    \n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == SourceSequence.E {\n        let sink = ConcatMapSink<SourceElement, SourceSequence, O>(selector: _selector, observer: observer, cancel: cancel)\n        let subscription = sink.run(_source)\n        return (sink: sink, subscription: subscription)\n    }\n}\n\nfinal class Merge<SourceSequence: ObservableConvertibleType> : Producer<SourceSequence.E> {\n    private let _source: Observable<SourceSequence>\n\n    init(source: Observable<SourceSequence>) {\n        _source = source\n    }\n    \n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == SourceSequence.E {\n        let sink = MergeBasicSink<SourceSequence, O>(observer: observer, cancel: cancel)\n        let subscription = sink.run(_source)\n        return (sink: sink, subscription: subscription)\n    }\n}\n\nfinal fileprivate class MergeArray<Element> : Producer<Element> {\n    private let _sources: [Observable<Element>]\n\n    init(sources: [Observable<Element>]) {\n        _sources = sources\n    }\n\n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {\n        let sink = MergeBasicSink<Observable<E>, O>(observer: observer, cancel: cancel)\n        let subscription = sink.run(_sources)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Multicast.swift",
    "content": "//\n//  Multicast.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/27/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/**\n Represents an observable wrapper that can be connected and disconnected from its underlying observable sequence.\n */\npublic class ConnectableObservable<Element>\n    : Observable<Element>\n    , ConnectableObservableType {\n\n    /**\n     Connects the observable wrapper to its source. All subscribed observers will receive values from the underlying observable sequence as long as the connection is established.\n\n     - returns: Disposable used to disconnect the observable wrapper from its source, causing subscribed observer to stop receiving values from the underlying observable sequence.\n     */\n    public func connect() -> Disposable {\n        rxAbstractMethod()\n    }\n}\n\nextension ObservableType {\n    \n    /**\n    Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. \n    \n    Each subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's invocation.\n\n    For specializations with fixed subject types, see `publish` and `replay`.\n\n    - seealso: [multicast operator on reactivex.io](http://reactivex.io/documentation/operators/publish.html)\n    \n    - parameter subjectSelector: Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n    - parameter selector: Selector function which can use the multicasted source sequence subject to the policies enforced by the created subject.\n    - returns: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n    */\n    public func multicast<S: SubjectType, R>(_ subjectSelector: @escaping () throws -> S, selector: @escaping (Observable<S.E>) throws -> Observable<R>)\n        -> Observable<R> where S.SubjectObserverType.E == E {\n        return Multicast(\n            source: self.asObservable(),\n            subjectSelector: subjectSelector,\n            selector: selector\n        )\n    }\n}\n\nextension ObservableType {\n    \n    /**\n    Returns a connectable observable sequence that shares a single subscription to the underlying sequence. \n    \n    This operator is a specialization of `multicast` using a `PublishSubject`.\n\n    - seealso: [publish operator on reactivex.io](http://reactivex.io/documentation/operators/publish.html)\n    \n    - returns: A connectable observable sequence that shares a single subscription to the underlying sequence.\n    */\n    public func publish() -> ConnectableObservable<E> {\n        return self.multicast { PublishSubject() }\n    }\n}\n\nextension ObservableType {\n\n    /**\n     Returns a connectable observable sequence that shares a single subscription to the underlying sequence replaying bufferSize elements.\n\n     This operator is a specialization of `multicast` using a `ReplaySubject`.\n\n     - seealso: [replay operator on reactivex.io](http://reactivex.io/documentation/operators/replay.html)\n\n     - parameter bufferSize: Maximum element count of the replay buffer.\n     - returns: A connectable observable sequence that shares a single subscription to the underlying sequence.\n     */\n    public func replay(_ bufferSize: Int)\n        -> ConnectableObservable<E> {\n        return self.multicast { ReplaySubject.create(bufferSize: bufferSize) }\n    }\n\n    /**\n     Returns a connectable observable sequence that shares a single subscription to the underlying sequence replaying all elements.\n\n     This operator is a specialization of `multicast` using a `ReplaySubject`.\n\n     - seealso: [replay operator on reactivex.io](http://reactivex.io/documentation/operators/replay.html)\n\n     - returns: A connectable observable sequence that shares a single subscription to the underlying sequence.\n     */\n    public func replayAll()\n        -> ConnectableObservable<E> {\n        return self.multicast { ReplaySubject.createUnbounded() }\n    }\n}\n\nextension ConnectableObservableType {\n    \n    /**\n    Returns an observable sequence that stays connected to the source as long as there is at least one subscription to the observable sequence.\n\n    - seealso: [refCount operator on reactivex.io](http://reactivex.io/documentation/operators/refcount.html)\n    \n    - returns: An observable sequence that stays connected to the source as long as there is at least one subscription to the observable sequence.\n    */\n    public func refCount() -> Observable<E> {\n        return RefCount(source: self)\n    }\n}\n\nextension ObservableType {\n\n    /**\n     Multicasts the source sequence notifications through the specified subject to the resulting connectable observable.\n\n     Upon connection of the connectable observable, the subject is subscribed to the source exactly one, and messages are forwarded to the observers registered with the connectable observable.\n\n     For specializations with fixed subject types, see `publish` and `replay`.\n\n     - seealso: [multicast operator on reactivex.io](http://reactivex.io/documentation/operators/publish.html)\n\n     - parameter subject: Subject to push source elements into.\n     - returns: A connectable observable sequence that upon connection causes the source sequence to push results into the specified subject.\n     */\n    public func multicast<S: SubjectType>(_ subject: S)\n        -> ConnectableObservable<S.E> where S.SubjectObserverType.E == E {\n        return ConnectableObservableAdapter(source: self.asObservable(), makeSubject: { subject })\n    }\n\n    /**\n     Multicasts the source sequence notifications through an instantiated subject to the resulting connectable observable.\n\n     Upon connection of the connectable observable, the subject is subscribed to the source exactly one, and messages are forwarded to the observers registered with the connectable observable.\n     \n     Subject is cleared on connection disposal or in case source sequence produces terminal event.\n\n     - seealso: [multicast operator on reactivex.io](http://reactivex.io/documentation/operators/publish.html)\n\n     - parameter makeSubject: Factory function used to instantiate a subject for each connection.\n     - returns: A connectable observable sequence that upon connection causes the source sequence to push results into the specified subject.\n     */\n    public func multicast<S: SubjectType>(makeSubject: @escaping () -> S)\n        -> ConnectableObservable<S.E> where S.SubjectObserverType.E == E {\n        return ConnectableObservableAdapter(source: self.asObservable(), makeSubject: makeSubject)\n    }\n}\n\nfinal fileprivate class Connection<S: SubjectType> : ObserverType, Disposable {\n    typealias E = S.SubjectObserverType.E\n\n    private var _lock: RecursiveLock\n    // state\n    private var _parent: ConnectableObservableAdapter<S>?\n    private var _subscription : Disposable?\n    private var _subjectObserver: S.SubjectObserverType\n\n    private var _disposed: Bool = false\n\n    init(parent: ConnectableObservableAdapter<S>, subjectObserver: S.SubjectObserverType, lock: RecursiveLock, subscription: Disposable) {\n        _parent = parent\n        _subscription = subscription\n        _lock = lock\n        _subjectObserver = subjectObserver\n    }\n\n    func on(_ event: Event<S.SubjectObserverType.E>) {\n        if _disposed {\n            return\n        }\n        if event.isStopEvent {\n            self.dispose()\n        }\n        _subjectObserver.on(event)\n    }\n\n    func dispose() {\n        _lock.lock(); defer { _lock.unlock() } // {\n        _disposed = true\n        guard let parent = _parent else {\n            return\n        }\n\n        if parent._connection === self {\n            parent._connection = nil\n            parent._subject = nil\n        }\n        _parent = nil\n\n        _subscription?.dispose()\n        _subscription = nil\n        // }\n    }\n}\n\nfinal fileprivate class ConnectableObservableAdapter<S: SubjectType>\n    : ConnectableObservable<S.E> {\n    typealias ConnectionType = Connection<S>\n\n    fileprivate let _source: Observable<S.SubjectObserverType.E>\n    fileprivate let _makeSubject: () -> S\n\n    fileprivate let _lock = RecursiveLock()\n    fileprivate var _subject: S?\n\n    // state\n    fileprivate var _connection: ConnectionType?\n\n    init(source: Observable<S.SubjectObserverType.E>, makeSubject: @escaping () -> S) {\n        _source = source\n        _makeSubject = makeSubject\n        _subject = nil\n        _connection = nil\n    }\n\n    override func connect() -> Disposable {\n        return _lock.calculateLocked {\n            if let connection = _connection {\n                return connection\n            }\n\n            let singleAssignmentDisposable = SingleAssignmentDisposable()\n            let connection = Connection(parent: self, subjectObserver: self.lazySubject.asObserver(), lock: _lock, subscription: singleAssignmentDisposable)\n            _connection = connection\n            let subscription = _source.subscribe(connection)\n            singleAssignmentDisposable.setDisposable(subscription)\n            return connection\n        }\n    }\n\n    fileprivate var lazySubject: S {\n        if let subject = self._subject {\n            return subject\n        }\n\n        let subject = _makeSubject()\n        self._subject = subject\n        return subject\n    }\n\n    override func subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == S.E {\n        return self.lazySubject.subscribe(observer)\n    }\n}\n\nfinal fileprivate class RefCountSink<CO: ConnectableObservableType, O: ObserverType>\n    : Sink<O>\n    , ObserverType where CO.E == O.E {\n    typealias Element = O.E\n    typealias Parent = RefCount<CO>\n\n    private let _parent: Parent\n\n    private var _connectionIdSnapshot: Int64 = -1\n\n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func run() -> Disposable {\n        let subscription = _parent._source.subscribe(self)\n        _parent._lock.lock(); defer { _parent._lock.unlock() } // {\n\n        _connectionIdSnapshot = _parent._connectionId\n\n        if self.disposed {\n            return Disposables.create()\n        }\n\n        if _parent._count == 0 {\n            _parent._count = 1\n            _parent._connectableSubscription = _parent._source.connect()\n        }\n        else {\n            _parent._count = _parent._count + 1\n        }\n        // }\n\n        return Disposables.create {\n            subscription.dispose()\n            self._parent._lock.lock(); defer { self._parent._lock.unlock() } // {\n            if self._parent._connectionId != self._connectionIdSnapshot {\n                return\n            }\n            if self._parent._count == 1 {\n                self._parent._count = 0\n                guard let connectableSubscription = self._parent._connectableSubscription else {\n                    return\n                }\n\n                connectableSubscription.dispose()\n                self._parent._connectableSubscription = nil\n            }\n            else if self._parent._count > 1 {\n                self._parent._count = self._parent._count - 1\n            }\n            else {\n                rxFatalError(\"Something went wrong with RefCount disposing mechanism\")\n            }\n            // }\n        }\n    }\n\n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next:\n            forwardOn(event)\n        case .error, .completed:\n            _parent._lock.lock() // {\n                if _parent._connectionId == self._connectionIdSnapshot {\n                    let connection = _parent._connectableSubscription\n                    defer { connection?.dispose() }\n                    _parent._count = 0\n                    _parent._connectionId = _parent._connectionId &+ 1\n                    _parent._connectableSubscription = nil\n                }\n            // }\n            _parent._lock.unlock()\n            forwardOn(event)\n            dispose()\n        }\n    }\n}\n\nfinal fileprivate class RefCount<CO: ConnectableObservableType>: Producer<CO.E> {\n    fileprivate let _lock = RecursiveLock()\n\n    // state\n    fileprivate var _count = 0\n    fileprivate var _connectionId: Int64 = 0\n    fileprivate var _connectableSubscription = nil as Disposable?\n\n    fileprivate let _source: CO\n\n    init(source: CO) {\n        _source = source\n    }\n\n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == CO.E {\n        let sink = RefCountSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\nfinal fileprivate class MulticastSink<S: SubjectType, O: ObserverType>: Sink<O>, ObserverType {\n    typealias Element = O.E\n    typealias ResultType = Element\n    typealias MutlicastType = Multicast<S, O.E>\n    \n    private let _parent: MutlicastType\n    \n    init(parent: MutlicastType, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        do {\n            let subject = try _parent._subjectSelector()\n            let connectable = ConnectableObservableAdapter(source: _parent._source, makeSubject: { subject })\n            \n            let observable = try _parent._selector(connectable)\n            \n            let subscription = observable.subscribe(self)\n            let connection = connectable.connect()\n                \n            return Disposables.create(subscription, connection)\n        }\n        catch let e {\n            forwardOn(.error(e))\n            dispose()\n            return Disposables.create()\n        }\n    }\n    \n    func on(_ event: Event<ResultType>) {\n        forwardOn(event)\n        switch event {\n            case .next: break\n            case .error, .completed:\n                dispose()\n        }\n    }\n}\n\nfinal fileprivate class Multicast<S: SubjectType, R>: Producer<R> {\n    typealias SubjectSelectorType = () throws -> S\n    typealias SelectorType = (Observable<S.E>) throws -> Observable<R>\n    \n    fileprivate let _source: Observable<S.SubjectObserverType.E>\n    fileprivate let _subjectSelector: SubjectSelectorType\n    fileprivate let _selector: SelectorType\n    \n    init(source: Observable<S.SubjectObserverType.E>, subjectSelector: @escaping SubjectSelectorType, selector: @escaping SelectorType) {\n        _source = source\n        _subjectSelector = subjectSelector\n        _selector = selector\n    }\n    \n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R {\n        let sink = MulticastSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Never.swift",
    "content": "//\n//  Never.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 8/30/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Returns a non-terminating observable sequence, which can be used to denote an infinite duration.\n\n     - seealso: [never operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)\n\n     - returns: An observable sequence whose observers will never get called.\n     */\n    public static func never() -> Observable<E> {\n        return NeverProducer()\n    }\n}\n\nfinal fileprivate class NeverProducer<Element> : Producer<Element> {\n    override func subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == Element {\n        return Disposables.create()\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/ObserveOn.swift",
    "content": "//\n//  ObserveOn.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 7/25/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n\n     This only invokes observer callbacks on a `scheduler`. In case the subscription and/or unsubscription\n     actions have side-effects that require to be run on a scheduler, use `subscribeOn`.\n\n     - seealso: [observeOn operator on reactivex.io](http://reactivex.io/documentation/operators/observeon.html)\n\n     - parameter scheduler: Scheduler to notify observers on.\n     - returns: The source sequence whose observations happen on the specified scheduler.\n     */\n    public func observeOn(_ scheduler: ImmediateSchedulerType)\n        -> Observable<E> {\n            if let scheduler = scheduler as? SerialDispatchQueueScheduler {\n                return ObserveOnSerialDispatchQueue(source: self.asObservable(), scheduler: scheduler)\n            }\n            else {\n                return ObserveOn(source: self.asObservable(), scheduler: scheduler)\n            }\n    }\n}\n\nfinal fileprivate class ObserveOn<E> : Producer<E> {\n    let scheduler: ImmediateSchedulerType\n    let source: Observable<E>\n    \n    init(source: Observable<E>, scheduler: ImmediateSchedulerType) {\n        self.scheduler = scheduler\n        self.source = source\n        \n#if TRACE_RESOURCES\n        let _ = Resources.incrementTotal()\n#endif\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {\n        let sink = ObserveOnSink(scheduler: scheduler, observer: observer, cancel: cancel)\n        let subscription = source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n    \n#if TRACE_RESOURCES\n    deinit {\n        let _ = Resources.decrementTotal()\n    }\n#endif\n}\n\nenum ObserveOnState : Int32 {\n    // pump is not running\n    case stopped = 0\n    // pump is running\n    case running = 1\n}\n\nfinal fileprivate class ObserveOnSink<O: ObserverType> : ObserverBase<O.E> {\n    typealias E = O.E\n    \n    let _scheduler: ImmediateSchedulerType\n\n    var _lock = SpinLock()\n    let _observer: O\n\n    // state\n    var _state = ObserveOnState.stopped\n    var _queue = Queue<Event<E>>(capacity: 10)\n\n    let _scheduleDisposable = SerialDisposable()\n    let _cancel: Cancelable\n\n    init(scheduler: ImmediateSchedulerType, observer: O, cancel: Cancelable) {\n        _scheduler = scheduler\n        _observer = observer\n        _cancel = cancel\n    }\n\n    override func onCore(_ event: Event<E>) {\n        let shouldStart = _lock.calculateLocked { () -> Bool in\n            self._queue.enqueue(event)\n            \n            switch self._state {\n            case .stopped:\n                self._state = .running\n                return true\n            case .running:\n                return false\n            }\n        }\n        \n        if shouldStart {\n            _scheduleDisposable.disposable = self._scheduler.scheduleRecursive((), action: self.run)\n        }\n    }\n    \n    func run(_ state: (), _ recurse: (()) -> ()) {\n        let (nextEvent, observer) = self._lock.calculateLocked { () -> (Event<E>?, O) in\n            if self._queue.count > 0 {\n                return (self._queue.dequeue(), self._observer)\n            }\n            else {\n                self._state = .stopped\n                return (nil, self._observer)\n            }\n        }\n\n        if let nextEvent = nextEvent, !_cancel.isDisposed {\n            observer.on(nextEvent)\n            if nextEvent.isStopEvent {\n                dispose()\n            }\n        }\n        else {\n            return\n        }\n\n        let shouldContinue = _shouldContinue_synchronized()\n\n        if shouldContinue {\n            recurse(())\n        }\n    }\n\n    func _shouldContinue_synchronized() -> Bool {\n        _lock.lock(); defer { _lock.unlock() } // {\n            if self._queue.count > 0 {\n                return true\n            }\n            else {\n                self._state = .stopped\n                return false\n            }\n        // }\n    }\n    \n    override func dispose() {\n        super.dispose()\n\n        _cancel.dispose()\n        _scheduleDisposable.dispose()\n    }\n}\n\n#if TRACE_RESOURCES\n    fileprivate var _numberOfSerialDispatchQueueObservables: AtomicInt = 0\n    extension Resources {\n        /**\n         Counts number of `SerialDispatchQueueObservables`.\n\n         Purposed for unit tests.\n         */\n        public static var numberOfSerialDispatchQueueObservables: Int32 {\n            return _numberOfSerialDispatchQueueObservables.valueSnapshot()\n        }\n    }\n#endif\n\nfinal fileprivate class ObserveOnSerialDispatchQueueSink<O: ObserverType> : ObserverBase<O.E> {\n    let scheduler: SerialDispatchQueueScheduler\n    let observer: O\n\n    let cancel: Cancelable\n\n    var cachedScheduleLambda: (((sink: ObserveOnSerialDispatchQueueSink<O>, event: Event<E>)) -> Disposable)!\n\n    init(scheduler: SerialDispatchQueueScheduler, observer: O, cancel: Cancelable) {\n        self.scheduler = scheduler\n        self.observer = observer\n        self.cancel = cancel\n        super.init()\n\n        cachedScheduleLambda = { pair in\n            pair.sink.observer.on(pair.event)\n\n            if pair.event.isStopEvent {\n                pair.sink.dispose()\n            }\n\n            return Disposables.create()\n        }\n    }\n\n    override func onCore(_ event: Event<E>) {\n        let _ = self.scheduler.schedule((self, event), action: cachedScheduleLambda!)\n    }\n\n    override func dispose() {\n        super.dispose()\n\n        cancel.dispose()\n    }\n}\n\nfinal fileprivate class ObserveOnSerialDispatchQueue<E> : Producer<E> {\n    let scheduler: SerialDispatchQueueScheduler\n    let source: Observable<E>\n\n    init(source: Observable<E>, scheduler: SerialDispatchQueueScheduler) {\n        self.scheduler = scheduler\n        self.source = source\n\n        #if TRACE_RESOURCES\n            let _ = Resources.incrementTotal()\n            let _ = AtomicIncrement(&_numberOfSerialDispatchQueueObservables)\n        #endif\n    }\n\n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {\n        let sink = ObserveOnSerialDispatchQueueSink(scheduler: scheduler, observer: observer, cancel: cancel)\n        let subscription = source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n\n    #if TRACE_RESOURCES\n    deinit {\n        let _ = Resources.decrementTotal()\n        let _ = AtomicDecrement(&_numberOfSerialDispatchQueueObservables)\n    }\n    #endif\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Optional.swift",
    "content": "//\n//  Optional.swift\n//  RxSwift\n//\n//  Created by tarunon on 2016/12/13.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Converts a optional to an observable sequence.\n\n     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)\n\n     - parameter optional: Optional element in the resulting observable sequence.\n     - returns: An observable sequence containing the wrapped value or not from given optional.\n     */\n    public static func from(optional: E?) -> Observable<E> {\n        return ObservableOptional(optional: optional)\n    }\n\n    /**\n     Converts a optional to an observable sequence.\n\n     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)\n\n     - parameter optional: Optional element in the resulting observable sequence.\n     - parameter: Scheduler to send the optional element on.\n     - returns: An observable sequence containing the wrapped value or not from given optional.\n     */\n    public static func from(optional: E?, scheduler: ImmediateSchedulerType) -> Observable<E> {\n        return ObservableOptionalScheduled(optional: optional, scheduler: scheduler)\n    }\n}\n\nfinal fileprivate class ObservableOptionalScheduledSink<O: ObserverType> : Sink<O> {\n    typealias E = O.E\n    typealias Parent = ObservableOptionalScheduled<E>\n\n    private let _parent: Parent\n\n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func run() -> Disposable {\n        return _parent._scheduler.schedule(_parent._optional) { (optional: E?) -> Disposable in\n            if let next = optional {\n                self.forwardOn(.next(next))\n                return self._parent._scheduler.schedule(()) { _ in\n                    self.forwardOn(.completed)\n                    self.dispose()\n                    return Disposables.create()\n                }\n            } else {\n                self.forwardOn(.completed)\n                self.dispose()\n                return Disposables.create()\n            }\n        }\n    }\n}\n\nfinal fileprivate class ObservableOptionalScheduled<E> : Producer<E> {\n    fileprivate let _optional: E?\n    fileprivate let _scheduler: ImmediateSchedulerType\n\n    init(optional: E?, scheduler: ImmediateSchedulerType) {\n        _optional = optional\n        _scheduler = scheduler\n    }\n\n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {\n        let sink = ObservableOptionalScheduledSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\nfinal fileprivate class ObservableOptional<E>: Producer<E> {\n    private let _optional: E?\n    \n    init(optional: E?) {\n        _optional = optional\n    }\n    \n    override func subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == E {\n        if let element = _optional {\n            observer.on(.next(element))\n        }\n        observer.on(.completed)\n        return Disposables.create()\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Producer.swift",
    "content": "//\n//  Producer.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/20/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nclass Producer<Element> : Observable<Element> {\n    override init() {\n        super.init()\n    }\n    \n    override func subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == Element {\n        if !CurrentThreadScheduler.isScheduleRequired {\n            // The returned disposable needs to release all references once it was disposed.\n            let disposer = SinkDisposer()\n            let sinkAndSubscription = run(observer, cancel: disposer)\n            disposer.setSinkAndSubscription(sink: sinkAndSubscription.sink, subscription: sinkAndSubscription.subscription)\n\n            return disposer\n        }\n        else {\n            return CurrentThreadScheduler.instance.schedule(()) { _ in\n                let disposer = SinkDisposer()\n                let sinkAndSubscription = self.run(observer, cancel: disposer)\n                disposer.setSinkAndSubscription(sink: sinkAndSubscription.sink, subscription: sinkAndSubscription.subscription)\n\n                return disposer\n            }\n        }\n    }\n    \n    func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        rxAbstractMethod()\n    }\n}\n\nfileprivate final class SinkDisposer: Cancelable {\n    fileprivate enum DisposeState: UInt32 {\n        case disposed = 1\n        case sinkAndSubscriptionSet = 2\n    }\n\n    // Jeej, swift API consistency rules\n    fileprivate enum DisposeStateInt32: Int32 {\n        case disposed = 1\n        case sinkAndSubscriptionSet = 2\n    }\n    \n    private var _state: AtomicInt = 0\n    private var _sink: Disposable? = nil\n    private var _subscription: Disposable? = nil\n\n    var isDisposed: Bool {\n        return AtomicFlagSet(DisposeState.disposed.rawValue, &_state)\n    }\n\n    func setSinkAndSubscription(sink: Disposable, subscription: Disposable) {\n        _sink = sink\n        _subscription = subscription\n\n        let previousState = AtomicOr(DisposeState.sinkAndSubscriptionSet.rawValue, &_state)\n        if (previousState & DisposeStateInt32.sinkAndSubscriptionSet.rawValue) != 0 {\n            rxFatalError(\"Sink and subscription were already set\")\n        }\n\n        if (previousState & DisposeStateInt32.disposed.rawValue) != 0 {\n            sink.dispose()\n            subscription.dispose()\n            _sink = nil\n            _subscription = nil\n        }\n    }\n    \n    func dispose() {\n        let previousState = AtomicOr(DisposeState.disposed.rawValue, &_state)\n\n        if (previousState & DisposeStateInt32.disposed.rawValue) != 0 {\n            return\n        }\n\n        if (previousState & DisposeStateInt32.sinkAndSubscriptionSet.rawValue) != 0 {\n            guard let sink = _sink else {\n                rxFatalError(\"Sink not set\")\n            }\n            guard let subscription = _subscription else {\n                rxFatalError(\"Subscription not set\")\n            }\n\n            sink.dispose()\n            subscription.dispose()\n\n            _sink = nil\n            _subscription = nil\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Range.swift",
    "content": "//\n//  Range.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 9/13/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType where E : RxAbstractInteger {\n    /**\n     Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to generate and send out observer messages.\n\n     - seealso: [range operator on reactivex.io](http://reactivex.io/documentation/operators/range.html)\n\n     - parameter start: The value of the first integer in the sequence.\n     - parameter count: The number of sequential integers to generate.\n     - parameter scheduler: Scheduler to run the generator loop on.\n     - returns: An observable sequence that contains a range of sequential integral numbers.\n     */\n    public static func range(start: E, count: E, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable<E> {\n        return RangeProducer<E>(start: start, count: count, scheduler: scheduler)\n    }\n}\n\nfinal fileprivate class RangeProducer<E: RxAbstractInteger> : Producer<E> {\n    fileprivate let _start: E\n    fileprivate let _count: E\n    fileprivate let _scheduler: ImmediateSchedulerType\n\n    init(start: E, count: E, scheduler: ImmediateSchedulerType) {\n        if count < 0 {\n            rxFatalError(\"count can't be negative\")\n        }\n\n        if start &+ (count - 1) < start {\n            rxFatalError(\"overflow of count\")\n        }\n\n        _start = start\n        _count = count\n        _scheduler = scheduler\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {\n        let sink = RangeSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\nfinal fileprivate class RangeSink<O: ObserverType> : Sink<O> where O.E: RxAbstractInteger {\n    typealias Parent = RangeProducer<O.E>\n    \n    private let _parent: Parent\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        return _parent._scheduler.scheduleRecursive(0 as O.E) { i, recurse in\n            if i < self._parent._count {\n                self.forwardOn(.next(self._parent._start + i))\n                recurse(i + 1)\n            }\n            else {\n                self.forwardOn(.completed)\n                self.dispose()\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Reduce.swift",
    "content": "//\n//  Reduce.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 4/1/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n\nextension ObservableType {\n    /**\n    Applies an `accumulator` function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified `seed` value is used as the initial accumulator value.\n\n    For aggregation behavior with incremental intermediate results, see `scan`.\n\n    - seealso: [reduce operator on reactivex.io](http://reactivex.io/documentation/operators/reduce.html)\n\n    - parameter seed: The initial accumulator value.\n    - parameter accumulator: A accumulator function to be invoked on each element.\n    - parameter mapResult: A function to transform the final accumulator value into the result value.\n    - returns: An observable sequence containing a single element with the final accumulator value.\n    */\n    public func reduce<A, R>(_ seed: A, accumulator: @escaping (A, E) throws -> A, mapResult: @escaping (A) throws -> R)\n        -> Observable<R> {\n        return Reduce(source: self.asObservable(), seed: seed, accumulator: accumulator, mapResult: mapResult)\n    }\n\n    /**\n    Applies an `accumulator` function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified `seed` value is used as the initial accumulator value.\n    \n    For aggregation behavior with incremental intermediate results, see `scan`.\n\n    - seealso: [reduce operator on reactivex.io](http://reactivex.io/documentation/operators/reduce.html)\n    \n    - parameter seed: The initial accumulator value.\n    - parameter accumulator: A accumulator function to be invoked on each element.\n    - returns: An observable sequence containing a single element with the final accumulator value.\n    */\n    public func reduce<A>(_ seed: A, accumulator: @escaping (A, E) throws -> A)\n        -> Observable<A> {\n        return Reduce(source: self.asObservable(), seed: seed, accumulator: accumulator, mapResult: { $0 })\n    }\n}\n\nfinal fileprivate class ReduceSink<SourceType, AccumulateType, O: ObserverType> : Sink<O>, ObserverType {\n    typealias ResultType = O.E\n    typealias Parent = Reduce<SourceType, AccumulateType, ResultType>\n    \n    private let _parent: Parent\n    private var _accumulation: AccumulateType\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        _accumulation = parent._seed\n        \n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<SourceType>) {\n        switch event {\n        case .next(let value):\n            do {\n                _accumulation = try _parent._accumulator(_accumulation, value)\n            }\n            catch let e {\n                forwardOn(.error(e))\n                dispose()\n            }\n        case .error(let e):\n            forwardOn(.error(e))\n            dispose()\n        case .completed:\n            do {\n                let result = try _parent._mapResult(_accumulation)\n                forwardOn(.next(result))\n                forwardOn(.completed)\n                dispose()\n            }\n            catch let e {\n                forwardOn(.error(e))\n                dispose()\n            }\n        }\n    }\n}\n\nfinal fileprivate class Reduce<SourceType, AccumulateType, ResultType> : Producer<ResultType> {\n    typealias AccumulatorType = (AccumulateType, SourceType) throws -> AccumulateType\n    typealias ResultSelectorType = (AccumulateType) throws -> ResultType\n    \n    fileprivate let _source: Observable<SourceType>\n    fileprivate let _seed: AccumulateType\n    fileprivate let _accumulator: AccumulatorType\n    fileprivate let _mapResult: ResultSelectorType\n    \n    init(source: Observable<SourceType>, seed: AccumulateType, accumulator: @escaping AccumulatorType, mapResult: @escaping ResultSelectorType) {\n        _source = source\n        _seed = seed\n        _accumulator = accumulator\n        _mapResult = mapResult\n    }\n\n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == ResultType {\n        let sink = ReduceSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = _source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Repeat.swift",
    "content": "//\n//  Repeat.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 9/13/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Generates an observable sequence that repeats the given element infinitely, using the specified scheduler to send out observer messages.\n\n     - seealso: [repeat operator on reactivex.io](http://reactivex.io/documentation/operators/repeat.html)\n\n     - parameter element: Element to repeat.\n     - parameter scheduler: Scheduler to run the producer loop on.\n     - returns: An observable sequence that repeats the given element infinitely.\n     */\n    public static func repeatElement(_ element: E, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable<E> {\n        return RepeatElement(element: element, scheduler: scheduler)\n    }\n}\n\nfinal fileprivate class RepeatElement<Element> : Producer<Element> {\n    fileprivate let _element: Element\n    fileprivate let _scheduler: ImmediateSchedulerType\n    \n    init(element: Element, scheduler: ImmediateSchedulerType) {\n        _element = element\n        _scheduler = scheduler\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = RepeatElementSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n\n        return (sink: sink, subscription: subscription)\n    }\n}\n\nfinal fileprivate class RepeatElementSink<O: ObserverType> : Sink<O> {\n    typealias Parent = RepeatElement<O.E>\n    \n    private let _parent: Parent\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        return _parent._scheduler.scheduleRecursive(_parent._element) { e, recurse in\n            self.forwardOn(.next(e))\n            recurse(e)\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/RetryWhen.swift",
    "content": "//\n//  RetryWhen.swift\n//  RxSwift\n//\n//  Created by Junior B. on 06/10/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Repeats the source observable sequence on error when the notifier emits a next value.\n     If the source observable errors and the notifier completes, it will complete the source sequence.\n\n     - seealso: [retry operator on reactivex.io](http://reactivex.io/documentation/operators/retry.html)\n\n     - parameter notificationHandler: A handler that is passed an observable sequence of errors raised by the source observable and returns and observable that either continues, completes or errors. This behavior is then applied to the source observable.\n     - returns: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully or is notified to error or complete.\n     */\n    public func retryWhen<TriggerObservable: ObservableType, Error: Swift.Error>(_ notificationHandler: @escaping (Observable<Error>) -> TriggerObservable)\n        -> Observable<E> {\n        return RetryWhenSequence(sources: InfiniteSequence(repeatedValue: self.asObservable()), notificationHandler: notificationHandler)\n    }\n\n    /**\n     Repeats the source observable sequence on error when the notifier emits a next value.\n     If the source observable errors and the notifier completes, it will complete the source sequence.\n\n     - seealso: [retry operator on reactivex.io](http://reactivex.io/documentation/operators/retry.html)\n\n     - parameter notificationHandler: A handler that is passed an observable sequence of errors raised by the source observable and returns and observable that either continues, completes or errors. This behavior is then applied to the source observable.\n     - returns: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully or is notified to error or complete.\n     */\n    public func retryWhen<TriggerObservable: ObservableType>(_ notificationHandler: @escaping (Observable<Swift.Error>) -> TriggerObservable)\n        -> Observable<E> {\n        return RetryWhenSequence(sources: InfiniteSequence(repeatedValue: self.asObservable()), notificationHandler: notificationHandler)\n    }\n}\n\nfinal fileprivate class RetryTriggerSink<S: Sequence, O: ObserverType, TriggerObservable: ObservableType, Error>\n    : ObserverType where S.Iterator.Element : ObservableType, S.Iterator.Element.E == O.E {\n    typealias E = TriggerObservable.E\n    \n    typealias Parent = RetryWhenSequenceSinkIter<S, O, TriggerObservable, Error>\n    \n    fileprivate let _parent: Parent\n\n    init(parent: Parent) {\n        _parent = parent\n    }\n\n    func on(_ event: Event<E>) {\n        switch event {\n        case .next:\n            _parent._parent._lastError = nil\n            _parent._parent.schedule(.moveNext)\n        case .error(let e):\n            _parent._parent.forwardOn(.error(e))\n            _parent._parent.dispose()\n        case .completed:\n            _parent._parent.forwardOn(.completed)\n            _parent._parent.dispose()\n        }\n    }\n}\n\nfinal fileprivate class RetryWhenSequenceSinkIter<S: Sequence, O: ObserverType, TriggerObservable: ObservableType, Error>\n    : ObserverType\n    , Disposable where S.Iterator.Element : ObservableType, S.Iterator.Element.E == O.E {\n    typealias E = O.E\n    typealias Parent = RetryWhenSequenceSink<S, O, TriggerObservable, Error>\n\n    fileprivate let _parent: Parent\n    fileprivate let _errorHandlerSubscription = SingleAssignmentDisposable()\n    fileprivate let _subscription: Disposable\n\n    init(parent: Parent, subscription: Disposable) {\n        _parent = parent\n        _subscription = subscription\n    }\n\n    func on(_ event: Event<E>) {\n        switch event {\n        case .next:\n            _parent.forwardOn(event)\n        case .error(let error):\n            _parent._lastError = error\n\n            if let failedWith = error as? Error {\n                // dispose current subscription\n                _subscription.dispose()\n\n                let errorHandlerSubscription = _parent._notifier.subscribe(RetryTriggerSink(parent: self))\n                _errorHandlerSubscription.setDisposable(errorHandlerSubscription)\n                _parent._errorSubject.on(.next(failedWith))\n            }\n            else {\n                _parent.forwardOn(.error(error))\n                _parent.dispose()\n            }\n        case .completed:\n            _parent.forwardOn(event)\n            _parent.dispose()\n        }\n    }\n\n    final func dispose() {\n        _subscription.dispose()\n        _errorHandlerSubscription.dispose()\n    }\n}\n\nfinal fileprivate class RetryWhenSequenceSink<S: Sequence, O: ObserverType, TriggerObservable: ObservableType, Error>\n    : TailRecursiveSink<S, O> where S.Iterator.Element : ObservableType, S.Iterator.Element.E == O.E {\n    typealias Element = O.E\n    typealias Parent = RetryWhenSequence<S, TriggerObservable, Error>\n    \n    let _lock = RecursiveLock()\n    \n    fileprivate let _parent: Parent\n    \n    fileprivate var _lastError: Swift.Error?\n    fileprivate let _errorSubject = PublishSubject<Error>()\n    fileprivate let _handler: Observable<TriggerObservable.E>\n    fileprivate let _notifier = PublishSubject<TriggerObservable.E>()\n\n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        _handler = parent._notificationHandler(_errorSubject).asObservable()\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    override func done() {\n        if let lastError = _lastError {\n            forwardOn(.error(lastError))\n            _lastError = nil\n        }\n        else {\n            forwardOn(.completed)\n        }\n\n        dispose()\n    }\n    \n    override func extract(_ observable: Observable<E>) -> SequenceGenerator? {\n        // It is important to always return `nil` here because there are sideffects in the `run` method\n        // that are dependant on particular `retryWhen` operator so single operator stack can't be reused in this\n        // case.\n        return nil\n    }\n\n    override func subscribeToNext(_ source: Observable<E>) -> Disposable {\n        let subscription = SingleAssignmentDisposable()\n        let iter = RetryWhenSequenceSinkIter(parent: self, subscription: subscription)\n        subscription.setDisposable(source.subscribe(iter))\n        return iter\n    }\n\n    override func run(_ sources: SequenceGenerator) -> Disposable {\n        let triggerSubscription = _handler.subscribe(_notifier.asObserver())\n        let superSubscription = super.run(sources)\n        return Disposables.create(superSubscription, triggerSubscription)\n    }\n}\n\nfinal fileprivate class RetryWhenSequence<S: Sequence, TriggerObservable: ObservableType, Error> : Producer<S.Iterator.Element.E> where S.Iterator.Element : ObservableType {\n    typealias Element = S.Iterator.Element.E\n    \n    fileprivate let _sources: S\n    fileprivate let _notificationHandler: (Observable<Error>) -> TriggerObservable\n    \n    init(sources: S, notificationHandler: @escaping (Observable<Error>) -> TriggerObservable) {\n        _sources = sources\n        _notificationHandler = notificationHandler\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = RetryWhenSequenceSink<S, O, TriggerObservable, Error>(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run((self._sources.makeIterator(), nil))\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Sample.swift",
    "content": "//\n//  Sample.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 5/1/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Samples the source observable sequence using a sampler observable sequence producing sampling ticks.\n\n     Upon each sampling tick, the latest element (if any) in the source sequence during the last sampling interval is sent to the resulting sequence.\n\n     **In case there were no new elements between sampler ticks, no element is sent to the resulting sequence.**\n\n     - seealso: [sample operator on reactivex.io](http://reactivex.io/documentation/operators/sample.html)\n\n     - parameter sampler: Sampling tick sequence.\n     - returns: Sampled observable sequence.\n     */\n    public func sample<O: ObservableType>(_ sampler: O)\n        -> Observable<E> {\n            return Sample(source: self.asObservable(), sampler: sampler.asObservable())\n    }\n}\n\nfinal fileprivate class SamplerSink<O: ObserverType, SampleType>\n    : ObserverType\n    , LockOwnerType\n    , SynchronizedOnType {\n    typealias E = SampleType\n    \n    typealias Parent = SampleSequenceSink<O, SampleType>\n    \n    fileprivate let _parent: Parent\n\n    var _lock: RecursiveLock {\n        return _parent._lock\n    }\n    \n    init(parent: Parent) {\n        _parent = parent\n    }\n    \n    func on(_ event: Event<E>) {\n        synchronizedOn(event)\n    }\n\n    func _synchronized_on(_ event: Event<E>) {\n        switch event {\n        case .next:\n            if let element = _parent._element {\n                _parent._element = nil\n                _parent.forwardOn(.next(element))\n            }\n\n            if _parent._atEnd {\n                _parent.forwardOn(.completed)\n                _parent.dispose()\n            }\n        case .error(let e):\n            _parent.forwardOn(.error(e))\n            _parent.dispose()\n        case .completed:\n            if let element = _parent._element {\n                _parent._element = nil\n                _parent.forwardOn(.next(element))\n            }\n            if _parent._atEnd {\n                _parent.forwardOn(.completed)\n                _parent.dispose()\n            }\n        }\n    }\n}\n\nfinal fileprivate class SampleSequenceSink<O: ObserverType, SampleType>\n    : Sink<O>\n    , ObserverType\n    , LockOwnerType\n    , SynchronizedOnType {\n    typealias Element = O.E\n    typealias Parent = Sample<Element, SampleType>\n    \n    fileprivate let _parent: Parent\n\n    let _lock = RecursiveLock()\n    \n    // state\n    fileprivate var _element = nil as Element?\n    fileprivate var _atEnd = false\n    \n    fileprivate let _sourceSubscription = SingleAssignmentDisposable()\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        _sourceSubscription.setDisposable(_parent._source.subscribe(self))\n        let samplerSubscription = _parent._sampler.subscribe(SamplerSink(parent: self))\n        \n        return Disposables.create(_sourceSubscription, samplerSubscription)\n    }\n    \n    func on(_ event: Event<Element>) {\n        synchronizedOn(event)\n    }\n\n    func _synchronized_on(_ event: Event<Element>) {\n        switch event {\n        case .next(let element):\n            _element = element\n        case .error:\n            forwardOn(event)\n            dispose()\n        case .completed:\n            _atEnd = true\n            _sourceSubscription.dispose()\n        }\n    }\n    \n}\n\nfinal fileprivate class Sample<Element, SampleType> : Producer<Element> {\n    fileprivate let _source: Observable<Element>\n    fileprivate let _sampler: Observable<SampleType>\n\n    init(source: Observable<Element>, sampler: Observable<SampleType>) {\n        _source = source\n        _sampler = sampler\n    }\n    \n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = SampleSequenceSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Scan.swift",
    "content": "//\n//  Scan.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 6/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Applies an accumulator function over an observable sequence and returns each intermediate result. The specified seed value is used as the initial accumulator value.\n\n     For aggregation behavior with no intermediate results, see `reduce`.\n\n     - seealso: [scan operator on reactivex.io](http://reactivex.io/documentation/operators/scan.html)\n\n     - parameter seed: The initial accumulator value.\n     - parameter accumulator: An accumulator function to be invoked on each element.\n     - returns: An observable sequence containing the accumulated values.\n     */\n    public func scan<A>(_ seed: A, accumulator: @escaping (A, E) throws -> A)\n        -> Observable<A> {\n        return Scan(source: self.asObservable(), seed: seed, accumulator: accumulator)\n    }\n}\n\nfinal fileprivate class ScanSink<ElementType, O: ObserverType> : Sink<O>, ObserverType {\n    typealias Accumulate = O.E\n    typealias Parent = Scan<ElementType, Accumulate>\n    typealias E = ElementType\n    \n    fileprivate let _parent: Parent\n    fileprivate var _accumulate: Accumulate\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        _accumulate = parent._seed\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<ElementType>) {\n        switch event {\n        case .next(let element):\n            do {\n                _accumulate = try _parent._accumulator(_accumulate, element)\n                forwardOn(.next(_accumulate))\n            }\n            catch let error {\n                forwardOn(.error(error))\n                dispose()\n            }\n        case .error(let error):\n            forwardOn(.error(error))\n            dispose()\n        case .completed:\n            forwardOn(.completed)\n            dispose()\n        }\n    }\n    \n}\n\nfinal fileprivate class Scan<Element, Accumulate>: Producer<Accumulate> {\n    typealias Accumulator = (Accumulate, Element) throws -> Accumulate\n    \n    fileprivate let _source: Observable<Element>\n    fileprivate let _seed: Accumulate\n    fileprivate let _accumulator: Accumulator\n    \n    init(source: Observable<Element>, seed: Accumulate, accumulator: @escaping Accumulator) {\n        _source = source\n        _seed = seed\n        _accumulator = accumulator\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Accumulate {\n        let sink = ScanSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = _source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Sequence.swift",
    "content": "//\n//  Sequence.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 11/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    // MARK: of\n\n    /**\n     This method creates a new Observable instance with a variable number of elements.\n\n     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)\n\n     - parameter elements: Elements to generate.\n     - parameter scheduler: Scheduler to send elements on. If `nil`, elements are sent immediately on subscription.\n     - returns: The observable sequence whose elements are pulled from the given arguments.\n     */\n    public static func of(_ elements: E ..., scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable<E> {\n        return ObservableSequence(elements: elements, scheduler: scheduler)\n    }\n}\n\nextension ObservableType {\n    /**\n     Converts an array to an observable sequence.\n\n     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)\n\n     - returns: The observable sequence whose elements are pulled from the given enumerable sequence.\n     */\n    public static func from(_ array: [E], scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable<E> {\n        return ObservableSequence(elements: array, scheduler: scheduler)\n    }\n\n    /**\n     Converts a sequence to an observable sequence.\n\n     - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html)\n\n     - returns: The observable sequence whose elements are pulled from the given enumerable sequence.\n     */\n    public static func from<S: Sequence>(_ sequence: S, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable<E> where S.Iterator.Element == E {\n        return ObservableSequence(elements: sequence, scheduler: scheduler)\n    }\n}\n\nfinal fileprivate class ObservableSequenceSink<S: Sequence, O: ObserverType> : Sink<O> where S.Iterator.Element == O.E {\n    typealias Parent = ObservableSequence<S>\n\n    private let _parent: Parent\n\n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func run() -> Disposable {\n        return _parent._scheduler.scheduleRecursive((_parent._elements.makeIterator(), _parent._elements)) { (iterator, recurse) in\n            var mutableIterator = iterator\n            if let next = mutableIterator.0.next() {\n                self.forwardOn(.next(next))\n                recurse(mutableIterator)\n            }\n            else {\n                self.forwardOn(.completed)\n                self.dispose()\n            }\n        }\n    }\n}\n\nfinal fileprivate class ObservableSequence<S: Sequence> : Producer<S.Iterator.Element> {\n    fileprivate let _elements: S\n    fileprivate let _scheduler: ImmediateSchedulerType\n\n    init(elements: S, scheduler: ImmediateSchedulerType) {\n        _elements = elements\n        _scheduler = scheduler\n    }\n\n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {\n        let sink = ObservableSequenceSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/ShareReplayScope.swift",
    "content": "//\n//  ShareReplayScope.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 5/28/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n/// Subject lifetime scope\npublic enum SubjectLifetimeScope {\n    /**\n     **Each connection will have it's own subject instance to store replay events.**\n     **Connections will be isolated from each another.**\n\n     Configures the underlying implementation to behave equivalent to.\n     \n     ```\n     source.multicast(makeSubject: { MySubject() }).refCount()\n     ```\n\n     **This is the recommended default.**\n\n     This has the following consequences:\n     * `retry` or `concat` operators will function as expected because terminating the sequence will clear internal state.\n     * Each connection to source observable sequence will use it's own subject.\n     * When the number of subscribers drops from 1 to 0 and connection to source sequence is disposed, subject will be cleared.\n\n     \n     ```\n     let xs = Observable.deferred { () -> Observable<TimeInterval> in\n             print(\"Performing work ...\")\n             return Observable.just(Date().timeIntervalSince1970)\n         }\n         .share(replay: 1, scope: .whileConnected)\n\n     _ = xs.subscribe(onNext: { print(\"next \\($0)\") }, onCompleted: { print(\"completed\\n\") })\n     _ = xs.subscribe(onNext: { print(\"next \\($0)\") }, onCompleted: { print(\"completed\\n\") })\n     _ = xs.subscribe(onNext: { print(\"next \\($0)\") }, onCompleted: { print(\"completed\\n\") })\n\n     ```\n\n     Notice how time interval is different and `Performing work ...` is printed each time)\n     \n     ```\n     Performing work ...\n     next 1495998900.82141\n     completed\n\n     Performing work ...\n     next 1495998900.82359\n     completed\n\n     Performing work ...\n     next 1495998900.82444\n     completed\n\n\n     ```\n     \n     */\n    case whileConnected\n\n    /**\n     **One subject will store replay events for all connections to source.**\n     **Connections won't be isolated from each another.**\n\n     Configures the underlying implementation behave equivalent to.\n\n     ```\n     source.multicast(MySubject()).refCount()\n     ```\n     \n     This has the following consequences:\n     * Using `retry` or `concat` operators after this operator usually isn't advised.\n     * Each connection to source observable sequence will share the same subject.\n     * After number of subscribers drops from 1 to 0 and connection to source observable sequence is dispose, this operator will \n       continue holding a reference to the same subject.\n       If at some later moment a new observer initiates a new connection to source it can potentially receive\n       some of the stale events received during previous connection.\n     * After source sequence terminates any new observer will always immediatelly receive replayed elements and terminal event.\n       No new subscriptions to source observable sequence will be attempted.\n\n     ```\n     let xs = Observable.deferred { () -> Observable<TimeInterval> in\n             print(\"Performing work ...\")\n             return Observable.just(Date().timeIntervalSince1970)\n         }\n         .share(replay: 1, scope: .forever)\n\n     _ = xs.subscribe(onNext: { print(\"next \\($0)\") }, onCompleted: { print(\"completed\\n\") })\n     _ = xs.subscribe(onNext: { print(\"next \\($0)\") }, onCompleted: { print(\"completed\\n\") })\n     _ = xs.subscribe(onNext: { print(\"next \\($0)\") }, onCompleted: { print(\"completed\\n\") })\n     ```\n     \n     Notice how time interval is the same, replayed, and `Performing work ...` is printed only once\n     \n     ```\n     Performing work ...\n     next 1495999013.76356\n     completed\n\n     next 1495999013.76356\n     completed\n\n     next 1495999013.76356\n     completed\n     ```\n     \n    */\n    case forever\n}\n\nextension ObservableType {\n\n    /**\n     Returns an observable sequence that **shares a single subscription to the underlying sequence**, and immediately upon subscription replays  elements in buffer.\n     \n     This operator is equivalent to:\n     * `.whileConnected`\n     ```\n     // Each connection will have it's own subject instance to store replay events.\n     // Connections will be isolated from each another.\n     source.multicast(makeSubject: { Replay.create(bufferSize: replay) }).refCount()\n     ```\n     * `.forever`\n     ```\n     // One subject will store replay events for all connections to source.\n     // Connections won't be isolated from each another.\n     source.multicast(Replay.create(bufferSize: replay)).refCount()\n     ```\n     \n     It uses optimized versions of the operators for most common operations.\n\n     - parameter replay: Maximum element count of the replay buffer.\n     - parameter scope: Lifetime scope of sharing subject. For more information see `SubjectLifetimeScope` enum.\n\n     - seealso: [shareReplay operator on reactivex.io](http://reactivex.io/documentation/operators/replay.html)\n\n     - returns: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n     */\n    public func share(replay: Int = 0, scope: SubjectLifetimeScope = .whileConnected)\n        -> Observable<E> {\n        switch scope {\n        case .forever:\n            switch replay {\n            case 0: return self.multicast(PublishSubject()).refCount()\n            default: return self.multicast(ReplaySubject.create(bufferSize: replay)).refCount()\n            }\n        case .whileConnected:\n            switch replay {\n            case 0: return ShareWhileConnected(source: self.asObservable())\n            case 1: return ShareReplay1WhileConnected(source: self.asObservable())\n            default: return self.multicast(makeSubject: { ReplaySubject.create(bufferSize: replay) }).refCount()\n            }\n        }\n    }\n}\n\nfileprivate final class ShareReplay1WhileConnectedConnection<Element>\n    : ObserverType\n    , SynchronizedUnsubscribeType {\n    typealias E = Element\n    typealias Observers = AnyObserver<Element>.s\n    typealias DisposeKey = Observers.KeyType\n\n    typealias Parent = ShareReplay1WhileConnected<Element>\n    private let _parent: Parent\n    private let _subscription = SingleAssignmentDisposable()\n\n    private let _lock: RecursiveLock\n    private var _disposed: Bool = false\n    fileprivate var _observers = Observers()\n    fileprivate var _element: Element?\n\n    init(parent: Parent, lock: RecursiveLock) {\n        _parent = parent\n        _lock = lock\n\n        #if TRACE_RESOURCES\n            _ = Resources.incrementTotal()\n        #endif\n    }\n\n    final func on(_ event: Event<E>) {\n        _lock.lock()\n        let observers = _synchronized_on(event)\n        _lock.unlock()\n        dispatch(observers, event)\n    }\n\n    final private func _synchronized_on(_ event: Event<E>) -> Observers {\n        if _disposed {\n            return Observers()\n        }\n\n        switch event {\n        case .next(let element):\n            _element = element\n            return _observers\n        case .error, .completed:\n            let observers = _observers\n            self._synchronized_dispose()\n            return observers\n        }\n    }\n\n    final func connect() {\n        _subscription.setDisposable(_parent._source.subscribe(self))\n    }\n\n    final func _synchronized_subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == Element {\n        _lock.lock(); defer { _lock.unlock() }\n        if let element = _element {\n            observer.on(.next(element))\n        }\n\n        let disposeKey = _observers.insert(observer.on)\n\n        return SubscriptionDisposable(owner: self, key: disposeKey)\n    }\n\n    final private func _synchronized_dispose() {\n        _disposed = true\n        if _parent._connection === self {\n            _parent._connection = nil\n        }\n        _observers = Observers()\n    }\n\n    final func synchronizedUnsubscribe(_ disposeKey: DisposeKey) {\n        _lock.lock()\n        let shouldDisconnect = _synchronized_unsubscribe(disposeKey)\n        _lock.unlock()\n        if shouldDisconnect {\n            _subscription.dispose()\n        }\n    }\n\n    @inline(__always)\n    final private func _synchronized_unsubscribe(_ disposeKey: DisposeKey) -> Bool {\n        // if already unsubscribed, just return\n        if self._observers.removeKey(disposeKey) == nil {\n            return false\n        }\n\n        if _observers.count == 0 {\n            _synchronized_dispose()\n            return true\n        }\n\n        return false\n    }\n\n    #if TRACE_RESOURCES\n        deinit {\n            _ = Resources.decrementTotal()\n        }\n    #endif\n}\n\n// optimized version of share replay for most common case\nfinal fileprivate class ShareReplay1WhileConnected<Element>\n    : Observable<Element> {\n\n    fileprivate typealias Connection = ShareReplay1WhileConnectedConnection<Element>\n\n    fileprivate let _source: Observable<Element>\n\n    fileprivate let _lock = RecursiveLock()\n\n    fileprivate var _connection: Connection?\n\n    init(source: Observable<Element>) {\n        self._source = source\n    }\n\n    override func subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == E {\n        _lock.lock()\n\n        let connection = _synchronized_subscribe(observer)\n        let count = connection._observers.count\n\n        let disposable = connection._synchronized_subscribe(observer)\n\n        _lock.unlock()\n        \n        if count == 0 {\n            connection.connect()\n        }\n\n        return disposable\n    }\n\n    @inline(__always)\n    private func _synchronized_subscribe<O : ObserverType>(_ observer: O) -> Connection where O.E == E {\n        let connection: Connection\n\n        if let existingConnection = _connection {\n            connection = existingConnection\n        }\n        else {\n            connection = ShareReplay1WhileConnectedConnection<Element>(\n                parent: self,\n                lock: _lock)\n            _connection = connection\n        }\n\n        return connection\n    }\n}\n\nfileprivate final class ShareWhileConnectedConnection<Element>\n    : ObserverType\n    , SynchronizedUnsubscribeType {\n    typealias E = Element\n    typealias Observers = AnyObserver<Element>.s\n    typealias DisposeKey = Observers.KeyType\n\n    typealias Parent = ShareWhileConnected<Element>\n    private let _parent: Parent\n    private let _subscription = SingleAssignmentDisposable()\n\n    private let _lock: RecursiveLock\n    private var _disposed: Bool = false\n    fileprivate var _observers = Observers()\n\n    init(parent: Parent, lock: RecursiveLock) {\n        _parent = parent\n        _lock = lock\n\n        #if TRACE_RESOURCES\n            _ = Resources.incrementTotal()\n        #endif\n    }\n\n    final func on(_ event: Event<E>) {\n        _lock.lock()\n        let observers = _synchronized_on(event)\n        _lock.unlock()\n        dispatch(observers, event)\n    }\n\n    final private func _synchronized_on(_ event: Event<E>) -> Observers {\n        if _disposed {\n            return Observers()\n        }\n\n        switch event {\n        case .next:\n            return _observers\n        case .error, .completed:\n            let observers = _observers\n            self._synchronized_dispose()\n            return observers\n        }\n    }\n\n    final func connect() {\n        _subscription.setDisposable(_parent._source.subscribe(self))\n    }\n\n    final func _synchronized_subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == Element {\n        _lock.lock(); defer { _lock.unlock() }\n\n        let disposeKey = _observers.insert(observer.on)\n\n        return SubscriptionDisposable(owner: self, key: disposeKey)\n    }\n\n    final private func _synchronized_dispose() {\n        _disposed = true\n        if _parent._connection === self {\n            _parent._connection = nil\n        }\n        _observers = Observers()\n    }\n\n    final func synchronizedUnsubscribe(_ disposeKey: DisposeKey) {\n        _lock.lock()\n        let shouldDisconnect = _synchronized_unsubscribe(disposeKey)\n        _lock.unlock()\n        if shouldDisconnect {\n            _subscription.dispose()\n        }\n    }\n\n    @inline(__always)\n    final private func _synchronized_unsubscribe(_ disposeKey: DisposeKey) -> Bool {\n        // if already unsubscribed, just return\n        if self._observers.removeKey(disposeKey) == nil {\n            return false\n        }\n\n        if _observers.count == 0 {\n            _synchronized_dispose()\n            return true\n        }\n\n        return false\n    }\n\n    #if TRACE_RESOURCES\n    deinit {\n        _ = Resources.decrementTotal()\n    }\n    #endif\n}\n\n// optimized version of share replay for most common case\nfinal fileprivate class ShareWhileConnected<Element>\n    : Observable<Element> {\n\n    fileprivate typealias Connection = ShareWhileConnectedConnection<Element>\n\n    fileprivate let _source: Observable<Element>\n\n    fileprivate let _lock = RecursiveLock()\n\n    fileprivate var _connection: Connection?\n\n    init(source: Observable<Element>) {\n        self._source = source\n    }\n\n    override func subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == E {\n        _lock.lock()\n\n        let connection = _synchronized_subscribe(observer)\n        let count = connection._observers.count\n\n        let disposable = connection._synchronized_subscribe(observer)\n\n        _lock.unlock()\n\n        if count == 0 {\n            connection.connect()\n        }\n\n        return disposable\n    }\n\n    @inline(__always)\n    private func _synchronized_subscribe<O : ObserverType>(_ observer: O) -> Connection where O.E == E {\n        let connection: Connection\n\n        if let existingConnection = _connection {\n            connection = existingConnection\n        }\n        else {\n            connection = ShareWhileConnectedConnection<Element>(\n                parent: self,\n                lock: _lock)\n            _connection = connection\n        }\n        \n        return connection\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/SingleAsync.swift",
    "content": "//\n//  SingleAsync.swift\n//  RxSwift\n//\n//  Created by Junior B. on 09/11/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     The single operator is similar to first, but throws a `RxError.noElements` or `RxError.moreThanOneElement`\n     if the source Observable does not emit exactly one element before successfully completing.\n\n     - seealso: [single operator on reactivex.io](http://reactivex.io/documentation/operators/first.html)\n\n     - returns: An observable sequence that emits a single element or throws an exception if more (or none) of them are emitted.\n     */\n    public func single()\n        -> Observable<E> {\n        return SingleAsync(source: asObservable())\n    }\n\n    /**\n     The single operator is similar to first, but throws a `RxError.NoElements` or `RxError.MoreThanOneElement`\n     if the source Observable does not emit exactly one element before successfully completing.\n\n     - seealso: [single operator on reactivex.io](http://reactivex.io/documentation/operators/first.html)\n\n     - parameter predicate: A function to test each source element for a condition.\n     - returns: An observable sequence that emits a single element or throws an exception if more (or none) of them are emitted.\n     */\n    public func single(_ predicate: @escaping (E) throws -> Bool)\n        -> Observable<E> {\n        return SingleAsync(source: asObservable(), predicate: predicate)\n    }\n}\n\nfileprivate final class SingleAsyncSink<O: ObserverType> : Sink<O>, ObserverType {\n    typealias ElementType = O.E\n    typealias Parent = SingleAsync<ElementType>\n    typealias E = ElementType\n    \n    private let _parent: Parent\n    private var _seenValue: Bool = false\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<E>) {\n        switch event {\n        case .next(let value):\n            do {\n                let forward = try _parent._predicate?(value) ?? true\n                if !forward {\n                    return\n                }\n            }\n            catch let error {\n                forwardOn(.error(error as Swift.Error))\n                dispose()\n                return\n            }\n\n            if _seenValue {\n                forwardOn(.error(RxError.moreThanOneElement))\n                dispose()\n                return\n            }\n\n            _seenValue = true\n            forwardOn(.next(value))\n        case .error:\n            forwardOn(event)\n            dispose()\n        case .completed:\n            if (_seenValue) {\n                forwardOn(.completed)\n            } else {\n                forwardOn(.error(RxError.noElements))\n            }\n            dispose()\n        }\n    }\n}\n\nfinal class SingleAsync<Element>: Producer<Element> {\n    typealias Predicate = (Element) throws -> Bool\n    \n    fileprivate let _source: Observable<Element>\n    fileprivate let _predicate: Predicate?\n    \n    init(source: Observable<Element>, predicate: Predicate? = nil) {\n        _source = source\n        _predicate = predicate\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = SingleAsyncSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = _source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Sink.swift",
    "content": "//\n//  Sink.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nclass Sink<O : ObserverType> : Disposable {\n    fileprivate let _observer: O\n    fileprivate let _cancel: Cancelable\n    fileprivate var _disposed: Bool\n\n    #if DEBUG\n        fileprivate let _synchronizationTracker = SynchronizationTracker()\n    #endif\n\n    init(observer: O, cancel: Cancelable) {\n#if TRACE_RESOURCES\n        let _ = Resources.incrementTotal()\n#endif\n        _observer = observer\n        _cancel = cancel\n        _disposed = false\n    }\n    \n    final func forwardOn(_ event: Event<O.E>) {\n        #if DEBUG\n            _synchronizationTracker.register(synchronizationErrorMessage: .default)\n            defer { _synchronizationTracker.unregister() }\n        #endif\n        if _disposed {\n            return\n        }\n        _observer.on(event)\n    }\n    \n    final func forwarder() -> SinkForward<O> {\n        return SinkForward(forward: self)\n    }\n\n    final var disposed: Bool {\n        return _disposed\n    }\n\n    func dispose() {\n        _disposed = true\n        _cancel.dispose()\n    }\n\n    deinit {\n#if TRACE_RESOURCES\n       let _ =  Resources.decrementTotal()\n#endif\n    }\n}\n\nfinal class SinkForward<O: ObserverType>: ObserverType {\n    typealias E = O.E\n    \n    private let _forward: Sink<O>\n    \n    init(forward: Sink<O>) {\n        _forward = forward\n    }\n    \n    final func on(_ event: Event<E>) {\n        switch event {\n        case .next:\n            _forward._observer.on(event)\n        case .error, .completed:\n            _forward._observer.on(event)\n            _forward._cancel.dispose()\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Skip.swift",
    "content": "//\n//  Skip.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 6/25/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n\n     - seealso: [skip operator on reactivex.io](http://reactivex.io/documentation/operators/skip.html)\n\n     - parameter count: The number of elements to skip before returning the remaining elements.\n     - returns: An observable sequence that contains the elements that occur after the specified index in the input sequence.\n     */\n    public func skip(_ count: Int)\n        -> Observable<E> {\n        return SkipCount(source: asObservable(), count: count)\n    }\n}\n\nextension ObservableType {\n\n    /**\n     Skips elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n\n     - seealso: [skip operator on reactivex.io](http://reactivex.io/documentation/operators/skip.html)\n\n     - parameter duration: Duration for skipping elements from the start of the sequence.\n     - parameter scheduler: Scheduler to run the timer on.\n     - returns: An observable sequence with the elements skipped during the specified duration from the start of the source sequence.\n     */\n    public func skip(_ duration: RxTimeInterval, scheduler: SchedulerType)\n        -> Observable<E> {\n        return SkipTime(source: self.asObservable(), duration: duration, scheduler: scheduler)\n    }\n}\n\n// count version\n\nfinal fileprivate class SkipCountSink<O: ObserverType> : Sink<O>, ObserverType {\n    typealias Element = O.E\n    typealias Parent = SkipCount<Element>\n    \n    let parent: Parent\n    \n    var remaining: Int\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        self.parent = parent\n        self.remaining = parent.count\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next(let value):\n            \n            if remaining <= 0 {\n                forwardOn(.next(value))\n            }\n            else {\n                remaining -= 1\n            }\n        case .error:\n            forwardOn(event)\n            self.dispose()\n        case .completed:\n            forwardOn(event)\n            self.dispose()\n        }\n    }\n    \n}\n\nfinal fileprivate class SkipCount<Element>: Producer<Element> {\n    let source: Observable<Element>\n    let count: Int\n    \n    init(source: Observable<Element>, count: Int) {\n        self.source = source\n        self.count = count\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = SkipCountSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = source.subscribe(sink)\n\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n// time version\n\nfinal fileprivate class SkipTimeSink<ElementType, O: ObserverType> : Sink<O>, ObserverType where O.E == ElementType {\n    typealias Parent = SkipTime<ElementType>\n    typealias Element = ElementType\n\n    let parent: Parent\n    \n    // state\n    var open = false\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        self.parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next(let value):\n            if open {\n                forwardOn(.next(value))\n            }\n        case .error:\n            forwardOn(event)\n            self.dispose()\n        case .completed:\n            forwardOn(event)\n            self.dispose()\n        }\n    }\n    \n    func tick() {\n        open = true\n    }\n    \n    func run() -> Disposable {\n        let disposeTimer = parent.scheduler.scheduleRelative((), dueTime: self.parent.duration) { _ in \n            self.tick()\n            return Disposables.create()\n        }\n        \n        let disposeSubscription = parent.source.subscribe(self)\n        \n        return Disposables.create(disposeTimer, disposeSubscription)\n    }\n}\n\nfinal fileprivate class SkipTime<Element>: Producer<Element> {\n    let source: Observable<Element>\n    let duration: RxTimeInterval\n    let scheduler: SchedulerType\n    \n    init(source: Observable<Element>, duration: RxTimeInterval, scheduler: SchedulerType) {\n        self.source = source\n        self.scheduler = scheduler\n        self.duration = duration\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = SkipTimeSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/SkipUntil.swift",
    "content": "//\n//  SkipUntil.swift\n//  RxSwift\n//\n//  Created by Yury Korolev on 10/3/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Returns the elements from the source observable sequence that are emitted after the other observable sequence produces an element.\n\n     - seealso: [skipUntil operator on reactivex.io](http://reactivex.io/documentation/operators/skipuntil.html)\n\n     - parameter other: Observable sequence that starts propagation of elements of the source sequence.\n     - returns: An observable sequence containing the elements of the source sequence that are emitted after the other sequence emits an item.\n     */\n    public func skipUntil<O: ObservableType>(_ other: O)\n        -> Observable<E> {\n        return SkipUntil(source: asObservable(), other: other.asObservable())\n    }\n}\n\nfinal fileprivate class SkipUntilSinkOther<Other, O: ObserverType>\n    : ObserverType\n    , LockOwnerType\n    , SynchronizedOnType {\n    typealias Parent = SkipUntilSink<Other, O>\n    typealias E = Other\n    \n    fileprivate let _parent: Parent\n\n    var _lock: RecursiveLock {\n        return _parent._lock\n    }\n    \n    let _subscription = SingleAssignmentDisposable()\n\n    init(parent: Parent) {\n        _parent = parent\n        #if TRACE_RESOURCES\n            let _ = Resources.incrementTotal()\n        #endif\n    }\n\n    func on(_ event: Event<E>) {\n        synchronizedOn(event)\n    }\n\n    func _synchronized_on(_ event: Event<E>) {\n        switch event {\n        case .next:\n            _parent._forwardElements = true\n            _subscription.dispose()\n        case .error(let e):\n            _parent.forwardOn(.error(e))\n            _parent.dispose()\n        case .completed:\n            _subscription.dispose()\n        }\n    }\n    \n    #if TRACE_RESOURCES\n    deinit {\n        let _ = Resources.decrementTotal()\n    }\n    #endif\n\n}\n\n\nfinal fileprivate class SkipUntilSink<Other, O: ObserverType>\n    : Sink<O>\n    , ObserverType\n    , LockOwnerType\n    , SynchronizedOnType {\n    typealias E = O.E\n    typealias Parent = SkipUntil<E, Other>\n    \n    let _lock = RecursiveLock()\n    fileprivate let _parent: Parent\n    fileprivate var _forwardElements = false\n    \n    fileprivate let _sourceSubscription = SingleAssignmentDisposable()\n\n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<E>) {\n        synchronizedOn(event)\n    }\n\n    func _synchronized_on(_ event: Event<E>) {\n        switch event {\n        case .next:\n            if _forwardElements {\n                forwardOn(event)\n            }\n        case .error:\n            forwardOn(event)\n            self.dispose()\n        case .completed:\n            if _forwardElements {\n                forwardOn(event)\n            }\n            self.dispose()\n        }\n    }\n    \n    func run() -> Disposable {\n        let sourceSubscription = _parent._source.subscribe(self)\n        let otherObserver = SkipUntilSinkOther(parent: self)\n        let otherSubscription = _parent._other.subscribe(otherObserver)\n        _sourceSubscription.setDisposable(sourceSubscription)\n        otherObserver._subscription.setDisposable(otherSubscription)\n        \n        return Disposables.create(_sourceSubscription, otherObserver._subscription)\n    }\n}\n\nfinal fileprivate class SkipUntil<Element, Other>: Producer<Element> {\n    \n    fileprivate let _source: Observable<Element>\n    fileprivate let _other: Observable<Other>\n    \n    init(source: Observable<Element>, other: Observable<Other>) {\n        _source = source\n        _other = other\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = SkipUntilSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/SkipWhile.swift",
    "content": "//\n//  SkipWhile.swift\n//  RxSwift\n//\n//  Created by Yury Korolev on 10/9/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n\n     - seealso: [skipWhile operator on reactivex.io](http://reactivex.io/documentation/operators/skipwhile.html)\n\n     - parameter predicate: A function to test each element for a condition.\n     - returns: An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n     */\n    public func skipWhile(_ predicate: @escaping (E) throws -> Bool) -> Observable<E> {\n        return SkipWhile(source: asObservable(), predicate: predicate)\n    }\n}\n\nfinal fileprivate class SkipWhileSink<O: ObserverType> : Sink<O>, ObserverType {\n\n    typealias Element = O.E\n    typealias Parent = SkipWhile<Element>\n\n    fileprivate let _parent: Parent\n    fileprivate var _running = false\n\n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next(let value):\n            if !_running {\n                do {\n                    _running = try !_parent._predicate(value)\n                } catch let e {\n                    forwardOn(.error(e))\n                    dispose()\n                    return\n                }\n            }\n\n            if _running {\n                forwardOn(.next(value))\n            }\n        case .error, .completed:\n            forwardOn(event)\n            dispose()\n        }\n    }\n}\n\nfinal fileprivate class SkipWhile<Element>: Producer<Element> {\n    typealias Predicate = (Element) throws -> Bool\n    typealias PredicateWithIndex = (Element, Int) throws -> Bool\n\n    fileprivate let _source: Observable<Element>\n    fileprivate let _predicate: Predicate\n\n    init(source: Observable<Element>, predicate: @escaping Predicate) {\n        _source = source\n        _predicate = predicate\n    }\n\n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = SkipWhileSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = _source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/StartWith.swift",
    "content": "//\n//  StartWith.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 4/6/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Prepends a sequence of values to an observable sequence.\n\n     - seealso: [startWith operator on reactivex.io](http://reactivex.io/documentation/operators/startwith.html)\n\n     - parameter elements: Elements to prepend to the specified sequence.\n     - returns: The source sequence prepended with the specified values.\n     */\n    public func startWith(_ elements: E ...)\n        -> Observable<E> {\n            return StartWith(source: self.asObservable(), elements: elements)\n    }\n}\n\nfinal fileprivate class StartWith<Element>: Producer<Element> {\n    let elements: [Element]\n    let source: Observable<Element>\n\n    init(source: Observable<Element>, elements: [Element]) {\n        self.source = source\n        self.elements = elements\n        super.init()\n    }\n\n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        for e in elements {\n            observer.on(.next(e))\n        }\n\n        return (sink: Disposables.create(), subscription: source.subscribe(observer))\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/SubscribeOn.swift",
    "content": "//\n//  SubscribeOn.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 6/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Wraps the source sequence in order to run its subscription and unsubscription logic on the specified\n     scheduler.\n\n     This operation is not commonly used.\n\n     This only performs the side-effects of subscription and unsubscription on the specified scheduler.\n\n     In order to invoke observer callbacks on a `scheduler`, use `observeOn`.\n\n     - seealso: [subscribeOn operator on reactivex.io](http://reactivex.io/documentation/operators/subscribeon.html)\n\n     - parameter scheduler: Scheduler to perform subscription and unsubscription actions on.\n     - returns: The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n     */\n    public func subscribeOn(_ scheduler: ImmediateSchedulerType)\n        -> Observable<E> {\n        return SubscribeOn(source: self, scheduler: scheduler)\n    }\n}\n\nfinal fileprivate class SubscribeOnSink<Ob: ObservableType, O: ObserverType> : Sink<O>, ObserverType where Ob.E == O.E {\n    typealias Element = O.E\n    typealias Parent = SubscribeOn<Ob>\n    \n    let parent: Parent\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        self.parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>) {\n        forwardOn(event)\n        \n        if event.isStopEvent {\n            self.dispose()\n        }\n    }\n    \n    func run() -> Disposable {\n        let disposeEverything = SerialDisposable()\n        let cancelSchedule = SingleAssignmentDisposable()\n        \n        disposeEverything.disposable = cancelSchedule\n        \n        let disposeSchedule = parent.scheduler.schedule(()) { (_) -> Disposable in\n            let subscription = self.parent.source.subscribe(self)\n            disposeEverything.disposable = ScheduledDisposable(scheduler: self.parent.scheduler, disposable: subscription)\n            return Disposables.create()\n        }\n\n        cancelSchedule.setDisposable(disposeSchedule)\n    \n        return disposeEverything\n    }\n}\n\nfinal fileprivate class SubscribeOn<Ob: ObservableType> : Producer<Ob.E> {\n    let source: Ob\n    let scheduler: ImmediateSchedulerType\n    \n    init(source: Ob, scheduler: ImmediateSchedulerType) {\n        self.source = source\n        self.scheduler = scheduler\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Ob.E {\n        let sink = SubscribeOnSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Switch.swift",
    "content": "//\n//  Switch.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/12/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Projects each element of an observable sequence into a new sequence of observable sequences and then\n     transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n\n     It is a combination of `map` + `switchLatest` operator\n\n     - seealso: [flatMapLatest operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html)\n\n     - parameter selector: A transform function to apply to each element.\n     - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source producing an\n     Observable of Observable sequences and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n     */\n    public func flatMapLatest<O: ObservableConvertibleType>(_ selector: @escaping (E) throws -> O)\n        -> Observable<O.E> {\n            return FlatMapLatest(source: asObservable(), selector: selector)\n    }\n}\n\nextension ObservableType where E : ObservableConvertibleType {\n\n    /**\n     Transforms an observable sequence of observable sequences into an observable sequence\n     producing values only from the most recent observable sequence.\n\n     Each time a new inner observable sequence is received, unsubscribe from the\n     previous inner observable sequence.\n\n     - seealso: [switch operator on reactivex.io](http://reactivex.io/documentation/operators/switch.html)\n\n     - returns: The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n     */\n    public func switchLatest() -> Observable<E.E> {\n        return Switch(source: asObservable())\n    }\n}\n\nfileprivate class SwitchSink<SourceType, S: ObservableConvertibleType, O: ObserverType>\n    : Sink<O>\n    , ObserverType where S.E == O.E {\n    typealias E = SourceType\n\n    fileprivate let _subscriptions: SingleAssignmentDisposable = SingleAssignmentDisposable()\n    fileprivate let _innerSubscription: SerialDisposable = SerialDisposable()\n\n    let _lock = RecursiveLock()\n    \n    // state\n    fileprivate var _stopped = false\n    fileprivate var _latest = 0\n    fileprivate var _hasLatest = false\n    \n    override init(observer: O, cancel: Cancelable) {\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run(_ source: Observable<SourceType>) -> Disposable {\n        let subscription = source.subscribe(self)\n        _subscriptions.setDisposable(subscription)\n        return Disposables.create(_subscriptions, _innerSubscription)\n    }\n\n    func performMap(_ element: SourceType) throws -> S {\n        rxAbstractMethod()\n    }\n\n    @inline(__always)\n    final private func nextElementArrived(element: E) -> (Int, Observable<S.E>)? {\n        _lock.lock(); defer { _lock.unlock() } // {\n            do {\n                let observable = try performMap(element).asObservable()\n                _hasLatest = true\n                _latest = _latest &+ 1\n                return (_latest, observable)\n            }\n            catch let error {\n                forwardOn(.error(error))\n                dispose()\n            }\n\n            return nil\n        // }\n    }\n\n    func on(_ event: Event<E>) {\n        switch event {\n        case .next(let element):\n            if let (latest, observable) = nextElementArrived(element: element) {\n                let d = SingleAssignmentDisposable()\n                _innerSubscription.disposable = d\n                   \n                let observer = SwitchSinkIter(parent: self, id: latest, _self: d)\n                let disposable = observable.subscribe(observer)\n                d.setDisposable(disposable)\n            }\n        case .error(let error):\n            _lock.lock(); defer { _lock.unlock() }\n            forwardOn(.error(error))\n            dispose()\n        case .completed:\n            _lock.lock(); defer { _lock.unlock() }\n            _stopped = true\n            \n            _subscriptions.dispose()\n            \n            if !_hasLatest {\n                forwardOn(.completed)\n                dispose()\n            }\n        }\n    }\n}\n\nfinal fileprivate class SwitchSinkIter<SourceType, S: ObservableConvertibleType, O: ObserverType>\n    : ObserverType\n    , LockOwnerType\n    , SynchronizedOnType where S.E == O.E {\n    typealias E = S.E\n    typealias Parent = SwitchSink<SourceType, S, O>\n    \n    fileprivate let _parent: Parent\n    fileprivate let _id: Int\n    fileprivate let _self: Disposable\n\n    var _lock: RecursiveLock {\n        return _parent._lock\n    }\n\n    init(parent: Parent, id: Int, _self: Disposable) {\n        _parent = parent\n        _id = id\n        self._self = _self\n    }\n    \n    func on(_ event: Event<E>) {\n        synchronizedOn(event)\n    }\n\n    func _synchronized_on(_ event: Event<E>) {\n        switch event {\n        case .next: break\n        case .error, .completed:\n            _self.dispose()\n        }\n        \n        if _parent._latest != _id {\n            return\n        }\n       \n        switch event {\n        case .next:\n            _parent.forwardOn(event)\n        case .error:\n            _parent.forwardOn(event)\n            _parent.dispose()\n        case .completed:\n            _parent._hasLatest = false\n            if _parent._stopped {\n                _parent.forwardOn(event)\n                _parent.dispose()\n            }\n        }\n    }\n}\n\n// MARK: Specializations\n\nfinal fileprivate class SwitchIdentitySink<S: ObservableConvertibleType, O: ObserverType> : SwitchSink<S, S, O> where O.E == S.E {\n    override init(observer: O, cancel: Cancelable) {\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    override func performMap(_ element: S) throws -> S {\n        return element\n    }\n}\n\nfinal fileprivate class MapSwitchSink<SourceType, S: ObservableConvertibleType, O: ObserverType> : SwitchSink<SourceType, S, O> where O.E == S.E {\n    typealias Selector = (SourceType) throws -> S\n\n    fileprivate let _selector: Selector\n\n    init(selector: @escaping Selector, observer: O, cancel: Cancelable) {\n        _selector = selector\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    override func performMap(_ element: SourceType) throws -> S {\n        return try _selector(element)\n    }\n}\n\n// MARK: Producers\n\nfinal fileprivate class Switch<S: ObservableConvertibleType> : Producer<S.E> {\n    fileprivate let _source: Observable<S>\n    \n    init(source: Observable<S>) {\n        _source = source\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == S.E {\n        let sink = SwitchIdentitySink<S, O>(observer: observer, cancel: cancel)\n        let subscription = sink.run(_source)\n        return (sink: sink, subscription: subscription)\n    }\n}\n\nfinal fileprivate class FlatMapLatest<SourceType, S: ObservableConvertibleType> : Producer<S.E> {\n    typealias Selector = (SourceType) throws -> S\n\n    fileprivate let _source: Observable<SourceType>\n    fileprivate let _selector: Selector\n\n    init(source: Observable<SourceType>, selector: @escaping Selector) {\n        _source = source\n        _selector = selector\n    }\n\n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == S.E {\n        let sink = MapSwitchSink<SourceType, S, O>(selector: _selector, observer: observer, cancel: cancel)\n        let subscription = sink.run(_source)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/SwitchIfEmpty.swift",
    "content": "//\n//  SwitchIfEmpty.swift\n//  RxSwift\n//\n//  Created by sergdort on 23/12/2016.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Returns the elements of the specified sequence or `switchTo` sequence if the sequence is empty.\n\n     - seealso: [DefaultIfEmpty operator on reactivex.io](http://reactivex.io/documentation/operators/defaultifempty.html)\n\n     - parameter switchTo: Observable sequence being returned when source sequence is empty.\n     - returns: Observable sequence that contains elements from switchTo sequence if source is empty, otherwise returns source sequence elements.\n     */\n    public func ifEmpty(switchTo other: Observable<E>) -> Observable<E> {\n        return SwitchIfEmpty(source: asObservable(), ifEmpty: other)\n    }\n}\n\nfinal fileprivate class SwitchIfEmpty<Element>: Producer<Element> {\n    \n    private let _source: Observable<E>\n    private let _ifEmpty: Observable<E>\n    \n    init(source: Observable<E>, ifEmpty: Observable<E>) {\n        _source = source\n        _ifEmpty = ifEmpty\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = SwitchIfEmptySink(ifEmpty: _ifEmpty,\n                                     observer: observer,\n                                     cancel: cancel)\n        let subscription = sink.run(_source.asObservable())\n        \n        return (sink: sink, subscription: subscription)\n    }\n}\n\nfinal fileprivate class SwitchIfEmptySink<O: ObserverType>: Sink<O>\n    , ObserverType {\n    typealias E = O.E\n    \n    private let _ifEmpty: Observable<E>\n    private var _isEmpty = true\n    private let _ifEmptySubscription = SingleAssignmentDisposable()\n    \n    init(ifEmpty: Observable<E>, observer: O, cancel: Cancelable) {\n        _ifEmpty = ifEmpty\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run(_ source: Observable<O.E>) -> Disposable {\n        let subscription = source.subscribe(self)\n        return Disposables.create(subscription, _ifEmptySubscription)\n    }\n    \n    func on(_ event: Event<E>) {\n        switch event {\n        case .next:\n            _isEmpty = false\n            forwardOn(event)\n        case .error:\n            forwardOn(event)\n            dispose()\n        case .completed:\n            guard _isEmpty else {\n                forwardOn(.completed)\n                dispose()\n                return\n            }\n            let ifEmptySink = SwitchIfEmptySinkIter(parent: self)\n            _ifEmptySubscription.setDisposable(_ifEmpty.subscribe(ifEmptySink))\n        }\n    }\n}\n\nfinal fileprivate class SwitchIfEmptySinkIter<O: ObserverType>\n    : ObserverType {\n    typealias E = O.E\n    typealias Parent = SwitchIfEmptySink<O>\n    \n    private let _parent: Parent\n\n    init(parent: Parent) {\n        _parent = parent\n    }\n    \n    func on(_ event: Event<E>) {\n        switch event {\n        case .next:\n            _parent.forwardOn(event)\n        case .error:\n            _parent.forwardOn(event)\n            _parent.dispose()\n        case .completed:\n            _parent.forwardOn(event)\n            _parent.dispose()\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Take.swift",
    "content": "//\n//  Take.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 6/12/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Returns a specified number of contiguous elements from the start of an observable sequence.\n\n     - seealso: [take operator on reactivex.io](http://reactivex.io/documentation/operators/take.html)\n\n     - parameter count: The number of elements to return.\n     - returns: An observable sequence that contains the specified number of elements from the start of the input sequence.\n     */\n    public func take(_ count: Int)\n        -> Observable<E> {\n        if count == 0 {\n            return Observable.empty()\n        }\n        else {\n            return TakeCount(source: asObservable(), count: count)\n        }\n    }\n}\n\nextension ObservableType {\n\n    /**\n     Takes elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n\n     - seealso: [take operator on reactivex.io](http://reactivex.io/documentation/operators/take.html)\n\n     - parameter duration: Duration for taking elements from the start of the sequence.\n     - parameter scheduler: Scheduler to run the timer on.\n     - returns: An observable sequence with the elements taken during the specified duration from the start of the source sequence.\n     */\n    public func take(_ duration: RxTimeInterval, scheduler: SchedulerType)\n        -> Observable<E> {\n        return TakeTime(source: self.asObservable(), duration: duration, scheduler: scheduler)\n    }\n}\n\n// count version\n\nfinal fileprivate class TakeCountSink<O: ObserverType> : Sink<O>, ObserverType {\n    typealias E = O.E\n    typealias Parent = TakeCount<E>\n    \n    private let _parent: Parent\n    \n    private var _remaining: Int\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        _remaining = parent._count\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<E>) {\n        switch event {\n        case .next(let value):\n            \n            if _remaining > 0 {\n                _remaining -= 1\n                \n                forwardOn(.next(value))\n            \n                if _remaining == 0 {\n                    forwardOn(.completed)\n                    dispose()\n                }\n            }\n        case .error:\n            forwardOn(event)\n            dispose()\n        case .completed:\n            forwardOn(event)\n            dispose()\n        }\n    }\n    \n}\n\nfinal fileprivate class TakeCount<Element>: Producer<Element> {\n    fileprivate let _source: Observable<Element>\n    fileprivate let _count: Int\n    \n    init(source: Observable<Element>, count: Int) {\n        if count < 0 {\n            rxFatalError(\"count can't be negative\")\n        }\n        _source = source\n        _count = count\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = TakeCountSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = _source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n// time version\n\nfinal fileprivate class TakeTimeSink<ElementType, O: ObserverType>\n    : Sink<O>\n    , LockOwnerType\n    , ObserverType\n    , SynchronizedOnType where O.E == ElementType {\n    typealias Parent = TakeTime<ElementType>\n    typealias E = ElementType\n\n    fileprivate let _parent: Parent\n    \n    let _lock = RecursiveLock()\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<E>) {\n        synchronizedOn(event)\n    }\n\n    func _synchronized_on(_ event: Event<E>) {\n        switch event {\n        case .next(let value):\n            forwardOn(.next(value))\n        case .error:\n            forwardOn(event)\n            dispose()\n        case .completed:\n            forwardOn(event)\n            dispose()\n        }\n    }\n    \n    func tick() {\n        _lock.lock(); defer { _lock.unlock() }\n\n        forwardOn(.completed)\n        dispose()\n    }\n    \n    func run() -> Disposable {\n        let disposeTimer = _parent._scheduler.scheduleRelative((), dueTime: _parent._duration) { _ in\n            self.tick()\n            return Disposables.create()\n        }\n        \n        let disposeSubscription = _parent._source.subscribe(self)\n        \n        return Disposables.create(disposeTimer, disposeSubscription)\n    }\n}\n\nfinal fileprivate class TakeTime<Element> : Producer<Element> {\n    typealias TimeInterval = RxTimeInterval\n    \n    fileprivate let _source: Observable<Element>\n    fileprivate let _duration: TimeInterval\n    fileprivate let _scheduler: SchedulerType\n    \n    init(source: Observable<Element>, duration: TimeInterval, scheduler: SchedulerType) {\n        _source = source\n        _scheduler = scheduler\n        _duration = duration\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = TakeTimeSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/TakeLast.swift",
    "content": "//\n//  TakeLast.swift\n//  RxSwift\n//\n//  Created by Tomi Koskinen on 25/10/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Returns a specified number of contiguous elements from the end of an observable sequence.\n\n     This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.\n\n     - seealso: [takeLast operator on reactivex.io](http://reactivex.io/documentation/operators/takelast.html)\n\n     - parameter count: Number of elements to take from the end of the source sequence.\n     - returns: An observable sequence containing the specified number of elements from the end of the source sequence.\n     */\n    public func takeLast(_ count: Int)\n        -> Observable<E> {\n        return TakeLast(source: asObservable(), count: count)\n    }\n}\n\nfinal fileprivate class TakeLastSink<O: ObserverType> : Sink<O>, ObserverType {\n    typealias E = O.E\n    typealias Parent = TakeLast<E>\n    \n    private let _parent: Parent\n    \n    private var _elements: Queue<E>\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        _elements = Queue<E>(capacity: parent._count + 1)\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<E>) {\n        switch event {\n        case .next(let value):\n            _elements.enqueue(value)\n            if _elements.count > self._parent._count {\n                let _ = _elements.dequeue()\n            }\n        case .error:\n            forwardOn(event)\n            dispose()\n        case .completed:\n            for e in _elements {\n                forwardOn(.next(e))\n            }\n            forwardOn(.completed)\n            dispose()\n        }\n    }\n}\n\nfinal fileprivate class TakeLast<Element>: Producer<Element> {\n    fileprivate let _source: Observable<Element>\n    fileprivate let _count: Int\n    \n    init(source: Observable<Element>, count: Int) {\n        if count < 0 {\n            rxFatalError(\"count can't be negative\")\n        }\n        _source = source\n        _count = count\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = TakeLastSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = _source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/TakeUntil.swift",
    "content": "//\n//  TakeUntil.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 6/7/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Returns the elements from the source observable sequence until the other observable sequence produces an element.\n\n     - seealso: [takeUntil operator on reactivex.io](http://reactivex.io/documentation/operators/takeuntil.html)\n\n     - parameter other: Observable sequence that terminates propagation of elements of the source sequence.\n     - returns: An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n     */\n    public func takeUntil<O: ObservableType>(_ other: O)\n        -> Observable<E> {\n        return TakeUntil(source: asObservable(), other: other.asObservable())\n    }\n}\n\nfinal fileprivate class TakeUntilSinkOther<Other, O: ObserverType>\n    : ObserverType\n    , LockOwnerType\n    , SynchronizedOnType {\n    typealias Parent = TakeUntilSink<Other, O>\n    typealias E = Other\n    \n    fileprivate let _parent: Parent\n\n    var _lock: RecursiveLock {\n        return _parent._lock\n    }\n    \n    fileprivate let _subscription = SingleAssignmentDisposable()\n    \n    init(parent: Parent) {\n        _parent = parent\n#if TRACE_RESOURCES\n        let _ = Resources.incrementTotal()\n#endif\n    }\n    \n    func on(_ event: Event<E>) {\n        synchronizedOn(event)\n    }\n\n    func _synchronized_on(_ event: Event<E>) {\n        switch event {\n        case .next:\n            _parent.forwardOn(.completed)\n            _parent.dispose()\n        case .error(let e):\n            _parent.forwardOn(.error(e))\n            _parent.dispose()\n        case .completed:\n            _subscription.dispose()\n        }\n    }\n    \n#if TRACE_RESOURCES\n    deinit {\n        let _ = Resources.decrementTotal()\n    }\n#endif\n}\n\nfinal fileprivate class TakeUntilSink<Other, O: ObserverType>\n    : Sink<O>\n    , LockOwnerType\n    , ObserverType\n    , SynchronizedOnType {\n    typealias E = O.E\n    typealias Parent = TakeUntil<E, Other>\n    \n    fileprivate let _parent: Parent\n \n    let _lock = RecursiveLock()\n    \n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<E>) {\n        synchronizedOn(event)\n    }\n\n    func _synchronized_on(_ event: Event<E>) {\n        switch event {\n        case .next:\n            forwardOn(event)\n        case .error:\n            forwardOn(event)\n            dispose()\n        case .completed:\n            forwardOn(event)\n            dispose()\n        }\n    }\n    \n    func run() -> Disposable {\n        let otherObserver = TakeUntilSinkOther(parent: self)\n        let otherSubscription = _parent._other.subscribe(otherObserver)\n        otherObserver._subscription.setDisposable(otherSubscription)\n        let sourceSubscription = _parent._source.subscribe(self)\n        \n        return Disposables.create(sourceSubscription, otherObserver._subscription)\n    }\n}\n\nfinal fileprivate class TakeUntil<Element, Other>: Producer<Element> {\n    \n    fileprivate let _source: Observable<Element>\n    fileprivate let _other: Observable<Other>\n    \n    init(source: Observable<Element>, other: Observable<Other>) {\n        _source = source\n        _other = other\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = TakeUntilSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/TakeWhile.swift",
    "content": "//\n//  TakeWhile.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 6/7/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Returns elements from an observable sequence as long as a specified condition is true.\n\n     - seealso: [takeWhile operator on reactivex.io](http://reactivex.io/documentation/operators/takewhile.html)\n\n     - parameter predicate: A function to test each element for a condition.\n     - returns: An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n     */\n    public func takeWhile(_ predicate: @escaping (E) throws -> Bool)\n        -> Observable<E> {\n        return TakeWhile(source: asObservable(), predicate: predicate)\n    }\n}\n\nfinal fileprivate class TakeWhileSink<O: ObserverType>\n    : Sink<O>\n    , ObserverType {\n    typealias Element = O.E\n    typealias Parent = TakeWhile<Element>\n\n    fileprivate let _parent: Parent\n\n    fileprivate var _running = true\n\n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<Element>) {\n        switch event {\n        case .next(let value):\n            if !_running {\n                return\n            }\n            \n            do {\n                _running = try _parent._predicate(value)\n            } catch let e {\n                forwardOn(.error(e))\n                dispose()\n                return\n            }\n            \n            if _running {\n                forwardOn(.next(value))\n            } else {\n                forwardOn(.completed)\n                dispose()\n            }\n        case .error, .completed:\n            forwardOn(event)\n            dispose()\n        }\n    }\n    \n}\n\nfinal fileprivate class TakeWhile<Element>: Producer<Element> {\n    typealias Predicate = (Element) throws -> Bool\n\n    fileprivate let _source: Observable<Element>\n    fileprivate let _predicate: Predicate\n\n    init(source: Observable<Element>, predicate: @escaping Predicate) {\n        _source = source\n        _predicate = predicate\n    }\n\n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = TakeWhileSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = _source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Throttle.swift",
    "content": "//\n//  Throttle.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/22/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport struct Foundation.Date\n\nextension ObservableType {\n\n    /**\n     Returns an Observable that emits the first and the latest item emitted by the source Observable during sequential time windows of a specified duration.\n\n     This operator makes sure that no two elements are emitted in less then dueTime.\n\n     - seealso: [debounce operator on reactivex.io](http://reactivex.io/documentation/operators/debounce.html)\n\n     - parameter dueTime: Throttling duration for each element.\n     - parameter latest: Should latest element received in a dueTime wide time window since last element emission be emitted.\n     - parameter scheduler: Scheduler to run the throttle timers on.\n     - returns: The throttled sequence.\n     */\n    public func throttle(_ dueTime: RxTimeInterval, latest: Bool = true, scheduler: SchedulerType)\n        -> Observable<E> {\n        return Throttle(source: self.asObservable(), dueTime: dueTime, latest: latest, scheduler: scheduler)\n    }\n}\n\nfinal fileprivate class ThrottleSink<O: ObserverType>\n    : Sink<O>\n    , ObserverType\n    , LockOwnerType\n    , SynchronizedOnType {\n    typealias Element = O.E\n    typealias ParentType = Throttle<Element>\n    \n    private let _parent: ParentType\n    \n    let _lock = RecursiveLock()\n    \n    // state\n    private var _lastUnsentElement: Element? = nil\n    private var _lastSentTime: Date? = nil\n    private var _completed: Bool = false\n\n    let cancellable = SerialDisposable()\n    \n    init(parent: ParentType, observer: O, cancel: Cancelable) {\n        _parent = parent\n        \n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        let subscription = _parent._source.subscribe(self)\n        \n        return Disposables.create(subscription, cancellable)\n    }\n\n    func on(_ event: Event<Element>) {\n        synchronizedOn(event)\n    }\n\n    func _synchronized_on(_ event: Event<Element>) {\n        switch event {\n        case .next(let element):\n            let now = _parent._scheduler.now\n\n            let timeIntervalSinceLast: RxTimeInterval\n\n            if let lastSendingTime = _lastSentTime {\n                timeIntervalSinceLast = now.timeIntervalSince(lastSendingTime)\n            }\n            else {\n                timeIntervalSinceLast = _parent._dueTime\n            }\n\n            let couldSendNow = timeIntervalSinceLast >= _parent._dueTime\n\n            if couldSendNow {\n                self.sendNow(element: element)\n                return\n            }\n\n            if !_parent._latest {\n                return\n            }\n\n            let isThereAlreadyInFlightRequest = _lastUnsentElement != nil\n            \n            _lastUnsentElement = element\n\n            if isThereAlreadyInFlightRequest {\n                return\n            }\n\n            let scheduler = _parent._scheduler\n            let dueTime = _parent._dueTime\n\n            let d = SingleAssignmentDisposable()\n            self.cancellable.disposable = d\n\n            d.setDisposable(scheduler.scheduleRelative(0, dueTime: dueTime - timeIntervalSinceLast, action: self.propagate))\n        case .error:\n            _lastUnsentElement = nil\n            forwardOn(event)\n            dispose()\n        case .completed:\n            if let _ = _lastUnsentElement {\n                _completed = true\n            }\n            else {\n                forwardOn(.completed)\n                dispose()\n            }\n        }\n    }\n\n    private func sendNow(element: Element) {\n        _lastUnsentElement = nil\n        self.forwardOn(.next(element))\n        // in case element processing takes a while, this should give some more room\n        _lastSentTime = _parent._scheduler.now\n    }\n    \n    func propagate(_: Int) -> Disposable {\n        _lock.lock(); defer { _lock.unlock() } // {\n            if let lastUnsentElement = _lastUnsentElement {\n                sendNow(element: lastUnsentElement)\n            }\n\n            if _completed {\n                forwardOn(.completed)\n                dispose()\n            }\n        // }\n        return Disposables.create()\n    }\n}\n\nfinal fileprivate class Throttle<Element> : Producer<Element> {\n    \n    fileprivate let _source: Observable<Element>\n    fileprivate let _dueTime: RxTimeInterval\n    fileprivate let _latest: Bool\n    fileprivate let _scheduler: SchedulerType\n\n    init(source: Observable<Element>, dueTime: RxTimeInterval, latest: Bool, scheduler: SchedulerType) {\n        _source = source\n        _dueTime = dueTime\n        _latest = latest\n        _scheduler = scheduler\n    }\n    \n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = ThrottleSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n    \n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Timeout.swift",
    "content": "//\n//  Timeout.swift\n//  RxSwift\n//\n//  Created by Tomi Koskinen on 13/11/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Applies a timeout policy for each element in the observable sequence. If the next element isn't received within the specified timeout duration starting from its predecessor, a TimeoutError is propagated to the observer.\n\n     - seealso: [timeout operator on reactivex.io](http://reactivex.io/documentation/operators/timeout.html)\n\n     - parameter dueTime: Maximum duration between values before a timeout occurs.\n     - parameter scheduler: Scheduler to run the timeout timer on.\n     - returns: An observable sequence with a `RxError.timeout` in case of a timeout.\n     */\n    public func timeout(_ dueTime: RxTimeInterval, scheduler: SchedulerType)\n        -> Observable<E> {\n            return Timeout(source: self.asObservable(), dueTime: dueTime, other: Observable.error(RxError.timeout), scheduler: scheduler)\n    }\n\n    /**\n     Applies a timeout policy for each element in the observable sequence, using the specified scheduler to run timeout timers. If the next element isn't received within the specified timeout duration starting from its predecessor, the other observable sequence is used to produce future messages from that point on.\n\n     - seealso: [timeout operator on reactivex.io](http://reactivex.io/documentation/operators/timeout.html)\n\n     - parameter dueTime: Maximum duration between values before a timeout occurs.\n     - parameter other: Sequence to return in case of a timeout.\n     - parameter scheduler: Scheduler to run the timeout timer on.\n     - returns: The source sequence switching to the other sequence in case of a timeout.\n     */\n    public func timeout<O: ObservableConvertibleType>(_ dueTime: RxTimeInterval, other: O, scheduler: SchedulerType)\n        -> Observable<E> where E == O.E {\n            return Timeout(source: self.asObservable(), dueTime: dueTime, other: other.asObservable(), scheduler: scheduler)\n    }\n}\n\nfinal fileprivate class TimeoutSink<O: ObserverType>: Sink<O>, LockOwnerType, ObserverType {\n    typealias E = O.E\n    typealias Parent = Timeout<E>\n    \n    private let _parent: Parent\n    \n    let _lock = RecursiveLock()\n\n    private let _timerD = SerialDisposable()\n    private let _subscription = SerialDisposable()\n    \n    private var _id = 0\n    private var _switched = false\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        let original = SingleAssignmentDisposable()\n        _subscription.disposable = original\n        \n        _createTimeoutTimer()\n        \n        original.setDisposable(_parent._source.subscribe(self))\n        \n        return Disposables.create(_subscription, _timerD)\n    }\n\n    func on(_ event: Event<E>) {\n        switch event {\n        case .next:\n            var onNextWins = false\n            \n            _lock.performLocked() {\n                onNextWins = !self._switched\n                if onNextWins {\n                    self._id = self._id &+ 1\n                }\n            }\n            \n            if onNextWins {\n                forwardOn(event)\n                self._createTimeoutTimer()\n            }\n        case .error, .completed:\n            var onEventWins = false\n            \n            _lock.performLocked() {\n                onEventWins = !self._switched\n                if onEventWins {\n                    self._id = self._id &+ 1\n                }\n            }\n            \n            if onEventWins {\n                forwardOn(event)\n                self.dispose()\n            }\n        }\n    }\n    \n    private func _createTimeoutTimer() {\n        if _timerD.isDisposed {\n            return\n        }\n        \n        let nextTimer = SingleAssignmentDisposable()\n        _timerD.disposable = nextTimer\n        \n        let disposeSchedule = _parent._scheduler.scheduleRelative(_id, dueTime: _parent._dueTime) { state in\n            \n            var timerWins = false\n            \n            self._lock.performLocked() {\n                self._switched = (state == self._id)\n                timerWins = self._switched\n            }\n            \n            if timerWins {\n                self._subscription.disposable = self._parent._other.subscribe(self.forwarder())\n            }\n            \n            return Disposables.create()\n        }\n\n        nextTimer.setDisposable(disposeSchedule)\n    }\n}\n\n\nfinal fileprivate class Timeout<Element> : Producer<Element> {\n    \n    fileprivate let _source: Observable<Element>\n    fileprivate let _dueTime: RxTimeInterval\n    fileprivate let _other: Observable<Element>\n    fileprivate let _scheduler: SchedulerType\n    \n    init(source: Observable<Element>, dueTime: RxTimeInterval, other: Observable<Element>, scheduler: SchedulerType) {\n        _source = source\n        _dueTime = dueTime\n        _other = other\n        _scheduler = scheduler\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element {\n        let sink = TimeoutSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Timer.swift",
    "content": "//\n//  Timer.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 6/7/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType where E : RxAbstractInteger {\n    /**\n     Returns an observable sequence that produces a value after each period, using the specified scheduler to run timers and to send out observer messages.\n\n     - seealso: [interval operator on reactivex.io](http://reactivex.io/documentation/operators/interval.html)\n\n     - parameter period: Period for producing the values in the resulting sequence.\n     - parameter scheduler: Scheduler to run the timer on.\n     - returns: An observable sequence that produces a value after each period.\n     */\n    public static func interval(_ period: RxTimeInterval, scheduler: SchedulerType)\n        -> Observable<E> {\n        return Timer(dueTime: period,\n                     period: period,\n                     scheduler: scheduler\n        )\n    }\n}\n\nextension ObservableType where E: RxAbstractInteger {\n    /**\n     Returns an observable sequence that periodically produces a value after the specified initial relative due time has elapsed, using the specified scheduler to run timers.\n\n     - seealso: [timer operator on reactivex.io](http://reactivex.io/documentation/operators/timer.html)\n\n     - parameter dueTime: Relative time at which to produce the first value.\n     - parameter period: Period to produce subsequent values.\n     - parameter scheduler: Scheduler to run timers on.\n     - returns: An observable sequence that produces a value after due time has elapsed and then each period.\n     */\n    public static func timer(_ dueTime: RxTimeInterval, period: RxTimeInterval? = nil, scheduler: SchedulerType)\n        -> Observable<E> {\n        return Timer(\n            dueTime: dueTime,\n            period: period,\n            scheduler: scheduler\n        )\n    }\n}\n\nfinal fileprivate class TimerSink<O: ObserverType> : Sink<O> where O.E : RxAbstractInteger  {\n    typealias Parent = Timer<O.E>\n    \n    private let _parent: Parent\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        return _parent._scheduler.schedulePeriodic(0 as O.E, startAfter: _parent._dueTime, period: _parent._period!) { state in\n            self.forwardOn(.next(state))\n            return state &+ 1\n        }\n    }\n}\n\nfinal fileprivate class TimerOneOffSink<O: ObserverType> : Sink<O> where O.E : RxAbstractInteger {\n    typealias Parent = Timer<O.E>\n    \n    private let _parent: Parent\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        return _parent._scheduler.scheduleRelative(self, dueTime: _parent._dueTime) { (`self`) -> Disposable in\n            self.forwardOn(.next(0))\n            self.forwardOn(.completed)\n            self.dispose()\n\n            return Disposables.create()\n        }\n    }\n}\n\nfinal fileprivate class Timer<E: RxAbstractInteger>: Producer<E> {\n    fileprivate let _scheduler: SchedulerType\n    fileprivate let _dueTime: RxTimeInterval\n    fileprivate let _period: RxTimeInterval?\n    \n    init(dueTime: RxTimeInterval, period: RxTimeInterval?, scheduler: SchedulerType) {\n        _scheduler = scheduler\n        _dueTime = dueTime\n        _period = period\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {\n        if let _ = _period {\n            let sink = TimerSink(parent: self, observer: observer, cancel: cancel)\n            let subscription = sink.run()\n            return (sink: sink, subscription: subscription)\n        }\n        else {\n            let sink = TimerOneOffSink(parent: self, observer: observer, cancel: cancel)\n            let subscription = sink.run()\n            return (sink: sink, subscription: subscription)\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/ToArray.swift",
    "content": "//\n//  ToArray.swift\n//  RxSwift\n//\n//  Created by Junior B. on 20/10/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n\nextension ObservableType {\n\n    /**\n    Converts an Observable into another Observable that emits the whole sequence as a single array and then terminates.\n    \n    For aggregation behavior see `reduce`.\n\n    - seealso: [toArray operator on reactivex.io](http://reactivex.io/documentation/operators/to.html)\n    \n    - returns: An observable sequence containing all the emitted elements as array.\n    */\n    public func toArray()\n        -> Observable<[E]> {\n        return ToArray(source: self.asObservable())\n    }\n}\n\nfinal fileprivate class ToArraySink<SourceType, O: ObserverType> : Sink<O>, ObserverType where O.E == [SourceType] {\n    typealias Parent = ToArray<SourceType>\n    \n    let _parent: Parent\n    var _list = Array<SourceType>()\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        \n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<SourceType>) {\n        switch event {\n        case .next(let value):\n            self._list.append(value)\n        case .error(let e):\n            forwardOn(.error(e))\n            self.dispose()\n        case .completed:\n            forwardOn(.next(_list))\n            forwardOn(.completed)\n            self.dispose()\n        }\n    }\n}\n\nfinal fileprivate class ToArray<SourceType> : Producer<[SourceType]> {\n    let _source: Observable<SourceType>\n\n    init(source: Observable<SourceType>) {\n        _source = source\n    }\n    \n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == [SourceType] {\n        let sink = ToArraySink(parent: self, observer: observer, cancel: cancel)\n        let subscription = _source.subscribe(sink)\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Using.swift",
    "content": "//\n//  Using.swift\n//  RxSwift\n//\n//  Created by Yury Korolev on 10/15/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n\n     - seealso: [using operator on reactivex.io](http://reactivex.io/documentation/operators/using.html)\n\n     - parameter resourceFactory: Factory function to obtain a resource object.\n     - parameter observableFactory: Factory function to obtain an observable sequence that depends on the obtained resource.\n     - returns: An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n     */\n    public static func using<Resource: Disposable>(_ resourceFactory: @escaping () throws -> Resource, observableFactory: @escaping (Resource) throws -> Observable<E>) -> Observable<E> {\n        return Using(resourceFactory: resourceFactory, observableFactory: observableFactory)\n    }\n}\n\nfinal fileprivate class UsingSink<ResourceType: Disposable, O: ObserverType> : Sink<O>, ObserverType {\n    typealias SourceType = O.E\n    typealias Parent = Using<SourceType, ResourceType>\n\n    private let _parent: Parent\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        var disposable = Disposables.create()\n        \n        do {\n            let resource = try _parent._resourceFactory()\n            disposable = resource\n            let source = try _parent._observableFactory(resource)\n            \n            return Disposables.create(\n                source.subscribe(self),\n                disposable\n            )\n        } catch let error {\n            return Disposables.create(\n                Observable.error(error).subscribe(self),\n                disposable\n            )\n        }\n    }\n    \n    func on(_ event: Event<SourceType>) {\n        switch event {\n        case let .next(value):\n            forwardOn(.next(value))\n        case let .error(error):\n            forwardOn(.error(error))\n            dispose()\n        case .completed:\n            forwardOn(.completed)\n            dispose()\n        }\n    }\n}\n\nfinal fileprivate class Using<SourceType, ResourceType: Disposable>: Producer<SourceType> {\n    \n    typealias E = SourceType\n    \n    typealias ResourceFactory = () throws -> ResourceType\n    typealias ObservableFactory = (ResourceType) throws -> Observable<SourceType>\n    \n    fileprivate let _resourceFactory: ResourceFactory\n    fileprivate let _observableFactory: ObservableFactory\n    \n    \n    init(resourceFactory: @escaping ResourceFactory, observableFactory: @escaping ObservableFactory) {\n        _resourceFactory = resourceFactory\n        _observableFactory = observableFactory\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E {\n        let sink = UsingSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Window.swift",
    "content": "//\n//  Window.swift\n//  RxSwift\n//\n//  Created by Junior B. on 29/10/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Projects each element of an observable sequence into a window that is completed when either it’s full or a given amount of time has elapsed.\n\n     - seealso: [window operator on reactivex.io](http://reactivex.io/documentation/operators/window.html)\n\n     - parameter timeSpan: Maximum time length of a window.\n     - parameter count: Maximum element count of a window.\n     - parameter scheduler: Scheduler to run windowing timers on.\n     - returns: An observable sequence of windows (instances of `Observable`).\n     */\n    public func window(timeSpan: RxTimeInterval, count: Int, scheduler: SchedulerType)\n        -> Observable<Observable<E>> {\n            return WindowTimeCount(source: self.asObservable(), timeSpan: timeSpan, count: count, scheduler: scheduler)\n    }\n}\n\nfinal fileprivate class WindowTimeCountSink<Element, O: ObserverType>\n    : Sink<O>\n    , ObserverType\n    , LockOwnerType\n    , SynchronizedOnType where O.E == Observable<Element> {\n    typealias Parent = WindowTimeCount<Element>\n    typealias E = Element\n    \n    private let _parent: Parent\n    \n    let _lock = RecursiveLock()\n    \n    private var _subject = PublishSubject<Element>()\n    private var _count = 0\n    private var _windowId = 0\n    \n    private let _timerD = SerialDisposable()\n    private let _refCountDisposable: RefCountDisposable\n    private let _groupDisposable = CompositeDisposable()\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        \n        let _ = _groupDisposable.insert(_timerD)\n        \n        _refCountDisposable = RefCountDisposable(disposable: _groupDisposable)\n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        \n        forwardOn(.next(AddRef(source: _subject, refCount: _refCountDisposable).asObservable()))\n        createTimer(_windowId)\n        \n        let _ = _groupDisposable.insert(_parent._source.subscribe(self))\n        return _refCountDisposable\n    }\n    \n    func startNewWindowAndCompleteCurrentOne() {\n        _subject.on(.completed)\n        _subject = PublishSubject<Element>()\n        \n        forwardOn(.next(AddRef(source: _subject, refCount: _refCountDisposable).asObservable()))\n    }\n\n    func on(_ event: Event<E>) {\n        synchronizedOn(event)\n    }\n\n    func _synchronized_on(_ event: Event<E>) {\n        var newWindow = false\n        var newId = 0\n        \n        switch event {\n        case .next(let element):\n            _subject.on(.next(element))\n            \n            do {\n                let _ = try incrementChecked(&_count)\n            } catch (let e) {\n                _subject.on(.error(e as Swift.Error))\n                dispose()\n            }\n            \n            if (_count == _parent._count) {\n                newWindow = true\n                _count = 0\n                _windowId += 1\n                newId = _windowId\n                self.startNewWindowAndCompleteCurrentOne()\n            }\n            \n        case .error(let error):\n            _subject.on(.error(error))\n            forwardOn(.error(error))\n            dispose()\n        case .completed:\n            _subject.on(.completed)\n            forwardOn(.completed)\n            dispose()\n        }\n\n        if newWindow {\n            createTimer(newId)\n        }\n    }\n    \n    func createTimer(_ windowId: Int) {\n        if _timerD.isDisposed {\n            return\n        }\n        \n        if _windowId != windowId {\n            return\n        }\n\n        let nextTimer = SingleAssignmentDisposable()\n\n        _timerD.disposable = nextTimer\n\n        let scheduledRelative = _parent._scheduler.scheduleRelative(windowId, dueTime: _parent._timeSpan) { previousWindowId in\n            \n            var newId = 0\n            \n            self._lock.performLocked {\n                if previousWindowId != self._windowId {\n                    return\n                }\n                \n                self._count = 0\n                self._windowId = self._windowId &+ 1\n                newId = self._windowId\n                self.startNewWindowAndCompleteCurrentOne()\n            }\n            \n            self.createTimer(newId)\n            \n            return Disposables.create()\n        }\n\n        nextTimer.setDisposable(scheduledRelative)\n    }\n}\n\nfinal fileprivate class WindowTimeCount<Element> : Producer<Observable<Element>> {\n    \n    fileprivate let _timeSpan: RxTimeInterval\n    fileprivate let _count: Int\n    fileprivate let _scheduler: SchedulerType\n    fileprivate let _source: Observable<Element>\n    \n    init(source: Observable<Element>, timeSpan: RxTimeInterval, count: Int, scheduler: SchedulerType) {\n        _source = source\n        _timeSpan = timeSpan\n        _count = count\n        _scheduler = scheduler\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Observable<Element> {\n        let sink = WindowTimeCountSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/WithLatestFrom.swift",
    "content": "//\n//  WithLatestFrom.swift\n//  RxSwift\n//\n//  Created by Yury Korolev on 10/19/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n\n    /**\n     Merges two observable sequences into one observable sequence by combining each element from self with the latest element from the second source, if any.\n\n     - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n     - parameter second: Second observable source.\n     - parameter resultSelector: Function to invoke for each element from the self combined with the latest element from the second source, if any.\n     - returns: An observable sequence containing the result of combining each element of the self  with the latest element from the second source, if any, using the specified result selector function.\n     */\n    public func withLatestFrom<SecondO: ObservableConvertibleType, ResultType>(_ second: SecondO, resultSelector: @escaping (E, SecondO.E) throws -> ResultType) -> Observable<ResultType> {\n        return WithLatestFrom(first: asObservable(), second: second.asObservable(), resultSelector: resultSelector)\n    }\n\n    /**\n     Merges two observable sequences into one observable sequence by using latest element from the second sequence every time when `self` emits an element.\n\n     - seealso: [combineLatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html)\n\n     - parameter second: Second observable source.\n     - returns: An observable sequence containing the result of combining each element of the self  with the latest element from the second source, if any, using the specified result selector function.\n     */\n    public func withLatestFrom<SecondO: ObservableConvertibleType>(_ second: SecondO) -> Observable<SecondO.E> {\n        return WithLatestFrom(first: asObservable(), second: second.asObservable(), resultSelector: { $1 })\n    }\n}\n\nfinal fileprivate class WithLatestFromSink<FirstType, SecondType, O: ObserverType>\n    : Sink<O>\n    , ObserverType\n    , LockOwnerType\n    , SynchronizedOnType {\n    typealias ResultType = O.E\n    typealias Parent = WithLatestFrom<FirstType, SecondType, ResultType>\n    typealias E = FirstType\n    \n    fileprivate let _parent: Parent\n    \n    var _lock = RecursiveLock()\n    fileprivate var _latest: SecondType?\n\n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        \n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func run() -> Disposable {\n        let sndSubscription = SingleAssignmentDisposable()\n        let sndO = WithLatestFromSecond(parent: self, disposable: sndSubscription)\n        \n        sndSubscription.setDisposable(_parent._second.subscribe(sndO))\n        let fstSubscription = _parent._first.subscribe(self)\n\n        return Disposables.create(fstSubscription, sndSubscription)\n    }\n\n    func on(_ event: Event<E>) {\n        synchronizedOn(event)\n    }\n\n    func _synchronized_on(_ event: Event<E>) {\n        switch event {\n        case let .next(value):\n            guard let latest = _latest else { return }\n            do {\n                let res = try _parent._resultSelector(value, latest)\n                \n                forwardOn(.next(res))\n            } catch let e {\n                forwardOn(.error(e))\n                dispose()\n            }\n        case .completed:\n            forwardOn(.completed)\n            dispose()\n        case let .error(error):\n            forwardOn(.error(error))\n            dispose()\n        }\n    }\n}\n\nfinal fileprivate class WithLatestFromSecond<FirstType, SecondType, O: ObserverType>\n    : ObserverType\n    , LockOwnerType\n    , SynchronizedOnType {\n    \n    typealias ResultType = O.E\n    typealias Parent = WithLatestFromSink<FirstType, SecondType, O>\n    typealias E = SecondType\n    \n    private let _parent: Parent\n    private let _disposable: Disposable\n\n    var _lock: RecursiveLock {\n        return _parent._lock\n    }\n\n    init(parent: Parent, disposable: Disposable) {\n        _parent = parent\n        _disposable = disposable\n    }\n    \n    func on(_ event: Event<E>) {\n        synchronizedOn(event)\n    }\n\n    func _synchronized_on(_ event: Event<E>) {\n        switch event {\n        case let .next(value):\n            _parent._latest = value\n        case .completed:\n            _disposable.dispose()\n        case let .error(error):\n            _parent.forwardOn(.error(error))\n            _parent.dispose()\n        }\n    }\n}\n\nfinal fileprivate class WithLatestFrom<FirstType, SecondType, ResultType>: Producer<ResultType> {\n    typealias ResultSelector = (FirstType, SecondType) throws -> ResultType\n    \n    fileprivate let _first: Observable<FirstType>\n    fileprivate let _second: Observable<SecondType>\n    fileprivate let _resultSelector: ResultSelector\n\n    init(first: Observable<FirstType>, second: Observable<SecondType>, resultSelector: @escaping ResultSelector) {\n        _first = first\n        _second = second\n        _resultSelector = resultSelector\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == ResultType {\n        let sink = WithLatestFromSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Zip+Collection.swift",
    "content": "//\n//  Zip+Collection.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 8/30/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n     - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n     - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n     - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n     */\n    public static func zip<C: Collection>(_ collection: C, _ resultSelector: @escaping ([C.Iterator.Element.E]) throws -> E) -> Observable<E>\n        where C.Iterator.Element: ObservableType {\n        return ZipCollectionType(sources: collection, resultSelector: resultSelector)\n    }\n\n    /**\n     Merges the specified observable sequences into one observable sequence whenever all of the observable sequences have produced an element at a corresponding index.\n\n     - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n     - returns: An observable sequence containing the result of combining elements of the sources.\n     */\n    public static func zip<C: Collection>(_ collection: C) -> Observable<[E]>\n        where C.Iterator.Element: ObservableType, C.Iterator.Element.E == E {\n        return ZipCollectionType(sources: collection, resultSelector: { $0 })\n    }\n    \n}\n\nfinal fileprivate class ZipCollectionTypeSink<C: Collection, O: ObserverType>\n    : Sink<O> where C.Iterator.Element : ObservableConvertibleType {\n    typealias R = O.E\n    typealias Parent = ZipCollectionType<C, R>\n    typealias SourceElement = C.Iterator.Element.E\n    \n    private let _parent: Parent\n    \n    private let _lock = RecursiveLock()\n    \n    // state\n    private var _numberOfValues = 0\n    private var _values: [Queue<SourceElement>]\n    private var _isDone: [Bool]\n    private var _numberOfDone = 0\n    private var _subscriptions: [SingleAssignmentDisposable]\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        _values = [Queue<SourceElement>](repeating: Queue(capacity: 4), count: parent.count)\n        _isDone = [Bool](repeating: false, count: parent.count)\n        _subscriptions = Array<SingleAssignmentDisposable>()\n        _subscriptions.reserveCapacity(parent.count)\n        \n        for _ in 0 ..< parent.count {\n            _subscriptions.append(SingleAssignmentDisposable())\n        }\n        \n        super.init(observer: observer, cancel: cancel)\n    }\n    \n    func on(_ event: Event<SourceElement>, atIndex: Int) {\n        _lock.lock(); defer { _lock.unlock() } // {\n            switch event {\n            case .next(let element):\n                _values[atIndex].enqueue(element)\n                \n                if _values[atIndex].count == 1 {\n                    _numberOfValues += 1\n                }\n                \n                if _numberOfValues < _parent.count {\n                    if _numberOfDone == _parent.count - 1 {\n                        self.forwardOn(.completed)\n                        self.dispose()\n                    }\n                    return\n                }\n                \n                do {\n                    var arguments = [SourceElement]()\n                    arguments.reserveCapacity(_parent.count)\n                    \n                    // recalculate number of values\n                    _numberOfValues = 0\n                    \n                    for i in 0 ..< _values.count {\n                        arguments.append(_values[i].dequeue()!)\n                        if _values[i].count > 0 {\n                            _numberOfValues += 1\n                        }\n                    }\n                    \n                    let result = try _parent.resultSelector(arguments)\n                    self.forwardOn(.next(result))\n                }\n                catch let error {\n                    self.forwardOn(.error(error))\n                    self.dispose()\n                }\n                \n            case .error(let error):\n                self.forwardOn(.error(error))\n                self.dispose()\n            case .completed:\n                if _isDone[atIndex] {\n                    return\n                }\n                \n                _isDone[atIndex] = true\n                _numberOfDone += 1\n                \n                if _numberOfDone == _parent.count {\n                    self.forwardOn(.completed)\n                    self.dispose()\n                }\n                else {\n                    _subscriptions[atIndex].dispose()\n                }\n            }\n        // }\n    }\n    \n    func run() -> Disposable {\n        var j = 0\n        for i in _parent.sources {\n            let index = j\n            let source = i.asObservable()\n\n            let disposable = source.subscribe(AnyObserver { event in\n                self.on(event, atIndex: index)\n                })\n            _subscriptions[j].setDisposable(disposable)\n            j += 1\n        }\n\n        if _parent.sources.isEmpty {\n            self.forwardOn(.completed)\n        }\n        \n        return Disposables.create(_subscriptions)\n    }\n}\n\nfinal fileprivate class ZipCollectionType<C: Collection, R> : Producer<R> where C.Iterator.Element : ObservableConvertibleType {\n    typealias ResultSelector = ([C.Iterator.Element.E]) throws -> R\n    \n    let sources: C\n    let resultSelector: ResultSelector\n    let count: Int\n    \n    init(sources: C, resultSelector: @escaping ResultSelector) {\n        self.sources = sources\n        self.resultSelector = resultSelector\n        self.count = Int(Int64(self.sources.count))\n    }\n    \n    override func run<O : ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R {\n        let sink = ZipCollectionTypeSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Zip+arity.swift",
    "content": "// This file is autogenerated. Take a look at `Preprocessor` target in RxSwift project \n//\n//  Zip+arity.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 5/23/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n\n\n// 2\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType>\n        (_ source1: O1, _ source2: O2, resultSelector: @escaping (O1.E, O2.E) throws -> E)\n        -> Observable<E> {\n        return Zip2(\n            source1: source1.asObservable(), source2: source2.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType>\n        (_ source1: O1, _ source2: O2)\n        -> Observable<(O1.E, O2.E)> {\n        return Zip2(\n            source1: source1.asObservable(), source2: source2.asObservable(),\n            resultSelector: { ($0, $1) }\n        )\n    }\n}\n\nfinal class ZipSink2_<E1, E2, O: ObserverType> : ZipSink<O> {\n    typealias R = O.E\n    typealias Parent = Zip2<E1, E2, R>\n\n    let _parent: Parent\n\n    var _values1: Queue<E1> = Queue(capacity: 2)\n    var _values2: Queue<E2> = Queue(capacity: 2)\n\n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(arity: 2, observer: observer, cancel: cancel)\n    }\n\n    override func hasElements(_ index: Int) -> Bool {\n        switch (index) {\n        case 0: return _values1.count > 0\n        case 1: return _values2.count > 0\n\n        default:\n            rxFatalError(\"Unhandled case (Function)\")\n        }\n\n        return false\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n\n        let observer1 = ZipObserver(lock: _lock, parent: self, index: 0, setNextValue: { self._values1.enqueue($0) }, this: subscription1)\n        let observer2 = ZipObserver(lock: _lock, parent: self, index: 1, setNextValue: { self._values2.enqueue($0) }, this: subscription2)\n\n        subscription1.setDisposable(_parent.source1.subscribe(observer1))\n        subscription2.setDisposable(_parent.source2.subscribe(observer2))\n\n        return Disposables.create([\n           subscription1,\n           subscription2\n        ])\n    }\n\n    override func getResult() throws -> R {\n        return try _parent._resultSelector(_values1.dequeue()!, _values2.dequeue()!)\n    }\n}\n\nfinal class Zip2<E1, E2, R> : Producer<R> {\n    typealias ResultSelector = (E1, E2) throws -> R\n\n    let source1: Observable<E1>\n    let source2: Observable<E2>\n\n    let _resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, resultSelector: @escaping ResultSelector) {\n        self.source1 = source1\n        self.source2 = source2\n\n        _resultSelector = resultSelector\n    }\n\n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R {\n        let sink = ZipSink2_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n\n// 3\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType, O3: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, resultSelector: @escaping (O1.E, O2.E, O3.E) throws -> E)\n        -> Observable<E> {\n        return Zip3(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType, O3: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3)\n        -> Observable<(O1.E, O2.E, O3.E)> {\n        return Zip3(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(),\n            resultSelector: { ($0, $1, $2) }\n        )\n    }\n}\n\nfinal class ZipSink3_<E1, E2, E3, O: ObserverType> : ZipSink<O> {\n    typealias R = O.E\n    typealias Parent = Zip3<E1, E2, E3, R>\n\n    let _parent: Parent\n\n    var _values1: Queue<E1> = Queue(capacity: 2)\n    var _values2: Queue<E2> = Queue(capacity: 2)\n    var _values3: Queue<E3> = Queue(capacity: 2)\n\n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(arity: 3, observer: observer, cancel: cancel)\n    }\n\n    override func hasElements(_ index: Int) -> Bool {\n        switch (index) {\n        case 0: return _values1.count > 0\n        case 1: return _values2.count > 0\n        case 2: return _values3.count > 0\n\n        default:\n            rxFatalError(\"Unhandled case (Function)\")\n        }\n\n        return false\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n        let subscription3 = SingleAssignmentDisposable()\n\n        let observer1 = ZipObserver(lock: _lock, parent: self, index: 0, setNextValue: { self._values1.enqueue($0) }, this: subscription1)\n        let observer2 = ZipObserver(lock: _lock, parent: self, index: 1, setNextValue: { self._values2.enqueue($0) }, this: subscription2)\n        let observer3 = ZipObserver(lock: _lock, parent: self, index: 2, setNextValue: { self._values3.enqueue($0) }, this: subscription3)\n\n        subscription1.setDisposable(_parent.source1.subscribe(observer1))\n        subscription2.setDisposable(_parent.source2.subscribe(observer2))\n        subscription3.setDisposable(_parent.source3.subscribe(observer3))\n\n        return Disposables.create([\n           subscription1,\n           subscription2,\n           subscription3\n        ])\n    }\n\n    override func getResult() throws -> R {\n        return try _parent._resultSelector(_values1.dequeue()!, _values2.dequeue()!, _values3.dequeue()!)\n    }\n}\n\nfinal class Zip3<E1, E2, E3, R> : Producer<R> {\n    typealias ResultSelector = (E1, E2, E3) throws -> R\n\n    let source1: Observable<E1>\n    let source2: Observable<E2>\n    let source3: Observable<E3>\n\n    let _resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, source3: Observable<E3>, resultSelector: @escaping ResultSelector) {\n        self.source1 = source1\n        self.source2 = source2\n        self.source3 = source3\n\n        _resultSelector = resultSelector\n    }\n\n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R {\n        let sink = ZipSink3_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n\n// 4\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E) throws -> E)\n        -> Observable<E> {\n        return Zip4(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4)\n        -> Observable<(O1.E, O2.E, O3.E, O4.E)> {\n        return Zip4(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(),\n            resultSelector: { ($0, $1, $2, $3) }\n        )\n    }\n}\n\nfinal class ZipSink4_<E1, E2, E3, E4, O: ObserverType> : ZipSink<O> {\n    typealias R = O.E\n    typealias Parent = Zip4<E1, E2, E3, E4, R>\n\n    let _parent: Parent\n\n    var _values1: Queue<E1> = Queue(capacity: 2)\n    var _values2: Queue<E2> = Queue(capacity: 2)\n    var _values3: Queue<E3> = Queue(capacity: 2)\n    var _values4: Queue<E4> = Queue(capacity: 2)\n\n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(arity: 4, observer: observer, cancel: cancel)\n    }\n\n    override func hasElements(_ index: Int) -> Bool {\n        switch (index) {\n        case 0: return _values1.count > 0\n        case 1: return _values2.count > 0\n        case 2: return _values3.count > 0\n        case 3: return _values4.count > 0\n\n        default:\n            rxFatalError(\"Unhandled case (Function)\")\n        }\n\n        return false\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n        let subscription3 = SingleAssignmentDisposable()\n        let subscription4 = SingleAssignmentDisposable()\n\n        let observer1 = ZipObserver(lock: _lock, parent: self, index: 0, setNextValue: { self._values1.enqueue($0) }, this: subscription1)\n        let observer2 = ZipObserver(lock: _lock, parent: self, index: 1, setNextValue: { self._values2.enqueue($0) }, this: subscription2)\n        let observer3 = ZipObserver(lock: _lock, parent: self, index: 2, setNextValue: { self._values3.enqueue($0) }, this: subscription3)\n        let observer4 = ZipObserver(lock: _lock, parent: self, index: 3, setNextValue: { self._values4.enqueue($0) }, this: subscription4)\n\n        subscription1.setDisposable(_parent.source1.subscribe(observer1))\n        subscription2.setDisposable(_parent.source2.subscribe(observer2))\n        subscription3.setDisposable(_parent.source3.subscribe(observer3))\n        subscription4.setDisposable(_parent.source4.subscribe(observer4))\n\n        return Disposables.create([\n           subscription1,\n           subscription2,\n           subscription3,\n           subscription4\n        ])\n    }\n\n    override func getResult() throws -> R {\n        return try _parent._resultSelector(_values1.dequeue()!, _values2.dequeue()!, _values3.dequeue()!, _values4.dequeue()!)\n    }\n}\n\nfinal class Zip4<E1, E2, E3, E4, R> : Producer<R> {\n    typealias ResultSelector = (E1, E2, E3, E4) throws -> R\n\n    let source1: Observable<E1>\n    let source2: Observable<E2>\n    let source3: Observable<E3>\n    let source4: Observable<E4>\n\n    let _resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, source3: Observable<E3>, source4: Observable<E4>, resultSelector: @escaping ResultSelector) {\n        self.source1 = source1\n        self.source2 = source2\n        self.source3 = source3\n        self.source4 = source4\n\n        _resultSelector = resultSelector\n    }\n\n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R {\n        let sink = ZipSink4_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n\n// 5\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E) throws -> E)\n        -> Observable<E> {\n        return Zip5(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5)\n        -> Observable<(O1.E, O2.E, O3.E, O4.E, O5.E)> {\n        return Zip5(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(),\n            resultSelector: { ($0, $1, $2, $3, $4) }\n        )\n    }\n}\n\nfinal class ZipSink5_<E1, E2, E3, E4, E5, O: ObserverType> : ZipSink<O> {\n    typealias R = O.E\n    typealias Parent = Zip5<E1, E2, E3, E4, E5, R>\n\n    let _parent: Parent\n\n    var _values1: Queue<E1> = Queue(capacity: 2)\n    var _values2: Queue<E2> = Queue(capacity: 2)\n    var _values3: Queue<E3> = Queue(capacity: 2)\n    var _values4: Queue<E4> = Queue(capacity: 2)\n    var _values5: Queue<E5> = Queue(capacity: 2)\n\n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(arity: 5, observer: observer, cancel: cancel)\n    }\n\n    override func hasElements(_ index: Int) -> Bool {\n        switch (index) {\n        case 0: return _values1.count > 0\n        case 1: return _values2.count > 0\n        case 2: return _values3.count > 0\n        case 3: return _values4.count > 0\n        case 4: return _values5.count > 0\n\n        default:\n            rxFatalError(\"Unhandled case (Function)\")\n        }\n\n        return false\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n        let subscription3 = SingleAssignmentDisposable()\n        let subscription4 = SingleAssignmentDisposable()\n        let subscription5 = SingleAssignmentDisposable()\n\n        let observer1 = ZipObserver(lock: _lock, parent: self, index: 0, setNextValue: { self._values1.enqueue($0) }, this: subscription1)\n        let observer2 = ZipObserver(lock: _lock, parent: self, index: 1, setNextValue: { self._values2.enqueue($0) }, this: subscription2)\n        let observer3 = ZipObserver(lock: _lock, parent: self, index: 2, setNextValue: { self._values3.enqueue($0) }, this: subscription3)\n        let observer4 = ZipObserver(lock: _lock, parent: self, index: 3, setNextValue: { self._values4.enqueue($0) }, this: subscription4)\n        let observer5 = ZipObserver(lock: _lock, parent: self, index: 4, setNextValue: { self._values5.enqueue($0) }, this: subscription5)\n\n        subscription1.setDisposable(_parent.source1.subscribe(observer1))\n        subscription2.setDisposable(_parent.source2.subscribe(observer2))\n        subscription3.setDisposable(_parent.source3.subscribe(observer3))\n        subscription4.setDisposable(_parent.source4.subscribe(observer4))\n        subscription5.setDisposable(_parent.source5.subscribe(observer5))\n\n        return Disposables.create([\n           subscription1,\n           subscription2,\n           subscription3,\n           subscription4,\n           subscription5\n        ])\n    }\n\n    override func getResult() throws -> R {\n        return try _parent._resultSelector(_values1.dequeue()!, _values2.dequeue()!, _values3.dequeue()!, _values4.dequeue()!, _values5.dequeue()!)\n    }\n}\n\nfinal class Zip5<E1, E2, E3, E4, E5, R> : Producer<R> {\n    typealias ResultSelector = (E1, E2, E3, E4, E5) throws -> R\n\n    let source1: Observable<E1>\n    let source2: Observable<E2>\n    let source3: Observable<E3>\n    let source4: Observable<E4>\n    let source5: Observable<E5>\n\n    let _resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, source3: Observable<E3>, source4: Observable<E4>, source5: Observable<E5>, resultSelector: @escaping ResultSelector) {\n        self.source1 = source1\n        self.source2 = source2\n        self.source3 = source3\n        self.source4 = source4\n        self.source5 = source5\n\n        _resultSelector = resultSelector\n    }\n\n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R {\n        let sink = ZipSink5_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n\n// 6\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType, O6: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E) throws -> E)\n        -> Observable<E> {\n        return Zip6(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType, O6: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6)\n        -> Observable<(O1.E, O2.E, O3.E, O4.E, O5.E, O6.E)> {\n        return Zip6(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(),\n            resultSelector: { ($0, $1, $2, $3, $4, $5) }\n        )\n    }\n}\n\nfinal class ZipSink6_<E1, E2, E3, E4, E5, E6, O: ObserverType> : ZipSink<O> {\n    typealias R = O.E\n    typealias Parent = Zip6<E1, E2, E3, E4, E5, E6, R>\n\n    let _parent: Parent\n\n    var _values1: Queue<E1> = Queue(capacity: 2)\n    var _values2: Queue<E2> = Queue(capacity: 2)\n    var _values3: Queue<E3> = Queue(capacity: 2)\n    var _values4: Queue<E4> = Queue(capacity: 2)\n    var _values5: Queue<E5> = Queue(capacity: 2)\n    var _values6: Queue<E6> = Queue(capacity: 2)\n\n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(arity: 6, observer: observer, cancel: cancel)\n    }\n\n    override func hasElements(_ index: Int) -> Bool {\n        switch (index) {\n        case 0: return _values1.count > 0\n        case 1: return _values2.count > 0\n        case 2: return _values3.count > 0\n        case 3: return _values4.count > 0\n        case 4: return _values5.count > 0\n        case 5: return _values6.count > 0\n\n        default:\n            rxFatalError(\"Unhandled case (Function)\")\n        }\n\n        return false\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n        let subscription3 = SingleAssignmentDisposable()\n        let subscription4 = SingleAssignmentDisposable()\n        let subscription5 = SingleAssignmentDisposable()\n        let subscription6 = SingleAssignmentDisposable()\n\n        let observer1 = ZipObserver(lock: _lock, parent: self, index: 0, setNextValue: { self._values1.enqueue($0) }, this: subscription1)\n        let observer2 = ZipObserver(lock: _lock, parent: self, index: 1, setNextValue: { self._values2.enqueue($0) }, this: subscription2)\n        let observer3 = ZipObserver(lock: _lock, parent: self, index: 2, setNextValue: { self._values3.enqueue($0) }, this: subscription3)\n        let observer4 = ZipObserver(lock: _lock, parent: self, index: 3, setNextValue: { self._values4.enqueue($0) }, this: subscription4)\n        let observer5 = ZipObserver(lock: _lock, parent: self, index: 4, setNextValue: { self._values5.enqueue($0) }, this: subscription5)\n        let observer6 = ZipObserver(lock: _lock, parent: self, index: 5, setNextValue: { self._values6.enqueue($0) }, this: subscription6)\n\n        subscription1.setDisposable(_parent.source1.subscribe(observer1))\n        subscription2.setDisposable(_parent.source2.subscribe(observer2))\n        subscription3.setDisposable(_parent.source3.subscribe(observer3))\n        subscription4.setDisposable(_parent.source4.subscribe(observer4))\n        subscription5.setDisposable(_parent.source5.subscribe(observer5))\n        subscription6.setDisposable(_parent.source6.subscribe(observer6))\n\n        return Disposables.create([\n           subscription1,\n           subscription2,\n           subscription3,\n           subscription4,\n           subscription5,\n           subscription6\n        ])\n    }\n\n    override func getResult() throws -> R {\n        return try _parent._resultSelector(_values1.dequeue()!, _values2.dequeue()!, _values3.dequeue()!, _values4.dequeue()!, _values5.dequeue()!, _values6.dequeue()!)\n    }\n}\n\nfinal class Zip6<E1, E2, E3, E4, E5, E6, R> : Producer<R> {\n    typealias ResultSelector = (E1, E2, E3, E4, E5, E6) throws -> R\n\n    let source1: Observable<E1>\n    let source2: Observable<E2>\n    let source3: Observable<E3>\n    let source4: Observable<E4>\n    let source5: Observable<E5>\n    let source6: Observable<E6>\n\n    let _resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, source3: Observable<E3>, source4: Observable<E4>, source5: Observable<E5>, source6: Observable<E6>, resultSelector: @escaping ResultSelector) {\n        self.source1 = source1\n        self.source2 = source2\n        self.source3 = source3\n        self.source4 = source4\n        self.source5 = source5\n        self.source6 = source6\n\n        _resultSelector = resultSelector\n    }\n\n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R {\n        let sink = ZipSink6_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n\n// 7\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType, O6: ObservableType, O7: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E) throws -> E)\n        -> Observable<E> {\n        return Zip7(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(), source7: source7.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType, O6: ObservableType, O7: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7)\n        -> Observable<(O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E)> {\n        return Zip7(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(), source7: source7.asObservable(),\n            resultSelector: { ($0, $1, $2, $3, $4, $5, $6) }\n        )\n    }\n}\n\nfinal class ZipSink7_<E1, E2, E3, E4, E5, E6, E7, O: ObserverType> : ZipSink<O> {\n    typealias R = O.E\n    typealias Parent = Zip7<E1, E2, E3, E4, E5, E6, E7, R>\n\n    let _parent: Parent\n\n    var _values1: Queue<E1> = Queue(capacity: 2)\n    var _values2: Queue<E2> = Queue(capacity: 2)\n    var _values3: Queue<E3> = Queue(capacity: 2)\n    var _values4: Queue<E4> = Queue(capacity: 2)\n    var _values5: Queue<E5> = Queue(capacity: 2)\n    var _values6: Queue<E6> = Queue(capacity: 2)\n    var _values7: Queue<E7> = Queue(capacity: 2)\n\n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(arity: 7, observer: observer, cancel: cancel)\n    }\n\n    override func hasElements(_ index: Int) -> Bool {\n        switch (index) {\n        case 0: return _values1.count > 0\n        case 1: return _values2.count > 0\n        case 2: return _values3.count > 0\n        case 3: return _values4.count > 0\n        case 4: return _values5.count > 0\n        case 5: return _values6.count > 0\n        case 6: return _values7.count > 0\n\n        default:\n            rxFatalError(\"Unhandled case (Function)\")\n        }\n\n        return false\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n        let subscription3 = SingleAssignmentDisposable()\n        let subscription4 = SingleAssignmentDisposable()\n        let subscription5 = SingleAssignmentDisposable()\n        let subscription6 = SingleAssignmentDisposable()\n        let subscription7 = SingleAssignmentDisposable()\n\n        let observer1 = ZipObserver(lock: _lock, parent: self, index: 0, setNextValue: { self._values1.enqueue($0) }, this: subscription1)\n        let observer2 = ZipObserver(lock: _lock, parent: self, index: 1, setNextValue: { self._values2.enqueue($0) }, this: subscription2)\n        let observer3 = ZipObserver(lock: _lock, parent: self, index: 2, setNextValue: { self._values3.enqueue($0) }, this: subscription3)\n        let observer4 = ZipObserver(lock: _lock, parent: self, index: 3, setNextValue: { self._values4.enqueue($0) }, this: subscription4)\n        let observer5 = ZipObserver(lock: _lock, parent: self, index: 4, setNextValue: { self._values5.enqueue($0) }, this: subscription5)\n        let observer6 = ZipObserver(lock: _lock, parent: self, index: 5, setNextValue: { self._values6.enqueue($0) }, this: subscription6)\n        let observer7 = ZipObserver(lock: _lock, parent: self, index: 6, setNextValue: { self._values7.enqueue($0) }, this: subscription7)\n\n        subscription1.setDisposable(_parent.source1.subscribe(observer1))\n        subscription2.setDisposable(_parent.source2.subscribe(observer2))\n        subscription3.setDisposable(_parent.source3.subscribe(observer3))\n        subscription4.setDisposable(_parent.source4.subscribe(observer4))\n        subscription5.setDisposable(_parent.source5.subscribe(observer5))\n        subscription6.setDisposable(_parent.source6.subscribe(observer6))\n        subscription7.setDisposable(_parent.source7.subscribe(observer7))\n\n        return Disposables.create([\n           subscription1,\n           subscription2,\n           subscription3,\n           subscription4,\n           subscription5,\n           subscription6,\n           subscription7\n        ])\n    }\n\n    override func getResult() throws -> R {\n        return try _parent._resultSelector(_values1.dequeue()!, _values2.dequeue()!, _values3.dequeue()!, _values4.dequeue()!, _values5.dequeue()!, _values6.dequeue()!, _values7.dequeue()!)\n    }\n}\n\nfinal class Zip7<E1, E2, E3, E4, E5, E6, E7, R> : Producer<R> {\n    typealias ResultSelector = (E1, E2, E3, E4, E5, E6, E7) throws -> R\n\n    let source1: Observable<E1>\n    let source2: Observable<E2>\n    let source3: Observable<E3>\n    let source4: Observable<E4>\n    let source5: Observable<E5>\n    let source6: Observable<E6>\n    let source7: Observable<E7>\n\n    let _resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, source3: Observable<E3>, source4: Observable<E4>, source5: Observable<E5>, source6: Observable<E6>, source7: Observable<E7>, resultSelector: @escaping ResultSelector) {\n        self.source1 = source1\n        self.source2 = source2\n        self.source3 = source3\n        self.source4 = source4\n        self.source5 = source5\n        self.source6 = source6\n        self.source7 = source7\n\n        _resultSelector = resultSelector\n    }\n\n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R {\n        let sink = ZipSink7_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n\n// 8\n\nextension ObservableType {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType, O6: ObservableType, O7: ObservableType, O8: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E) throws -> E)\n        -> Observable<E> {\n        return Zip8(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(), source7: source7.asObservable(), source8: source8.asObservable(),\n            resultSelector: resultSelector\n        )\n    }\n}\n\nextension ObservableType where E == Any {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources.\n    */\n    public static func zip<O1: ObservableType, O2: ObservableType, O3: ObservableType, O4: ObservableType, O5: ObservableType, O6: ObservableType, O7: ObservableType, O8: ObservableType>\n        (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8)\n        -> Observable<(O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E)> {\n        return Zip8(\n            source1: source1.asObservable(), source2: source2.asObservable(), source3: source3.asObservable(), source4: source4.asObservable(), source5: source5.asObservable(), source6: source6.asObservable(), source7: source7.asObservable(), source8: source8.asObservable(),\n            resultSelector: { ($0, $1, $2, $3, $4, $5, $6, $7) }\n        )\n    }\n}\n\nfinal class ZipSink8_<E1, E2, E3, E4, E5, E6, E7, E8, O: ObserverType> : ZipSink<O> {\n    typealias R = O.E\n    typealias Parent = Zip8<E1, E2, E3, E4, E5, E6, E7, E8, R>\n\n    let _parent: Parent\n\n    var _values1: Queue<E1> = Queue(capacity: 2)\n    var _values2: Queue<E2> = Queue(capacity: 2)\n    var _values3: Queue<E3> = Queue(capacity: 2)\n    var _values4: Queue<E4> = Queue(capacity: 2)\n    var _values5: Queue<E5> = Queue(capacity: 2)\n    var _values6: Queue<E6> = Queue(capacity: 2)\n    var _values7: Queue<E7> = Queue(capacity: 2)\n    var _values8: Queue<E8> = Queue(capacity: 2)\n\n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        _parent = parent\n        super.init(arity: 8, observer: observer, cancel: cancel)\n    }\n\n    override func hasElements(_ index: Int) -> Bool {\n        switch (index) {\n        case 0: return _values1.count > 0\n        case 1: return _values2.count > 0\n        case 2: return _values3.count > 0\n        case 3: return _values4.count > 0\n        case 4: return _values5.count > 0\n        case 5: return _values6.count > 0\n        case 6: return _values7.count > 0\n        case 7: return _values8.count > 0\n\n        default:\n            rxFatalError(\"Unhandled case (Function)\")\n        }\n\n        return false\n    }\n\n    func run() -> Disposable {\n        let subscription1 = SingleAssignmentDisposable()\n        let subscription2 = SingleAssignmentDisposable()\n        let subscription3 = SingleAssignmentDisposable()\n        let subscription4 = SingleAssignmentDisposable()\n        let subscription5 = SingleAssignmentDisposable()\n        let subscription6 = SingleAssignmentDisposable()\n        let subscription7 = SingleAssignmentDisposable()\n        let subscription8 = SingleAssignmentDisposable()\n\n        let observer1 = ZipObserver(lock: _lock, parent: self, index: 0, setNextValue: { self._values1.enqueue($0) }, this: subscription1)\n        let observer2 = ZipObserver(lock: _lock, parent: self, index: 1, setNextValue: { self._values2.enqueue($0) }, this: subscription2)\n        let observer3 = ZipObserver(lock: _lock, parent: self, index: 2, setNextValue: { self._values3.enqueue($0) }, this: subscription3)\n        let observer4 = ZipObserver(lock: _lock, parent: self, index: 3, setNextValue: { self._values4.enqueue($0) }, this: subscription4)\n        let observer5 = ZipObserver(lock: _lock, parent: self, index: 4, setNextValue: { self._values5.enqueue($0) }, this: subscription5)\n        let observer6 = ZipObserver(lock: _lock, parent: self, index: 5, setNextValue: { self._values6.enqueue($0) }, this: subscription6)\n        let observer7 = ZipObserver(lock: _lock, parent: self, index: 6, setNextValue: { self._values7.enqueue($0) }, this: subscription7)\n        let observer8 = ZipObserver(lock: _lock, parent: self, index: 7, setNextValue: { self._values8.enqueue($0) }, this: subscription8)\n\n        subscription1.setDisposable(_parent.source1.subscribe(observer1))\n        subscription2.setDisposable(_parent.source2.subscribe(observer2))\n        subscription3.setDisposable(_parent.source3.subscribe(observer3))\n        subscription4.setDisposable(_parent.source4.subscribe(observer4))\n        subscription5.setDisposable(_parent.source5.subscribe(observer5))\n        subscription6.setDisposable(_parent.source6.subscribe(observer6))\n        subscription7.setDisposable(_parent.source7.subscribe(observer7))\n        subscription8.setDisposable(_parent.source8.subscribe(observer8))\n\n        return Disposables.create([\n           subscription1,\n           subscription2,\n           subscription3,\n           subscription4,\n           subscription5,\n           subscription6,\n           subscription7,\n           subscription8\n        ])\n    }\n\n    override func getResult() throws -> R {\n        return try _parent._resultSelector(_values1.dequeue()!, _values2.dequeue()!, _values3.dequeue()!, _values4.dequeue()!, _values5.dequeue()!, _values6.dequeue()!, _values7.dequeue()!, _values8.dequeue()!)\n    }\n}\n\nfinal class Zip8<E1, E2, E3, E4, E5, E6, E7, E8, R> : Producer<R> {\n    typealias ResultSelector = (E1, E2, E3, E4, E5, E6, E7, E8) throws -> R\n\n    let source1: Observable<E1>\n    let source2: Observable<E2>\n    let source3: Observable<E3>\n    let source4: Observable<E4>\n    let source5: Observable<E5>\n    let source6: Observable<E6>\n    let source7: Observable<E7>\n    let source8: Observable<E8>\n\n    let _resultSelector: ResultSelector\n\n    init(source1: Observable<E1>, source2: Observable<E2>, source3: Observable<E3>, source4: Observable<E4>, source5: Observable<E5>, source6: Observable<E6>, source7: Observable<E7>, source8: Observable<E8>, resultSelector: @escaping ResultSelector) {\n        self.source1 = source1\n        self.source2 = source2\n        self.source3 = source3\n        self.source4 = source4\n        self.source5 = source5\n        self.source6 = source6\n        self.source7 = source7\n        self.source8 = source8\n\n        _resultSelector = resultSelector\n    }\n\n    override func run<O: ObserverType>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R {\n        let sink = ZipSink8_(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\n\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observables/Zip.swift",
    "content": "//\n//  Zip.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 5/23/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nprotocol ZipSinkProtocol : class\n{\n    func next(_ index: Int)\n    func fail(_ error: Swift.Error)\n    func done(_ index: Int)\n}\n\nclass ZipSink<O: ObserverType> : Sink<O>, ZipSinkProtocol {\n    typealias Element = O.E\n    \n    let _arity: Int\n\n    let _lock = RecursiveLock()\n\n    // state\n    private var _isDone: [Bool]\n    \n    init(arity: Int, observer: O, cancel: Cancelable) {\n        _isDone = [Bool](repeating: false, count: arity)\n        _arity = arity\n        \n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func getResult() throws -> Element {\n        rxAbstractMethod()\n    }\n    \n    func hasElements(_ index: Int) -> Bool {\n        rxAbstractMethod()\n    }\n    \n    func next(_ index: Int) {\n        var hasValueAll = true\n        \n        for i in 0 ..< _arity {\n            if !hasElements(i) {\n                hasValueAll = false\n                break\n            }\n        }\n        \n        if hasValueAll {\n            do {\n                let result = try getResult()\n                self.forwardOn(.next(result))\n            }\n            catch let e {\n                self.forwardOn(.error(e))\n                dispose()\n            }\n        }\n        else {\n            var allOthersDone = true\n            \n            let arity = _isDone.count\n            for i in 0 ..< arity {\n                if i != index && !_isDone[i] {\n                    allOthersDone = false\n                    break\n                }\n            }\n            \n            if allOthersDone {\n                forwardOn(.completed)\n                self.dispose()\n            }\n        }\n    }\n    \n    func fail(_ error: Swift.Error) {\n        forwardOn(.error(error))\n        dispose()\n    }\n    \n    func done(_ index: Int) {\n        _isDone[index] = true\n        \n        var allDone = true\n        \n        for done in _isDone {\n            if !done {\n                allDone = false\n                break\n            }\n        }\n        \n        if allDone {\n            forwardOn(.completed)\n            dispose()\n        }\n    }\n}\n\nfinal class ZipObserver<ElementType>\n    : ObserverType\n    , LockOwnerType\n    , SynchronizedOnType {\n    typealias E = ElementType\n    typealias ValueSetter = (ElementType) -> ()\n\n    private var _parent: ZipSinkProtocol?\n    \n    let _lock: RecursiveLock\n    \n    // state\n    private let _index: Int\n    private let _this: Disposable\n    private let _setNextValue: ValueSetter\n    \n    init(lock: RecursiveLock, parent: ZipSinkProtocol, index: Int, setNextValue: @escaping ValueSetter, this: Disposable) {\n        _lock = lock\n        _parent = parent\n        _index = index\n        _this = this\n        _setNextValue = setNextValue\n    }\n    \n    func on(_ event: Event<E>) {\n        synchronizedOn(event)\n    }\n\n    func _synchronized_on(_ event: Event<E>) {\n        if let _ = _parent {\n            switch event {\n            case .next(_):\n                break\n            case .error(_):\n                _this.dispose()\n            case .completed:\n                _this.dispose()\n            }\n        }\n        \n        if let parent = _parent {\n            switch event {\n            case .next(let value):\n                _setNextValue(value)\n                parent.next(_index)\n            case .error(let error):\n                parent.fail(error)\n            case .completed:\n                parent.done(_index)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/ObserverType.swift",
    "content": "//\n//  ObserverType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/8/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Supports push-style iteration over an observable sequence.\npublic protocol ObserverType {\n    /// The type of elements in sequence that observer can observe.\n    associatedtype E\n\n    /// Notify observer about sequence event.\n    ///\n    /// - parameter event: Event that occurred.\n    func on(_ event: Event<E>)\n}\n\n/// Convenience API extensions to provide alternate next, error, completed events\nextension ObserverType {\n    \n    /// Convenience method equivalent to `on(.next(element: E))`\n    ///\n    /// - parameter element: Next element to send to observer(s)\n    public func onNext(_ element: E) {\n        on(.next(element))\n    }\n    \n    /// Convenience method equivalent to `on(.completed)`\n    public func onCompleted() {\n        on(.completed)\n    }\n    \n    /// Convenience method equivalent to `on(.error(Swift.Error))`\n    /// - parameter error: Swift.Error to send to observer(s)\n    public func onError(_ error: Swift.Error) {\n        on(.error(error))\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observers/AnonymousObserver.swift",
    "content": "//\n//  AnonymousObserver.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/8/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nfinal class AnonymousObserver<ElementType> : ObserverBase<ElementType> {\n    typealias Element = ElementType\n    \n    typealias EventHandler = (Event<Element>) -> Void\n    \n    private let _eventHandler : EventHandler\n    \n    init(_ eventHandler: @escaping EventHandler) {\n#if TRACE_RESOURCES\n        let _ = Resources.incrementTotal()\n#endif\n        _eventHandler = eventHandler\n    }\n\n    override func onCore(_ event: Event<Element>) {\n        return _eventHandler(event)\n    }\n    \n#if TRACE_RESOURCES\n    deinit {\n        let _ = Resources.decrementTotal()\n    }\n#endif\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observers/ObserverBase.swift",
    "content": "//\n//  ObserverBase.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/15/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nclass ObserverBase<ElementType> : Disposable, ObserverType {\n    typealias E = ElementType\n\n    private var _isStopped: AtomicInt = 0\n\n    func on(_ event: Event<E>) {\n        switch event {\n        case .next:\n            if _isStopped == 0 {\n                onCore(event)\n            }\n        case .error, .completed:\n            if AtomicCompareAndSwap(0, 1, &_isStopped) {\n                onCore(event)\n            }\n        }\n    }\n\n    func onCore(_ event: Event<E>) {\n        rxAbstractMethod()\n    }\n\n    func dispose() {\n        _ = AtomicCompareAndSwap(0, 1, &_isStopped)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Observers/TailRecursiveSink.swift",
    "content": "//\n//  TailRecursiveSink.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/21/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nenum TailRecursiveSinkCommand {\n    case moveNext\n    case dispose\n}\n\n#if DEBUG || TRACE_RESOURCES\n    public var maxTailRecursiveSinkStackSize = 0\n#endif\n\n/// This class is usually used with `Generator` version of the operators.\nclass TailRecursiveSink<S: Sequence, O: ObserverType>\n    : Sink<O>\n    , InvocableWithValueType where S.Iterator.Element: ObservableConvertibleType, S.Iterator.Element.E == O.E {\n    typealias Value = TailRecursiveSinkCommand\n    typealias E = O.E\n    typealias SequenceGenerator = (generator: S.Iterator, remaining: IntMax?)\n\n    var _generators: [SequenceGenerator] = []\n    var _isDisposed = false\n    var _subscription = SerialDisposable()\n\n    // this is thread safe object\n    var _gate = AsyncLock<InvocableScheduledItem<TailRecursiveSink<S, O>>>()\n\n    override init(observer: O, cancel: Cancelable) {\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func run(_ sources: SequenceGenerator) -> Disposable {\n        _generators.append(sources)\n\n        schedule(.moveNext)\n\n        return _subscription\n    }\n\n    func invoke(_ command: TailRecursiveSinkCommand) {\n        switch command {\n        case .dispose:\n            disposeCommand()\n        case .moveNext:\n            moveNextCommand()\n        }\n    }\n\n    // simple implementation for now\n    func schedule(_ command: TailRecursiveSinkCommand) {\n        _gate.invoke(InvocableScheduledItem(invocable: self, state: command))\n    }\n\n    func done() {\n        forwardOn(.completed)\n        dispose()\n    }\n\n    func extract(_ observable: Observable<E>) -> SequenceGenerator? {\n        rxAbstractMethod()\n    }\n\n    // should be done on gate locked\n\n    private func moveNextCommand() {\n        var next: Observable<E>? = nil\n\n        repeat {\n            guard let (g, left) = _generators.last else {\n                break\n            }\n            \n            if _isDisposed {\n                return\n            }\n\n            _generators.removeLast()\n            \n            var e = g\n\n            guard let nextCandidate = e.next()?.asObservable() else {\n                continue\n            }\n\n            // `left` is a hint of how many elements are left in generator.\n            // In case this is the last element, then there is no need to push\n            // that generator on stack.\n            //\n            // This is an optimization used to make sure in tail recursive case\n            // there is no memory leak in case this operator is used to generate non terminating\n            // sequence.\n\n            if let knownOriginalLeft = left {\n                // `- 1` because generator.next() has just been called\n                if knownOriginalLeft - 1 >= 1 {\n                    _generators.append((e, knownOriginalLeft - 1))\n                }\n            }\n            else {\n                _generators.append((e, nil))\n            }\n\n            let nextGenerator = extract(nextCandidate)\n\n            if let nextGenerator = nextGenerator {\n                _generators.append(nextGenerator)\n                #if DEBUG || TRACE_RESOURCES\n                    if maxTailRecursiveSinkStackSize < _generators.count {\n                        maxTailRecursiveSinkStackSize = _generators.count\n                    }\n                #endif\n            }\n            else {\n                next = nextCandidate\n            }\n        } while next == nil\n\n        guard let existingNext = next else  {\n            done()\n            return\n        }\n\n        let disposable = SingleAssignmentDisposable()\n        _subscription.disposable = disposable\n        disposable.setDisposable(subscribeToNext(existingNext))\n    }\n\n    func subscribeToNext(_ source: Observable<E>) -> Disposable {\n        rxAbstractMethod()\n    }\n\n    func disposeCommand() {\n        _isDisposed = true\n        _generators.removeAll(keepingCapacity: false)\n    }\n\n    override func dispose() {\n        super.dispose()\n        \n        _subscription.dispose()\n        _gate.dispose()\n        \n        schedule(.dispose)\n    }\n}\n\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Reactive.swift",
    "content": "//\n//  Reactive.swift\n//  RxSwift\n//\n//  Created by Yury Korolev on 5/2/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\n/**\n Use `Reactive` proxy as customization point for constrained protocol extensions.\n\n General pattern would be:\n\n // 1. Extend Reactive protocol with constrain on Base\n // Read as: Reactive Extension where Base is a SomeType\n extension Reactive where Base: SomeType {\n // 2. Put any specific reactive extension for SomeType here\n }\n\n With this approach we can have more specialized methods and properties using\n `Base` and not just specialized on common base type.\n\n */\n\npublic struct Reactive<Base> {\n    /// Base object to extend.\n    public let base: Base\n\n    /// Creates extensions with base object.\n    ///\n    /// - parameter base: Base object.\n    public init(_ base: Base) {\n        self.base = base\n    }\n}\n\n/// A type that has reactive extensions.\npublic protocol ReactiveCompatible {\n    /// Extended type\n    associatedtype CompatibleType\n\n    /// Reactive extensions.\n    static var rx: Reactive<CompatibleType>.Type { get set }\n\n    /// Reactive extensions.\n    var rx: Reactive<CompatibleType> { get set }\n}\n\nextension ReactiveCompatible {\n    /// Reactive extensions.\n    public static var rx: Reactive<Self>.Type {\n        get {\n            return Reactive<Self>.self\n        }\n        set {\n            // this enables using Reactive to \"mutate\" base type\n        }\n    }\n\n    /// Reactive extensions.\n    public var rx: Reactive<Self> {\n        get {\n            return Reactive(self)\n        }\n        set {\n            // this enables using Reactive to \"mutate\" base object\n        }\n    }\n}\n\nimport class Foundation.NSObject\n\n/// Extend NSObject with `rx` proxy.\nextension NSObject: ReactiveCompatible { }\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Rx.swift",
    "content": "//\n//  Rx.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n#if TRACE_RESOURCES\n    fileprivate var resourceCount: AtomicInt = 0\n\n    /// Resource utilization information\n    public struct Resources {\n        /// Counts internal Rx resource allocations (Observables, Observers, Disposables, etc.). This provides a simple way to detect leaks during development.\n        public static var total: Int32 {\n            return resourceCount.valueSnapshot()\n        }\n\n        /// Increments `Resources.total` resource count.\n        ///\n        /// - returns: New resource count\n        public static func incrementTotal() -> Int32 {\n            return AtomicIncrement(&resourceCount)\n        }\n\n        /// Decrements `Resources.total` resource count\n        ///\n        /// - returns: New resource count\n        public static func decrementTotal() -> Int32 {\n            return AtomicDecrement(&resourceCount)\n        }\n    }\n#endif\n\n/// Swift does not implement abstract methods. This method is used as a runtime check to ensure that methods which intended to be abstract (i.e., they should be implemented in subclasses) are not called directly on the superclass.\nfunc rxAbstractMethod(file: StaticString = #file, line: UInt = #line) -> Swift.Never {\n    rxFatalError(\"Abstract method\", file: file, line: line)\n}\n\nfunc rxFatalError(_ lastMessage: @autoclosure () -> String, file: StaticString = #file, line: UInt = #line) -> Swift.Never  {\n    // The temptation to comment this line is great, but please don't, it's for your own good. The choice is yours.\n    fatalError(lastMessage(), file: file, line: line)\n}\n\nfunc rxFatalErrorInDebug(_ lastMessage: @autoclosure () -> String, file: StaticString = #file, line: UInt = #line) {\n    #if DEBUG\n        fatalError(lastMessage(), file: file, line: line)\n    #else\n        print(\"\\(file):\\(line): \\(lastMessage())\")\n    #endif\n}\n\nfunc incrementChecked(_ i: inout Int) throws -> Int {\n    if i == Int.max {\n        throw RxError.overflow\n    }\n    defer { i += 1 }\n    return i\n}\n\nfunc decrementChecked(_ i: inout Int) throws -> Int {\n    if i == Int.min {\n        throw RxError.overflow\n    }\n    defer { i -= 1 }\n    return i\n}\n\n#if DEBUG\n    import class Foundation.Thread\n    final class SynchronizationTracker {\n        private let _lock = RecursiveLock()\n\n        public enum SychronizationErrorMessages: String {\n            case variable = \"Two different threads are trying to assign the same `Variable.value` unsynchronized.\\n    This is undefined behavior because the end result (variable value) is nondeterministic and depends on the \\n    operating system thread scheduler. This will cause random behavior of your program.\\n\"\n            case `default` = \"Two different unsynchronized threads are trying to send some event simultaneously.\\n    This is undefined behavior because the ordering of the effects caused by these events is nondeterministic and depends on the \\n    operating system thread scheduler. This will result in a random behavior of your program.\\n\"\n        }\n\n        private var _threads = Dictionary<UnsafeMutableRawPointer, Int>()\n\n        private func synchronizationError(_ message: String) {\n            #if FATAL_SYNCHRONIZATION\n                rxFatalError(message)\n            #else\n                print(message)\n            #endif\n        }\n        \n        func register(synchronizationErrorMessage: SychronizationErrorMessages) {\n            _lock.lock(); defer { _lock.unlock() }\n            let pointer = Unmanaged.passUnretained(Thread.current).toOpaque()\n            let count = (_threads[pointer] ?? 0) + 1\n\n            if count > 1 {\n                synchronizationError(\n                    \"⚠️ Reentrancy anomaly was detected. ⚠️\\n\" +\n                    \"  > Debugging: To debug this issue you can set a breakpoint in \\(#file):\\(#line) and observe the call stack.\\n\" +\n                    \"  > Problem: This behavior is breaking the observable sequence grammar. `next (error | completed)?`\\n\" +\n                    \"    This behavior breaks the grammar because there is overlapping between sequence events.\\n\" +\n                    \"    Observable sequence is trying to send an event before sending of previous event has finished.\\n\" +\n                    \"  > Interpretation: This could mean that there is some kind of unexpected cyclic dependency in your code,\\n\" +\n                    \"    or that the system is not behaving in the expected way.\\n\" +\n                    \"  > Remedy: If this is the expected behavior this message can be suppressed by adding `.observeOn(MainScheduler.asyncInstance)`\\n\" +\n                    \"    or by enqueing sequence events in some other way.\\n\"\n                )\n            }\n            \n            _threads[pointer] = count\n\n            if _threads.count > 1 {\n                synchronizationError(\n                    \"⚠️ Synchronization anomaly was detected. ⚠️\\n\" +\n                    \"  > Debugging: To debug this issue you can set a breakpoint in \\(#file):\\(#line) and observe the call stack.\\n\" +\n                    \"  > Problem: This behavior is breaking the observable sequence grammar. `next (error | completed)?`\\n\" +\n                    \"    This behavior breaks the grammar because there is overlapping between sequence events.\\n\" +\n                    \"    Observable sequence is trying to send an event before sending of previous event has finished.\\n\" +\n                    \"  > Interpretation: \" + synchronizationErrorMessage.rawValue +\n                    \"  > Remedy: If this is the expected behavior this message can be suppressed by adding `.observeOn(MainScheduler.asyncInstance)`\\n\" +\n                    \"    or by synchronizing sequence events in some other way.\\n\"\n                )\n            }\n        }\n\n        func unregister() {\n            _lock.lock(); defer { _lock.unlock() }\n            let pointer = Unmanaged.passUnretained(Thread.current).toOpaque()\n            _threads[pointer] = (_threads[pointer] ?? 1) - 1\n            if _threads[pointer] == 0 {\n                _threads[pointer] = nil\n            }\n        }\n    }\n\n#endif\n\n/// RxSwift global hooks\npublic enum Hooks {\n\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/RxMutableBox.swift",
    "content": "//\n//  RxMutableBox.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 5/22/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Creates mutable reference wrapper for any type.\nfinal class RxMutableBox<T> : CustomDebugStringConvertible {\n    /// Wrapped value\n    var value : T\n    \n    /// Creates reference wrapper for `value`.\n    ///\n    /// - parameter value: Value to wrap.\n    init (_ value: T) {\n        self.value = value\n    }\n}\n\nextension RxMutableBox {\n    /// - returns: Box description.\n    var debugDescription: String {\n        return \"MutatingBox(\\(self.value))\"\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/SchedulerType.swift",
    "content": "//\n//  SchedulerType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/8/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport struct Foundation.TimeInterval\nimport struct Foundation.Date\n\n// Type that represents time interval in the context of RxSwift.\npublic typealias RxTimeInterval = TimeInterval\n\n/// Type that represents absolute time in the context of RxSwift.\npublic typealias RxTime = Date\n\n/// Represents an object that schedules units of work.\npublic protocol SchedulerType: ImmediateSchedulerType {\n\n    /// - returns: Current time.\n    var now : RxTime {\n        get\n    }\n\n    /**\n    Schedules an action to be executed.\n    \n    - parameter state: State passed to the action to be executed.\n    - parameter dueTime: Relative time after which to execute the action.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    func scheduleRelative<StateType>(_ state: StateType, dueTime: RxTimeInterval, action: @escaping (StateType) -> Disposable) -> Disposable\n \n    /**\n    Schedules a periodic piece of work.\n    \n    - parameter state: State passed to the action to be executed.\n    - parameter startAfter: Period after which initial work should be run.\n    - parameter period: Period for running the work periodically.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    func schedulePeriodic<StateType>(_ state: StateType, startAfter: RxTimeInterval, period: RxTimeInterval, action: @escaping (StateType) -> StateType) -> Disposable\n}\n\nextension SchedulerType {\n\n    /**\n    Periodic task will be emulated using recursive scheduling.\n\n    - parameter state: Initial state passed to the action upon the first iteration.\n    - parameter startAfter: Period after which initial work should be run.\n    - parameter period: Period for running the work periodically.\n    - returns: The disposable object used to cancel the scheduled recurring action (best effort).\n    */\n    public func schedulePeriodic<StateType>(_ state: StateType, startAfter: RxTimeInterval, period: RxTimeInterval, action: @escaping (StateType) -> StateType) -> Disposable {\n        let schedule = SchedulePeriodicRecursive(scheduler: self, startAfter: startAfter, period: period, action: action, state: state)\n            \n        return schedule.start()\n    }\n\n    func scheduleRecursive<State>(_ state: State, dueTime: RxTimeInterval, action: @escaping (State, AnyRecursiveScheduler<State>) -> ()) -> Disposable {\n        let scheduler = AnyRecursiveScheduler(scheduler: self, action: action)\n         \n        scheduler.schedule(state, dueTime: dueTime)\n            \n        return Disposables.create(with: scheduler.dispose)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/ConcurrentDispatchQueueScheduler.swift",
    "content": "//\n//  ConcurrentDispatchQueueScheduler.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 7/5/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport struct Foundation.Date\nimport struct Foundation.TimeInterval\nimport Dispatch\n\n/// Abstracts the work that needs to be performed on a specific `dispatch_queue_t`. You can also pass a serial dispatch queue, it shouldn't cause any problems.\n///\n/// This scheduler is suitable when some work needs to be performed in background.\npublic class ConcurrentDispatchQueueScheduler: SchedulerType {\n    public typealias TimeInterval = Foundation.TimeInterval\n    public typealias Time = Date\n    \n    public var now : Date {\n        return Date()\n    }\n\n    let configuration: DispatchQueueConfiguration\n    \n    /// Constructs new `ConcurrentDispatchQueueScheduler` that wraps `queue`.\n    ///\n    /// - parameter queue: Target dispatch queue.\n    public init(queue: DispatchQueue, leeway: DispatchTimeInterval = DispatchTimeInterval.nanoseconds(0)) {\n        configuration = DispatchQueueConfiguration(queue: queue, leeway: leeway)\n    }\n    \n    /// Convenience init for scheduler that wraps one of the global concurrent dispatch queues.\n    ///\n    /// - parameter qos: Target global dispatch queue, by quality of service class.\n    @available(iOS 8, OSX 10.10, *)\n    public convenience init(qos: DispatchQoS, leeway: DispatchTimeInterval = DispatchTimeInterval.nanoseconds(0)) {\n        self.init(queue: DispatchQueue(\n            label: \"rxswift.queue.\\(qos)\",\n            qos: qos,\n            attributes: [DispatchQueue.Attributes.concurrent],\n            target: nil),\n            leeway: leeway\n        )\n    }\n\n    /**\n    Schedules an action to be executed immediately.\n    \n    - parameter state: State passed to the action to be executed.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    public final func schedule<StateType>(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable {\n        return self.configuration.schedule(state, action: action)\n    }\n    \n    /**\n    Schedules an action to be executed.\n    \n    - parameter state: State passed to the action to be executed.\n    - parameter dueTime: Relative time after which to execute the action.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    public final func scheduleRelative<StateType>(_ state: StateType, dueTime: Foundation.TimeInterval, action: @escaping (StateType) -> Disposable) -> Disposable {\n        return self.configuration.scheduleRelative(state, dueTime: dueTime, action: action)\n    }\n    \n    /**\n    Schedules a periodic piece of work.\n    \n    - parameter state: State passed to the action to be executed.\n    - parameter startAfter: Period after which initial work should be run.\n    - parameter period: Period for running the work periodically.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    public func schedulePeriodic<StateType>(_ state: StateType, startAfter: TimeInterval, period: TimeInterval, action: @escaping (StateType) -> StateType) -> Disposable {\n        return self.configuration.schedulePeriodic(state, startAfter: startAfter, period: period, action: action)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/ConcurrentMainScheduler.swift",
    "content": "//\n//  ConcurrentMainScheduler.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 10/17/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport struct Foundation.Date\nimport struct Foundation.TimeInterval\nimport Dispatch\n\n/**\nAbstracts work that needs to be performed on `MainThread`. In case `schedule` methods are called from main thread, it will perform action immediately without scheduling.\n\nThis scheduler is optimized for `subscribeOn` operator. If you want to observe observable sequence elements on main thread using `observeOn` operator,\n`MainScheduler` is more suitable for that purpose.\n*/\npublic final class ConcurrentMainScheduler : SchedulerType {\n    public typealias TimeInterval = Foundation.TimeInterval\n    public typealias Time = Date\n\n    private let _mainScheduler: MainScheduler\n    private let _mainQueue: DispatchQueue\n\n    /// - returns: Current time.\n    public var now : Date {\n        return _mainScheduler.now as Date\n    }\n\n    private init(mainScheduler: MainScheduler) {\n        _mainQueue = DispatchQueue.main\n        _mainScheduler = mainScheduler\n    }\n\n    /// Singleton instance of `ConcurrentMainScheduler`\n    public static let instance = ConcurrentMainScheduler(mainScheduler: MainScheduler.instance)\n\n    /**\n    Schedules an action to be executed immediately.\n\n    - parameter state: State passed to the action to be executed.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    public func schedule<StateType>(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable {\n        if DispatchQueue.isMain {\n            return action(state)\n        }\n\n        let cancel = SingleAssignmentDisposable()\n\n        _mainQueue.async {\n            if cancel.isDisposed {\n                return\n            }\n\n            cancel.setDisposable(action(state))\n        }\n\n        return cancel\n    }\n\n    /**\n    Schedules an action to be executed.\n\n    - parameter state: State passed to the action to be executed.\n    - parameter dueTime: Relative time after which to execute the action.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    public final func scheduleRelative<StateType>(_ state: StateType, dueTime: Foundation.TimeInterval, action: @escaping (StateType) -> Disposable) -> Disposable {\n        return _mainScheduler.scheduleRelative(state, dueTime: dueTime, action: action)\n    }\n\n    /**\n    Schedules a periodic piece of work.\n\n    - parameter state: State passed to the action to be executed.\n    - parameter startAfter: Period after which initial work should be run.\n    - parameter period: Period for running the work periodically.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    public func schedulePeriodic<StateType>(_ state: StateType, startAfter: TimeInterval, period: TimeInterval, action: @escaping (StateType) -> StateType) -> Disposable {\n        return _mainScheduler.schedulePeriodic(state, startAfter: startAfter, period: period, action: action)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/CurrentThreadScheduler.swift",
    "content": "//\n//  CurrentThreadScheduler.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 8/30/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport class Foundation.NSObject\nimport protocol Foundation.NSCopying\nimport class Foundation.Thread\nimport Dispatch\n\n#if os(Linux)\n    import struct Foundation.pthread_key_t\n    import func Foundation.pthread_setspecific\n    import func Foundation.pthread_getspecific\n    import func Foundation.pthread_key_create\n    \n    fileprivate enum CurrentThreadSchedulerQueueKey {\n        fileprivate static let instance = \"RxSwift.CurrentThreadScheduler.Queue\"\n    }\n#else\n    fileprivate class CurrentThreadSchedulerQueueKey: NSObject, NSCopying {\n        static let instance = CurrentThreadSchedulerQueueKey()\n        private override init() {\n            super.init()\n        }\n\n        override var hash: Int {\n            return 0\n        }\n\n        public func copy(with zone: NSZone? = nil) -> Any {\n            return self\n        }\n    }\n#endif\n\n/// Represents an object that schedules units of work on the current thread.\n///\n/// This is the default scheduler for operators that generate elements.\n///\n/// This scheduler is also sometimes called `trampoline scheduler`.\npublic class CurrentThreadScheduler : ImmediateSchedulerType {\n    typealias ScheduleQueue = RxMutableBox<Queue<ScheduledItemType>>\n\n    /// The singleton instance of the current thread scheduler.\n    public static let instance = CurrentThreadScheduler()\n\n    private static var isScheduleRequiredKey: pthread_key_t = { () -> pthread_key_t in\n        let key = UnsafeMutablePointer<pthread_key_t>.allocate(capacity: 1)\n        defer {\n            key.deallocate(capacity: 1)\n        }\n                                                               \n        guard pthread_key_create(key, nil) == 0 else {\n            rxFatalError(\"isScheduleRequired key creation failed\")\n        }\n\n        return key.pointee\n    }()\n\n    private static var scheduleInProgressSentinel: UnsafeRawPointer = { () -> UnsafeRawPointer in\n        return UnsafeRawPointer(UnsafeMutablePointer<Int>.allocate(capacity: 1))\n    }()\n\n    static var queue : ScheduleQueue? {\n        get {\n            return Thread.getThreadLocalStorageValueForKey(CurrentThreadSchedulerQueueKey.instance)\n        }\n        set {\n            Thread.setThreadLocalStorageValue(newValue, forKey: CurrentThreadSchedulerQueueKey.instance)\n        }\n    }\n\n    /// Gets a value that indicates whether the caller must call a `schedule` method.\n    public static fileprivate(set) var isScheduleRequired: Bool {\n        get {\n            return pthread_getspecific(CurrentThreadScheduler.isScheduleRequiredKey) == nil\n        }\n        set(isScheduleRequired) {\n            if pthread_setspecific(CurrentThreadScheduler.isScheduleRequiredKey, isScheduleRequired ? nil : scheduleInProgressSentinel) != 0 {\n                rxFatalError(\"pthread_setspecific failed\")\n            }\n        }\n    }\n\n    /**\n    Schedules an action to be executed as soon as possible on current thread.\n\n    If this method is called on some thread that doesn't have `CurrentThreadScheduler` installed, scheduler will be\n    automatically installed and uninstalled after all work is performed.\n\n    - parameter state: State passed to the action to be executed.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    public func schedule<StateType>(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable {\n        if CurrentThreadScheduler.isScheduleRequired {\n            CurrentThreadScheduler.isScheduleRequired = false\n\n            let disposable = action(state)\n\n            defer {\n                CurrentThreadScheduler.isScheduleRequired = true\n                CurrentThreadScheduler.queue = nil\n            }\n\n            guard let queue = CurrentThreadScheduler.queue else {\n                return disposable\n            }\n\n            while let latest = queue.value.dequeue() {\n                if latest.isDisposed {\n                    continue\n                }\n                latest.invoke()\n            }\n\n            return disposable\n        }\n\n        let existingQueue = CurrentThreadScheduler.queue\n\n        let queue: RxMutableBox<Queue<ScheduledItemType>>\n        if let existingQueue = existingQueue {\n            queue = existingQueue\n        }\n        else {\n            queue = RxMutableBox(Queue<ScheduledItemType>(capacity: 1))\n            CurrentThreadScheduler.queue = queue\n        }\n\n        let scheduledItem = ScheduledItem(action: action, state: state)\n        queue.value.enqueue(scheduledItem)\n\n        return scheduledItem\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/HistoricalScheduler.swift",
    "content": "//\n//  HistoricalScheduler.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 12/27/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport struct Foundation.Date\n\n/// Provides a virtual time scheduler that uses `Date` for absolute time and `NSTimeInterval` for relative time.\npublic class HistoricalScheduler : VirtualTimeScheduler<HistoricalSchedulerTimeConverter> {\n\n    /**\n      Creates a new historical scheduler with initial clock value.\n     \n     - parameter initialClock: Initial value for virtual clock.\n    */\n    public init(initialClock: RxTime = Date(timeIntervalSince1970: 0)) {\n        super.init(initialClock: initialClock, converter: HistoricalSchedulerTimeConverter())\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/HistoricalSchedulerTimeConverter.swift",
    "content": "//\n//  HistoricalSchedulerTimeConverter.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 12/27/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport struct Foundation.Date\n\n/// Converts historial virtual time into real time.\n///\n/// Since historical virtual time is also measured in `Date`, this converter is identity function.\npublic struct HistoricalSchedulerTimeConverter : VirtualTimeConverterType {\n    /// Virtual time unit used that represents ticks of virtual clock.\n    public typealias VirtualTimeUnit = RxTime\n\n    /// Virtual time unit used to represent differences of virtual times.\n    public typealias VirtualTimeIntervalUnit = RxTimeInterval\n\n    /// Returns identical value of argument passed because historical virtual time is equal to real time, just\n    /// decoupled from local machine clock.\n    public func convertFromVirtualTime(_ virtualTime: VirtualTimeUnit) -> RxTime {\n        return virtualTime\n    }\n\n    /// Returns identical value of argument passed because historical virtual time is equal to real time, just\n    /// decoupled from local machine clock.\n    public func convertToVirtualTime(_ time: RxTime) -> VirtualTimeUnit {\n        return time\n    }\n\n    /// Returns identical value of argument passed because historical virtual time is equal to real time, just\n    /// decoupled from local machine clock.\n    public func convertFromVirtualTimeInterval(_ virtualTimeInterval: VirtualTimeIntervalUnit) -> RxTimeInterval {\n        return virtualTimeInterval\n    }\n\n    /// Returns identical value of argument passed because historical virtual time is equal to real time, just\n    /// decoupled from local machine clock.\n    public func convertToVirtualTimeInterval(_ timeInterval: RxTimeInterval) -> VirtualTimeIntervalUnit {\n        return timeInterval\n    }\n\n    /**\n     Offsets `Date` by time interval.\n     \n     - parameter time: Time.\n     - parameter timeInterval: Time interval offset.\n     - returns: Time offsetted by time interval.\n    */\n    public func offsetVirtualTime(_ time: VirtualTimeUnit, offset: VirtualTimeIntervalUnit) -> VirtualTimeUnit {\n        return time.addingTimeInterval(offset)\n    }\n\n    /// Compares two `Date`s.\n    public func compareVirtualTime(_ lhs: VirtualTimeUnit, _ rhs: VirtualTimeUnit) -> VirtualTimeComparison {\n        switch lhs.compare(rhs as Date) {\n        case .orderedAscending:\n            return .lessThan\n        case .orderedSame:\n            return .equal\n        case .orderedDescending:\n            return .greaterThan\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/Internal/DispatchQueueConfiguration.swift",
    "content": "//\n//  DispatchQueueConfiguration.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 7/23/16.\n//  Copyright © 2016 Krunoslav Zaher. All rights reserved.\n//\n\nimport Dispatch\nimport struct Foundation.TimeInterval\n\nstruct DispatchQueueConfiguration {\n    let queue: DispatchQueue\n    let leeway: DispatchTimeInterval\n}\n\nprivate func dispatchInterval(_ interval: Foundation.TimeInterval) -> DispatchTimeInterval {\n    precondition(interval >= 0.0)\n    // TODO: Replace 1000 with something that actually works \n    // NSEC_PER_MSEC returns 1000000\n    return DispatchTimeInterval.milliseconds(Int(interval * 1000.0))\n}\n\nextension DispatchQueueConfiguration {\n    func schedule<StateType>(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable {\n        let cancel = SingleAssignmentDisposable()\n\n        queue.async {\n            if cancel.isDisposed {\n                return\n            }\n\n\n            cancel.setDisposable(action(state))\n        }\n\n        return cancel\n    }\n\n    func scheduleRelative<StateType>(_ state: StateType, dueTime: Foundation.TimeInterval, action: @escaping (StateType) -> Disposable) -> Disposable {\n        let deadline = DispatchTime.now() + dispatchInterval(dueTime)\n\n        let compositeDisposable = CompositeDisposable()\n\n        let timer = DispatchSource.makeTimerSource(queue: queue)\n        #if swift(>=4.0)\n            timer.schedule(deadline: deadline, leeway: leeway)\n        #else\n            timer.scheduleOneshot(deadline: deadline, leeway: leeway)\n        #endif\n\n        // TODO:\n        // This looks horrible, and yes, it is.\n        // It looks like Apple has made a conceputal change here, and I'm unsure why.\n        // Need more info on this.\n        // It looks like just setting timer to fire and not holding a reference to it\n        // until deadline causes timer cancellation.\n        var timerReference: DispatchSourceTimer? = timer\n        let cancelTimer = Disposables.create {\n            timerReference?.cancel()\n            timerReference = nil\n        }\n\n        timer.setEventHandler(handler: {\n            if compositeDisposable.isDisposed {\n                return\n            }\n            _ = compositeDisposable.insert(action(state))\n            cancelTimer.dispose()\n        })\n        timer.resume()\n\n        _ = compositeDisposable.insert(cancelTimer)\n\n        return compositeDisposable\n    }\n\n    func schedulePeriodic<StateType>(_ state: StateType, startAfter: TimeInterval, period: TimeInterval, action: @escaping (StateType) -> StateType) -> Disposable {\n        let initial = DispatchTime.now() + dispatchInterval(startAfter)\n\n        var timerState = state\n\n        let timer = DispatchSource.makeTimerSource(queue: queue)\n        #if swift(>=4.0)\n            timer.schedule(deadline: initial, repeating: dispatchInterval(period), leeway: leeway)\n        #else\n            timer.scheduleRepeating(deadline: initial, interval: dispatchInterval(period), leeway: leeway)\n        #endif\n        \n        // TODO:\n        // This looks horrible, and yes, it is.\n        // It looks like Apple has made a conceputal change here, and I'm unsure why.\n        // Need more info on this.\n        // It looks like just setting timer to fire and not holding a reference to it\n        // until deadline causes timer cancellation.\n        var timerReference: DispatchSourceTimer? = timer\n        let cancelTimer = Disposables.create {\n            timerReference?.cancel()\n            timerReference = nil\n        }\n\n        timer.setEventHandler(handler: {\n            if cancelTimer.isDisposed {\n                return\n            }\n            timerState = action(timerState)\n        })\n        timer.resume()\n        \n        return cancelTimer\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/Internal/InvocableScheduledItem.swift",
    "content": "//\n//  InvocableScheduledItem.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 11/7/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nstruct InvocableScheduledItem<I: InvocableWithValueType> : InvocableType {\n\n    let _invocable: I\n    let _state: I.Value\n\n    init(invocable: I, state: I.Value) {\n        _invocable = invocable\n        _state = state\n    }\n\n    func invoke() {\n        _invocable.invoke(_state)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/Internal/InvocableType.swift",
    "content": "//\n//  InvocableType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 11/7/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nprotocol InvocableType {\n    func invoke()\n}\n\nprotocol InvocableWithValueType {\n    associatedtype Value\n\n    func invoke(_ value: Value)\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/Internal/ScheduledItem.swift",
    "content": "//\n//  ScheduledItem.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 9/2/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nstruct ScheduledItem<T>\n    : ScheduledItemType\n    , InvocableType {\n    typealias Action = (T) -> Disposable\n    \n    private let _action: Action\n    private let _state: T\n\n    private let _disposable = SingleAssignmentDisposable()\n\n    var isDisposed: Bool {\n        return _disposable.isDisposed\n    }\n    \n    init(action: @escaping Action, state: T) {\n        _action = action\n        _state = state\n    }\n    \n    func invoke() {\n         _disposable.setDisposable(_action(_state))\n    }\n    \n    func dispose() {\n        _disposable.dispose()\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/Internal/ScheduledItemType.swift",
    "content": "//\n//  ScheduledItemType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 11/7/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nprotocol ScheduledItemType\n    : Cancelable\n    , InvocableType {\n    func invoke()\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/MainScheduler.swift",
    "content": "//\n//  MainScheduler.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/8/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport Dispatch\n\n/**\nAbstracts work that needs to be performed on `DispatchQueue.main`. In case `schedule` methods are called from `DispatchQueue.main`, it will perform action immediately without scheduling.\n\nThis scheduler is usually used to perform UI work.\n\nMain scheduler is a specialization of `SerialDispatchQueueScheduler`.\n\nThis scheduler is optimized for `observeOn` operator. To ensure observable sequence is subscribed on main thread using `subscribeOn`\noperator please use `ConcurrentMainScheduler` because it is more optimized for that purpose.\n*/\npublic final class MainScheduler : SerialDispatchQueueScheduler {\n\n    private let _mainQueue: DispatchQueue\n\n    var numberEnqueued: AtomicInt = 0\n\n    /// Initializes new instance of `MainScheduler`.\n    public init() {\n        _mainQueue = DispatchQueue.main\n        super.init(serialQueue: _mainQueue)\n    }\n\n    /// Singleton instance of `MainScheduler`\n    public static let instance = MainScheduler()\n\n    /// Singleton instance of `MainScheduler` that always schedules work asynchronously\n    /// and doesn't perform optimizations for calls scheduled from main queue.\n    public static let asyncInstance = SerialDispatchQueueScheduler(serialQueue: DispatchQueue.main)\n\n    /// In case this method is called on a background thread it will throw an exception.\n    public class func ensureExecutingOnScheduler(errorMessage: String? = nil) {\n        if !DispatchQueue.isMain {\n            rxFatalError(errorMessage ?? \"Executing on backgound thread. Please use `MainScheduler.instance.schedule` to schedule work on main thread.\")\n        }\n    }\n\n    override func scheduleInternal<StateType>(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable {\n        let currentNumberEnqueued = AtomicIncrement(&numberEnqueued)\n\n        if DispatchQueue.isMain && currentNumberEnqueued == 1 {\n            let disposable = action(state)\n            _ = AtomicDecrement(&numberEnqueued)\n            return disposable\n        }\n\n        let cancel = SingleAssignmentDisposable()\n\n        _mainQueue.async {\n            if !cancel.isDisposed {\n                _ = action(state)\n            }\n\n            _ = AtomicDecrement(&self.numberEnqueued)\n        }\n\n        return cancel\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/OperationQueueScheduler.swift",
    "content": "//\n//  OperationQueueScheduler.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 4/4/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport class Foundation.OperationQueue\nimport class Foundation.BlockOperation\nimport Dispatch\n\n/// Abstracts the work that needs to be performed on a specific `NSOperationQueue`.\n///\n/// This scheduler is suitable for cases when there is some bigger chunk of work that needs to be performed in background and you want to fine tune concurrent processing using `maxConcurrentOperationCount`.\npublic class OperationQueueScheduler: ImmediateSchedulerType {\n    public let operationQueue: OperationQueue\n    \n    /// Constructs new instance of `OperationQueueScheduler` that performs work on `operationQueue`.\n    ///\n    /// - parameter operationQueue: Operation queue targeted to perform work on.\n    public init(operationQueue: OperationQueue) {\n        self.operationQueue = operationQueue\n    }\n    \n    /**\n    Schedules an action to be executed recursively.\n    \n    - parameter state: State passed to the action to be executed.\n    - parameter action: Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    public func schedule<StateType>(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable {\n        let cancel = SingleAssignmentDisposable()\n\n        let operation = BlockOperation {\n            if cancel.isDisposed {\n                return\n            }\n\n\n            cancel.setDisposable(action(state))\n        }\n\n        self.operationQueue.addOperation(operation)\n        \n        return cancel\n    }\n\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/RecursiveScheduler.swift",
    "content": "//\n//  RecursiveScheduler.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 6/7/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nfileprivate enum ScheduleState {\n    case initial\n    case added(CompositeDisposable.DisposeKey)\n    case done\n}\n\n/// Type erased recursive scheduler.\nfinal class AnyRecursiveScheduler<State> {\n    \n    typealias Action =  (State, AnyRecursiveScheduler<State>) -> Void\n\n    private let _lock = RecursiveLock()\n    \n    // state\n    private let _group = CompositeDisposable()\n\n    private var _scheduler: SchedulerType\n    private var _action: Action?\n    \n    init(scheduler: SchedulerType, action: @escaping Action) {\n        _action = action\n        _scheduler = scheduler\n    }\n\n    /**\n    Schedules an action to be executed recursively.\n    \n    - parameter state: State passed to the action to be executed.\n    - parameter dueTime: Relative time after which to execute the recursive action.\n    */\n    func schedule(_ state: State, dueTime: RxTimeInterval) {\n        var scheduleState: ScheduleState = .initial\n\n        let d = _scheduler.scheduleRelative(state, dueTime: dueTime) { (state) -> Disposable in\n            // best effort\n            if self._group.isDisposed {\n                return Disposables.create()\n            }\n            \n            let action = self._lock.calculateLocked { () -> Action? in\n                switch scheduleState {\n                case let .added(removeKey):\n                    self._group.remove(for: removeKey)\n                case .initial:\n                    break\n                case .done:\n                    break\n                }\n\n                scheduleState = .done\n\n                return self._action\n            }\n            \n            if let action = action {\n                action(state, self)\n            }\n            \n            return Disposables.create()\n        }\n            \n        _lock.performLocked {\n            switch scheduleState {\n            case .added:\n                rxFatalError(\"Invalid state\")\n                break\n            case .initial:\n                if let removeKey = _group.insert(d) {\n                    scheduleState = .added(removeKey)\n                }\n                else {\n                    scheduleState = .done\n                }\n                break\n            case .done:\n                break\n            }\n        }\n    }\n\n    /// Schedules an action to be executed recursively.\n    ///\n    /// - parameter state: State passed to the action to be executed.\n    func schedule(_ state: State) {\n        var scheduleState: ScheduleState = .initial\n\n        let d = _scheduler.schedule(state) { (state) -> Disposable in\n            // best effort\n            if self._group.isDisposed {\n                return Disposables.create()\n            }\n            \n            let action = self._lock.calculateLocked { () -> Action? in\n                switch scheduleState {\n                case let .added(removeKey):\n                    self._group.remove(for: removeKey)\n                case .initial:\n                    break\n                case .done:\n                    break\n                }\n\n                scheduleState = .done\n                \n                return self._action\n            }\n           \n            if let action = action {\n                action(state, self)\n            }\n            \n            return Disposables.create()\n        }\n        \n        _lock.performLocked {\n            switch scheduleState {\n            case .added:\n                rxFatalError(\"Invalid state\")\n                break\n            case .initial:\n                if let removeKey = _group.insert(d) {\n                    scheduleState = .added(removeKey)\n                }\n                else {\n                    scheduleState = .done\n                }\n                break\n            case .done:\n                break\n            }\n        }\n    }\n    \n    func dispose() {\n        _lock.performLocked {\n            _action = nil\n        }\n        _group.dispose()\n    }\n}\n\n/// Type erased recursive scheduler.\nfinal class RecursiveImmediateScheduler<State> {\n    typealias Action =  (_ state: State, _ recurse: (State) -> Void) -> Void\n    \n    private var _lock = SpinLock()\n    private let _group = CompositeDisposable()\n    \n    private var _action: Action?\n    private let _scheduler: ImmediateSchedulerType\n    \n    init(action: @escaping Action, scheduler: ImmediateSchedulerType) {\n        _action = action\n        _scheduler = scheduler\n    }\n    \n    // immediate scheduling\n    \n    /// Schedules an action to be executed recursively.\n    ///\n    /// - parameter state: State passed to the action to be executed.\n    func schedule(_ state: State) {\n        var scheduleState: ScheduleState = .initial\n\n        let d = _scheduler.schedule(state) { (state) -> Disposable in\n            // best effort\n            if self._group.isDisposed {\n                return Disposables.create()\n            }\n            \n            let action = self._lock.calculateLocked { () -> Action? in\n                switch scheduleState {\n                case let .added(removeKey):\n                    self._group.remove(for: removeKey)\n                case .initial:\n                    break\n                case .done:\n                    break\n                }\n\n                scheduleState = .done\n\n                return self._action\n            }\n            \n            if let action = action {\n                action(state, self.schedule)\n            }\n            \n            return Disposables.create()\n        }\n        \n        _lock.performLocked {\n            switch scheduleState {\n            case .added:\n                rxFatalError(\"Invalid state\")\n                break\n            case .initial:\n                if let removeKey = _group.insert(d) {\n                    scheduleState = .added(removeKey)\n                }\n                else {\n                    scheduleState = .done\n                }\n                break\n            case .done:\n                break\n            }\n        }\n    }\n    \n    func dispose() {\n        _lock.performLocked {\n            _action = nil\n        }\n        _group.dispose()\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/SchedulerServices+Emulation.swift",
    "content": "//\n//  SchedulerServices+Emulation.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 6/6/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nenum SchedulePeriodicRecursiveCommand {\n    case tick\n    case dispatchStart\n}\n\nfinal class SchedulePeriodicRecursive<State> {\n    typealias RecursiveAction = (State) -> State\n    typealias RecursiveScheduler = AnyRecursiveScheduler<SchedulePeriodicRecursiveCommand>\n\n    private let _scheduler: SchedulerType\n    private let _startAfter: RxTimeInterval\n    private let _period: RxTimeInterval\n    private let _action: RecursiveAction\n\n    private var _state: State\n    private var _pendingTickCount: AtomicInt = 0\n\n    init(scheduler: SchedulerType, startAfter: RxTimeInterval, period: RxTimeInterval, action: @escaping RecursiveAction, state: State) {\n        _scheduler = scheduler\n        _startAfter = startAfter\n        _period = period\n        _action = action\n        _state = state\n    }\n\n    func start() -> Disposable {\n        return _scheduler.scheduleRecursive(SchedulePeriodicRecursiveCommand.tick, dueTime: _startAfter, action: self.tick)\n    }\n\n    func tick(_ command: SchedulePeriodicRecursiveCommand, scheduler: RecursiveScheduler) -> Void {\n        // Tries to emulate periodic scheduling as best as possible.\n        // The problem that could arise is if handling periodic ticks take too long, or\n        // tick interval is short.\n        switch command {\n        case .tick:\n            scheduler.schedule(.tick, dueTime: _period)\n\n            // The idea is that if on tick there wasn't any item enqueued, schedule to perform work immediately.\n            // Else work will be scheduled after previous enqueued work completes.\n            if AtomicIncrement(&_pendingTickCount) == 1 {\n                self.tick(.dispatchStart, scheduler: scheduler)\n            }\n\n        case .dispatchStart:\n            _state = _action(_state)\n            // Start work and schedule check is this last batch of work\n            if AtomicDecrement(&_pendingTickCount) > 0 {\n                // This gives priority to scheduler emulation, it's not perfect, but helps\n                scheduler.schedule(SchedulePeriodicRecursiveCommand.dispatchStart)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/SerialDispatchQueueScheduler.swift",
    "content": "//\n//  SerialDispatchQueueScheduler.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/8/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\nimport struct Foundation.TimeInterval\nimport struct Foundation.Date\nimport Dispatch\n\n/**\nAbstracts the work that needs to be performed on a specific `dispatch_queue_t`. It will make sure \nthat even if concurrent dispatch queue is passed, it's transformed into a serial one.\n\nIt is extremely important that this scheduler is serial, because\ncertain operator perform optimizations that rely on that property.\n\nBecause there is no way of detecting is passed dispatch queue serial or\nconcurrent, for every queue that is being passed, worst case (concurrent)\nwill be assumed, and internal serial proxy dispatch queue will be created.\n\nThis scheduler can also be used with internal serial queue alone.\n\nIn case some customization need to be made on it before usage,\ninternal serial queue can be customized using `serialQueueConfiguration`\ncallback.\n*/\npublic class SerialDispatchQueueScheduler : SchedulerType {\n    public typealias TimeInterval = Foundation.TimeInterval\n    public typealias Time = Date\n    \n    /// - returns: Current time.\n    public var now : Date {\n        return Date()\n    }\n\n    let configuration: DispatchQueueConfiguration\n    \n    init(serialQueue: DispatchQueue, leeway: DispatchTimeInterval = DispatchTimeInterval.nanoseconds(0)) {\n        configuration = DispatchQueueConfiguration(queue: serialQueue, leeway: leeway)\n    }\n\n    /**\n    Constructs new `SerialDispatchQueueScheduler` with internal serial queue named `internalSerialQueueName`.\n    \n    Additional dispatch queue properties can be set after dispatch queue is created using `serialQueueConfiguration`.\n    \n    - parameter internalSerialQueueName: Name of internal serial dispatch queue.\n    - parameter serialQueueConfiguration: Additional configuration of internal serial dispatch queue.\n    */\n    public convenience init(internalSerialQueueName: String, serialQueueConfiguration: ((DispatchQueue) -> Void)? = nil, leeway: DispatchTimeInterval = DispatchTimeInterval.nanoseconds(0)) {\n        let queue = DispatchQueue(label: internalSerialQueueName, attributes: [])\n        serialQueueConfiguration?(queue)\n        self.init(serialQueue: queue, leeway: leeway)\n    }\n    \n    /**\n    Constructs new `SerialDispatchQueueScheduler` named `internalSerialQueueName` that wraps `queue`.\n    \n    - parameter queue: Possibly concurrent dispatch queue used to perform work.\n    - parameter internalSerialQueueName: Name of internal serial dispatch queue proxy.\n    */\n    public convenience init(queue: DispatchQueue, internalSerialQueueName: String, leeway: DispatchTimeInterval = DispatchTimeInterval.nanoseconds(0)) {\n        // Swift 3.0 IUO\n        let serialQueue = DispatchQueue(label: internalSerialQueueName,\n                                        attributes: [],\n                                        target: queue)\n        self.init(serialQueue: serialQueue, leeway: leeway)\n    }\n\n    /**\n     Constructs new `SerialDispatchQueueScheduler` that wraps on of the global concurrent dispatch queues.\n     \n     - parameter qos: Identifier for global dispatch queue with specified quality of service class.\n     - parameter internalSerialQueueName: Custom name for internal serial dispatch queue proxy.\n     */\n    @available(iOS 8, OSX 10.10, *)\n    public convenience init(qos: DispatchQoS, internalSerialQueueName: String = \"rx.global_dispatch_queue.serial\", leeway: DispatchTimeInterval = DispatchTimeInterval.nanoseconds(0)) {\n        self.init(queue: DispatchQueue.global(qos: qos.qosClass), internalSerialQueueName: internalSerialQueueName, leeway: leeway)\n    }\n    \n    /**\n    Schedules an action to be executed immediately.\n    \n    - parameter state: State passed to the action to be executed.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    public final func schedule<StateType>(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable {\n        return self.scheduleInternal(state, action: action)\n    }\n\n    func scheduleInternal<StateType>(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable {\n        return self.configuration.schedule(state, action: action)\n    }\n\n    /**\n    Schedules an action to be executed.\n    \n    - parameter state: State passed to the action to be executed.\n    - parameter dueTime: Relative time after which to execute the action.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    public final func scheduleRelative<StateType>(_ state: StateType, dueTime: Foundation.TimeInterval, action: @escaping (StateType) -> Disposable) -> Disposable {\n        return self.configuration.scheduleRelative(state, dueTime: dueTime, action: action)\n    }\n    \n    /**\n    Schedules a periodic piece of work.\n    \n    - parameter state: State passed to the action to be executed.\n    - parameter startAfter: Period after which initial work should be run.\n    - parameter period: Period for running the work periodically.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    public func schedulePeriodic<StateType>(_ state: StateType, startAfter: TimeInterval, period: TimeInterval, action: @escaping (StateType) -> StateType) -> Disposable {\n        return self.configuration.schedulePeriodic(state, startAfter: startAfter, period: period, action: action)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/VirtualTimeConverterType.swift",
    "content": "//\n//  VirtualTimeConverterType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 12/23/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Parametrization for virtual time used by `VirtualTimeScheduler`s.\npublic protocol VirtualTimeConverterType {\n    /// Virtual time unit used that represents ticks of virtual clock.\n    associatedtype VirtualTimeUnit\n\n    /// Virtual time unit used to represent differences of virtual times.\n    associatedtype VirtualTimeIntervalUnit\n\n    /**\n     Converts virtual time to real time.\n     \n     - parameter virtualTime: Virtual time to convert to `Date`.\n     - returns: `Date` corresponding to virtual time.\n    */\n    func convertFromVirtualTime(_ virtualTime: VirtualTimeUnit) -> RxTime\n\n    /**\n     Converts real time to virtual time.\n     \n     - parameter time: `Date` to convert to virtual time.\n     - returns: Virtual time corresponding to `Date`.\n    */\n    func convertToVirtualTime(_ time: RxTime) -> VirtualTimeUnit\n\n    /**\n     Converts from virtual time interval to `NSTimeInterval`.\n     \n     - parameter virtualTimeInterval: Virtual time interval to convert to `NSTimeInterval`.\n     - returns: `NSTimeInterval` corresponding to virtual time interval.\n    */\n    func convertFromVirtualTimeInterval(_ virtualTimeInterval: VirtualTimeIntervalUnit) -> RxTimeInterval\n\n    /**\n     Converts from virtual time interval to `NSTimeInterval`.\n     \n     - parameter timeInterval: `NSTimeInterval` to convert to virtual time interval.\n     - returns: Virtual time interval corresponding to time interval.\n    */\n    func convertToVirtualTimeInterval(_ timeInterval: RxTimeInterval) -> VirtualTimeIntervalUnit\n\n    /**\n     Offsets virtual time by virtual time interval.\n     \n     - parameter time: Virtual time.\n     - parameter offset: Virtual time interval.\n     - returns: Time corresponding to time offsetted by virtual time interval.\n    */\n    func offsetVirtualTime(_ time: VirtualTimeUnit, offset: VirtualTimeIntervalUnit) -> VirtualTimeUnit\n\n    /**\n     This is aditional abstraction because `Date` is unfortunately not comparable.\n     Extending `Date` with `Comparable` would be too risky because of possible collisions with other libraries.\n    */\n    func compareVirtualTime(_ lhs: VirtualTimeUnit, _ rhs: VirtualTimeUnit) -> VirtualTimeComparison\n}\n\n/**\n Virtual time comparison result.\n\n This is aditional abstraction because `Date` is unfortunately not comparable.\n Extending `Date` with `Comparable` would be too risky because of possible collisions with other libraries.\n*/\npublic enum VirtualTimeComparison {\n    /// lhs < rhs.\n    case lessThan\n    /// lhs == rhs.\n    case equal\n    /// lhs > rhs.\n    case greaterThan\n}\n\nextension VirtualTimeComparison {\n    /// lhs < rhs.\n    var lessThen: Bool {\n        return self == .lessThan\n    }\n\n    /// lhs > rhs\n    var greaterThan: Bool {\n        return self == .greaterThan\n    }\n\n    /// lhs == rhs\n    var equal: Bool {\n        return self == .equal\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Schedulers/VirtualTimeScheduler.swift",
    "content": "//\n//  VirtualTimeScheduler.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Base class for virtual time schedulers using a priority queue for scheduled items.\nopen class VirtualTimeScheduler<Converter: VirtualTimeConverterType>\n    : SchedulerType {\n\n    public typealias VirtualTime = Converter.VirtualTimeUnit\n    public typealias VirtualTimeInterval = Converter.VirtualTimeIntervalUnit\n\n    private var _running : Bool\n\n    private var _clock: VirtualTime\n\n    fileprivate var _schedulerQueue : PriorityQueue<VirtualSchedulerItem<VirtualTime>>\n    private var _converter: Converter\n\n    private var _nextId = 0\n\n    /// - returns: Current time.\n    public var now: RxTime {\n        return _converter.convertFromVirtualTime(clock)\n    }\n\n    /// - returns: Scheduler's absolute time clock value.\n    public var clock: VirtualTime {\n        return _clock\n    }\n\n    /// Creates a new virtual time scheduler.\n    ///\n    /// - parameter initialClock: Initial value for the clock.\n    public init(initialClock: VirtualTime, converter: Converter) {\n        _clock = initialClock\n        _running = false\n        _converter = converter\n        _schedulerQueue = PriorityQueue(hasHigherPriority: {\n            switch converter.compareVirtualTime($0.time, $1.time) {\n            case .lessThan:\n                return true\n            case .equal:\n                return $0.id < $1.id\n            case .greaterThan:\n                return false\n            }\n        }, isEqual: { $0 === $1 })\n        #if TRACE_RESOURCES\n            let _ = Resources.incrementTotal()\n        #endif\n    }\n\n    /**\n    Schedules an action to be executed immediately.\n\n    - parameter state: State passed to the action to be executed.\n    - parameter action: Action to be executed.\n    - returns: The disposable object used to cancel the scheduled action (best effort).\n    */\n    public func schedule<StateType>(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable {\n        return self.scheduleRelative(state, dueTime: 0.0) { a in\n            return action(a)\n        }\n    }\n\n    /**\n     Schedules an action to be executed.\n\n     - parameter state: State passed to the action to be executed.\n     - parameter dueTime: Relative time after which to execute the action.\n     - parameter action: Action to be executed.\n     - returns: The disposable object used to cancel the scheduled action (best effort).\n     */\n    public func scheduleRelative<StateType>(_ state: StateType, dueTime: RxTimeInterval, action: @escaping (StateType) -> Disposable) -> Disposable {\n        let time = self.now.addingTimeInterval(dueTime)\n        let absoluteTime = _converter.convertToVirtualTime(time)\n        let adjustedTime = self.adjustScheduledTime(absoluteTime)\n        return scheduleAbsoluteVirtual(state, time: adjustedTime, action: action)\n    }\n\n    /**\n     Schedules an action to be executed after relative time has passed.\n\n     - parameter state: State passed to the action to be executed.\n     - parameter time: Absolute time when to execute the action. If this is less or equal then `now`, `now + 1`  will be used.\n     - parameter action: Action to be executed.\n     - returns: The disposable object used to cancel the scheduled action (best effort).\n     */\n    public func scheduleRelativeVirtual<StateType>(_ state: StateType, dueTime: VirtualTimeInterval, action: @escaping (StateType) -> Disposable) -> Disposable {\n        let time = _converter.offsetVirtualTime(self.clock, offset: dueTime)\n        return scheduleAbsoluteVirtual(state, time: time, action: action)\n    }\n\n    /**\n     Schedules an action to be executed at absolute virtual time.\n\n     - parameter state: State passed to the action to be executed.\n     - parameter time: Absolute time when to execute the action.\n     - parameter action: Action to be executed.\n     - returns: The disposable object used to cancel the scheduled action (best effort).\n     */\n    public func scheduleAbsoluteVirtual<StateType>(_ state: StateType, time: Converter.VirtualTimeUnit, action: @escaping (StateType) -> Disposable) -> Disposable {\n        MainScheduler.ensureExecutingOnScheduler()\n\n        let compositeDisposable = CompositeDisposable()\n\n        let item = VirtualSchedulerItem(action: {\n            let dispose = action(state)\n            return dispose\n        }, time: time, id: _nextId)\n\n        _nextId += 1\n\n        _schedulerQueue.enqueue(item)\n        \n        _ = compositeDisposable.insert(item)\n        \n        return compositeDisposable\n    }\n\n    /// Adjusts time of scheduling before adding item to schedule queue.\n    open func adjustScheduledTime(_ time: Converter.VirtualTimeUnit) -> Converter.VirtualTimeUnit {\n        return time\n    }\n\n    /// Starts the virtual time scheduler.\n    public func start() {\n        MainScheduler.ensureExecutingOnScheduler()\n\n        if _running {\n            return\n        }\n\n        _running = true\n        repeat {\n            guard let next = findNext() else {\n                break\n            }\n\n            if _converter.compareVirtualTime(next.time, self.clock).greaterThan  {\n                _clock = next.time\n            }\n\n            next.invoke()\n            _schedulerQueue.remove(next)\n        } while _running\n\n        _running = false\n    }\n\n    func findNext() -> VirtualSchedulerItem<VirtualTime>? {\n        while let front = _schedulerQueue.peek() {\n            if front.isDisposed {\n                _schedulerQueue.remove(front)\n                continue\n            }\n\n            return front\n        }\n\n        return nil\n    }\n\n    /// Advances the scheduler's clock to the specified time, running all work till that point.\n    ///\n    /// - parameter virtualTime: Absolute time to advance the scheduler's clock to.\n    public func advanceTo(_ virtualTime: VirtualTime) {\n        MainScheduler.ensureExecutingOnScheduler()\n\n        if _running {\n            fatalError(\"Scheduler is already running\")\n        }\n\n        _running = true\n        repeat {\n            guard let next = findNext() else {\n                break\n            }\n\n            if _converter.compareVirtualTime(next.time, virtualTime).greaterThan {\n                break\n            }\n\n            if _converter.compareVirtualTime(next.time, self.clock).greaterThan  {\n                _clock = next.time\n            }\n\n            next.invoke()\n            _schedulerQueue.remove(next)\n        } while _running\n\n        _clock = virtualTime\n        _running = false\n    }\n\n    /// Advances the scheduler's clock by the specified relative time.\n    public func sleep(_ virtualInterval: VirtualTimeInterval) {\n        MainScheduler.ensureExecutingOnScheduler()\n\n        let sleepTo = _converter.offsetVirtualTime(clock, offset: virtualInterval)\n        if _converter.compareVirtualTime(sleepTo, clock).lessThen {\n            fatalError(\"Can't sleep to past.\")\n        }\n\n        _clock = sleepTo\n    }\n\n    /// Stops the virtual time scheduler.\n    public func stop() {\n        MainScheduler.ensureExecutingOnScheduler()\n\n        _running = false\n    }\n\n    #if TRACE_RESOURCES\n        deinit {\n            _ = Resources.decrementTotal()\n        }\n    #endif\n}\n\n// MARK: description\n\nextension VirtualTimeScheduler: CustomDebugStringConvertible {\n    /// A textual representation of `self`, suitable for debugging.\n    public var debugDescription: String {\n        return self._schedulerQueue.debugDescription\n    }\n}\n\nfinal class VirtualSchedulerItem<Time>\n    : Disposable {\n    typealias Action = () -> Disposable\n    \n    let action: Action\n    let time: Time\n    let id: Int\n\n    var isDisposed: Bool {\n        return disposable.isDisposed\n    }\n    \n    var disposable = SingleAssignmentDisposable()\n    \n    init(action: @escaping Action, time: Time, id: Int) {\n        self.action = action\n        self.time = time\n        self.id = id\n    }\n\n    func invoke() {\n         self.disposable.setDisposable(action())\n    }\n    \n    func dispose() {\n        self.disposable.dispose()\n    }\n}\n\nextension VirtualSchedulerItem\n    : CustomDebugStringConvertible {\n    var debugDescription: String {\n        return \"\\(time)\"\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Subjects/AsyncSubject.swift",
    "content": "//\n//  AsyncSubject.swift\n//  RxSwift\n//\n//  Created by Victor Galán on 07/01/2017.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n/// An AsyncSubject emits the last value (and only the last value) emitted by the source Observable,\n/// and only after that source Observable completes.\n///\n/// (If the source Observable does not emit any values, the AsyncSubject also completes without emitting any values.)\npublic final class AsyncSubject<Element>\n    : Observable<Element>\n    , SubjectType\n    , ObserverType\n    , SynchronizedUnsubscribeType {\n    public typealias SubjectObserverType = AsyncSubject<Element>\n\n    typealias Observers = AnyObserver<Element>.s\n    typealias DisposeKey = Observers.KeyType\n\n    /// Indicates whether the subject has any observers\n    public var hasObservers: Bool {\n        _lock.lock(); defer { _lock.unlock() }\n        return _observers.count > 0\n    }\n\n    let _lock = RecursiveLock()\n\n    // state\n    private var _observers = Observers()\n    private var _isStopped = false\n    private var _stoppedEvent = nil as Event<Element>? {\n        didSet {\n            _isStopped = _stoppedEvent != nil\n        }\n    }\n    private var _lastElement: Element?\n\n    #if DEBUG\n        fileprivate let _synchronizationTracker = SynchronizationTracker()\n    #endif\n\n\n    /// Creates a subject.\n    public override init() {\n        #if TRACE_RESOURCES\n            _ = Resources.incrementTotal()\n        #endif\n        super.init()\n    }\n\n    /// Notifies all subscribed observers about next event.\n    ///\n    /// - parameter event: Event to send to the observers.\n    public func on(_ event: Event<E>) {\n        #if DEBUG\n            _synchronizationTracker.register(synchronizationErrorMessage: .default)\n            defer { _synchronizationTracker.unregister() }\n        #endif\n        let (observers, event) = _synchronized_on(event)\n        switch event {\n        case .next:\n            dispatch(observers, event)\n            dispatch(observers, .completed)\n        case .completed:\n            dispatch(observers, event)\n        case .error:\n            dispatch(observers, event)\n        }\n    }\n\n    func _synchronized_on(_ event: Event<E>) -> (Observers, Event<E>) {\n        _lock.lock(); defer { _lock.unlock() }\n        if _isStopped {\n            return (Observers(), .completed)\n        }\n\n        switch event {\n        case .next(let element):\n            _lastElement = element\n            return (Observers(), .completed)\n        case .error:\n            _stoppedEvent = event\n\n            let observers = _observers\n            _observers.removeAll()\n\n            return (observers, event)\n        case .completed:\n\n            let observers = _observers\n            _observers.removeAll()\n\n            if let lastElement = _lastElement {\n                _stoppedEvent = .next(lastElement)\n                return (observers, .next(lastElement))\n            }\n            else {\n                _stoppedEvent = event\n                return (observers, .completed)\n            }\n        }\n    }\n\n    /// Subscribes an observer to the subject.\n    ///\n    /// - parameter observer: Observer to subscribe to the subject.\n    /// - returns: Disposable object that can be used to unsubscribe the observer from the subject.\n    public override func subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == Element {\n        _lock.lock(); defer { _lock.unlock() }\n        return _synchronized_subscribe(observer)\n    }\n\n    func _synchronized_subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == E {\n        if let stoppedEvent = _stoppedEvent {\n            switch stoppedEvent {\n            case .next:\n                observer.on(stoppedEvent)\n                observer.on(.completed)\n            case .completed:\n                observer.on(stoppedEvent)\n            case .error:\n                observer.on(stoppedEvent)\n            }\n            return Disposables.create()\n        }\n\n        let key = _observers.insert(observer.on)\n\n        return SubscriptionDisposable(owner: self, key: key)\n    }\n\n    func synchronizedUnsubscribe(_ disposeKey: DisposeKey) {\n        _lock.lock(); defer { _lock.unlock() }\n        _synchronized_unsubscribe(disposeKey)\n    }\n    \n    func _synchronized_unsubscribe(_ disposeKey: DisposeKey) {\n        _ = _observers.removeKey(disposeKey)\n    }\n    \n    /// Returns observer interface for subject.\n    public func asObserver() -> AsyncSubject<Element> {\n        return self\n    }\n\n    #if TRACE_RESOURCES\n    deinit {\n        _ = Resources.decrementTotal()\n    }\n    #endif\n}\n\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Subjects/BehaviorSubject.swift",
    "content": "//\n//  BehaviorSubject.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 5/23/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents a value that changes over time.\n///\n/// Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\npublic final class BehaviorSubject<Element>\n    : Observable<Element>\n    , SubjectType\n    , ObserverType\n    , SynchronizedUnsubscribeType\n    , Disposable {\n    public typealias SubjectObserverType = BehaviorSubject<Element>\n\n    typealias Observers = AnyObserver<Element>.s\n    typealias DisposeKey = Observers.KeyType\n    \n    /// Indicates whether the subject has any observers\n    public var hasObservers: Bool {\n        _lock.lock()\n        let value = _observers.count > 0\n        _lock.unlock()\n        return value\n    }\n    \n    let _lock = RecursiveLock()\n    \n    // state\n    private var _isDisposed = false\n    private var _element: Element\n    private var _observers = Observers()\n    private var _stoppedEvent: Event<Element>?\n\n    #if DEBUG\n        fileprivate let _synchronizationTracker = SynchronizationTracker()\n    #endif\n\n    /// Indicates whether the subject has been disposed.\n    public var isDisposed: Bool {\n        return _isDisposed\n    }\n \n    /// Initializes a new instance of the subject that caches its last value and starts with the specified value.\n    ///\n    /// - parameter value: Initial value sent to observers when no other value has been received by the subject yet.\n    public init(value: Element) {\n        _element = value\n\n        #if TRACE_RESOURCES\n            _ = Resources.incrementTotal()\n        #endif\n    }\n    \n    /// Gets the current value or throws an error.\n    ///\n    /// - returns: Latest value.\n    public func value() throws -> Element {\n        _lock.lock(); defer { _lock.unlock() } // {\n            if _isDisposed {\n                throw RxError.disposed(object: self)\n            }\n            \n            if let error = _stoppedEvent?.error {\n                // intentionally throw exception\n                throw error\n            }\n            else {\n                return _element\n            }\n        //}\n    }\n    \n    /// Notifies all subscribed observers about next event.\n    ///\n    /// - parameter event: Event to send to the observers.\n    public func on(_ event: Event<E>) {\n        #if DEBUG\n            _synchronizationTracker.register(synchronizationErrorMessage: .default)\n            defer { _synchronizationTracker.unregister() }\n        #endif\n        dispatch(_synchronized_on(event), event)\n    }\n\n    func _synchronized_on(_ event: Event<E>) -> Observers {\n        _lock.lock(); defer { _lock.unlock() }\n        if _stoppedEvent != nil || _isDisposed {\n            return Observers()\n        }\n        \n        switch event {\n        case .next(let element):\n            _element = element\n        case .error, .completed:\n            _stoppedEvent = event\n        }\n        \n        return _observers\n    }\n    \n    /// Subscribes an observer to the subject.\n    ///\n    /// - parameter observer: Observer to subscribe to the subject.\n    /// - returns: Disposable object that can be used to unsubscribe the observer from the subject.\n    public override func subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == Element {\n        _lock.lock()\n        let subscription = _synchronized_subscribe(observer)\n        _lock.unlock()\n        return subscription\n    }\n\n    func _synchronized_subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == E {\n        if _isDisposed {\n            observer.on(.error(RxError.disposed(object: self)))\n            return Disposables.create()\n        }\n        \n        if let stoppedEvent = _stoppedEvent {\n            observer.on(stoppedEvent)\n            return Disposables.create()\n        }\n        \n        let key = _observers.insert(observer.on)\n        observer.on(.next(_element))\n    \n        return SubscriptionDisposable(owner: self, key: key)\n    }\n\n    func synchronizedUnsubscribe(_ disposeKey: DisposeKey) {\n        _lock.lock()\n        _synchronized_unsubscribe(disposeKey)\n        _lock.unlock()\n    }\n\n    func _synchronized_unsubscribe(_ disposeKey: DisposeKey) {\n        if _isDisposed {\n            return\n        }\n\n        _ = _observers.removeKey(disposeKey)\n    }\n\n    /// Returns observer interface for subject.\n    public func asObserver() -> BehaviorSubject<Element> {\n        return self\n    }\n\n    /// Unsubscribe all observers and release resources.\n    public func dispose() {\n        _lock.lock()\n        _isDisposed = true\n        _observers.removeAll()\n        _stoppedEvent = nil\n        _lock.unlock()\n    }\n\n    #if TRACE_RESOURCES\n        deinit {\n        _ = Resources.decrementTotal()\n        }\n    #endif\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Subjects/PublishSubject.swift",
    "content": "//\n//  PublishSubject.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 2/11/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents an object that is both an observable sequence as well as an observer.\n///\n/// Each notification is broadcasted to all subscribed observers.\npublic final class PublishSubject<Element>\n    : Observable<Element>\n    , SubjectType\n    , Cancelable\n    , ObserverType\n    , SynchronizedUnsubscribeType {\n    public typealias SubjectObserverType = PublishSubject<Element>\n\n    typealias Observers = AnyObserver<Element>.s\n    typealias DisposeKey = Observers.KeyType\n    \n    /// Indicates whether the subject has any observers\n    public var hasObservers: Bool {\n        _lock.lock()\n        let count = _observers.count > 0\n        _lock.unlock()\n        return count\n    }\n    \n    private let _lock = RecursiveLock()\n    \n    // state\n    private var _isDisposed = false\n    private var _observers = Observers()\n    private var _stopped = false\n    private var _stoppedEvent = nil as Event<Element>?\n\n    #if DEBUG\n        fileprivate let _synchronizationTracker = SynchronizationTracker()\n    #endif\n\n    /// Indicates whether the subject has been isDisposed.\n    public var isDisposed: Bool {\n        return _isDisposed\n    }\n    \n    /// Creates a subject.\n    public override init() {\n        super.init()\n        #if TRACE_RESOURCES\n            _ = Resources.incrementTotal()\n        #endif\n    }\n    \n    /// Notifies all subscribed observers about next event.\n    ///\n    /// - parameter event: Event to send to the observers.\n    public func on(_ event: Event<Element>) {\n        #if DEBUG\n            _synchronizationTracker.register(synchronizationErrorMessage: .default)\n            defer { _synchronizationTracker.unregister() }\n        #endif\n        dispatch(_synchronized_on(event), event)\n    }\n\n    func _synchronized_on(_ event: Event<E>) -> Observers {\n        _lock.lock(); defer { _lock.unlock() }\n        switch event {\n        case .next(_):\n            if _isDisposed || _stopped {\n                return Observers()\n            }\n            \n            return _observers\n        case .completed, .error:\n            if _stoppedEvent == nil {\n                _stoppedEvent = event\n                _stopped = true\n                let observers = _observers\n                _observers.removeAll()\n                return observers\n            }\n\n            return Observers()\n        }\n    }\n    \n    /**\n    Subscribes an observer to the subject.\n    \n    - parameter observer: Observer to subscribe to the subject.\n    - returns: Disposable object that can be used to unsubscribe the observer from the subject.\n    */\n    public override func subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == Element {\n        _lock.lock()\n        let subscription = _synchronized_subscribe(observer)\n        _lock.unlock()\n        return subscription\n    }\n\n    func _synchronized_subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == E {\n        if let stoppedEvent = _stoppedEvent {\n            observer.on(stoppedEvent)\n            return Disposables.create()\n        }\n        \n        if _isDisposed {\n            observer.on(.error(RxError.disposed(object: self)))\n            return Disposables.create()\n        }\n        \n        let key = _observers.insert(observer.on)\n        return SubscriptionDisposable(owner: self, key: key)\n    }\n\n    func synchronizedUnsubscribe(_ disposeKey: DisposeKey) {\n        _lock.lock()\n        _synchronized_unsubscribe(disposeKey)\n        _lock.unlock()\n    }\n\n    func _synchronized_unsubscribe(_ disposeKey: DisposeKey) {\n        _ = _observers.removeKey(disposeKey)\n    }\n    \n    /// Returns observer interface for subject.\n    public func asObserver() -> PublishSubject<Element> {\n        return self\n    }\n    \n    /// Unsubscribe all observers and release resources.\n    public func dispose() {\n        _lock.lock()\n        _synchronized_dispose()\n        _lock.unlock()\n    }\n\n    final func _synchronized_dispose() {\n        _isDisposed = true\n        _observers.removeAll()\n        _stoppedEvent = nil\n    }\n\n    #if TRACE_RESOURCES\n        deinit {\n            _ = Resources.decrementTotal()\n        }\n    #endif\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Subjects/ReplaySubject.swift",
    "content": "//\n//  ReplaySubject.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 4/14/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents an object that is both an observable sequence as well as an observer.\n///\n/// Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\npublic class ReplaySubject<Element>\n    : Observable<Element>\n    , SubjectType\n    , ObserverType\n    , Disposable {\n    public typealias SubjectObserverType = ReplaySubject<Element>\n\n    typealias Observers = AnyObserver<Element>.s\n    typealias DisposeKey = Observers.KeyType\n\n    /// Indicates whether the subject has any observers\n    public var hasObservers: Bool {\n        _lock.lock()\n        let value = _observers.count > 0\n        _lock.unlock()\n        return value\n    }\n    \n    fileprivate let _lock = RecursiveLock()\n    \n    // state\n    fileprivate var _isDisposed = false\n    fileprivate var _isStopped = false\n    fileprivate var _stoppedEvent = nil as Event<Element>? {\n        didSet {\n            _isStopped = _stoppedEvent != nil\n        }\n    }\n    fileprivate var _observers = Observers()\n\n    #if DEBUG\n        fileprivate let _synchronizationTracker = SynchronizationTracker()\n    #endif\n\n    func unsubscribe(_ key: DisposeKey) {\n        rxAbstractMethod()\n    }\n\n    final var isStopped: Bool {\n        return _isStopped\n    }\n    \n    /// Notifies all subscribed observers about next event.\n    ///\n    /// - parameter event: Event to send to the observers.\n    public func on(_ event: Event<E>) {\n        rxAbstractMethod()\n    }\n    \n    /// Returns observer interface for subject.\n    public func asObserver() -> SubjectObserverType {\n        return self\n    }\n    \n    /// Unsubscribe all observers and release resources.\n    public func dispose() {\n    }\n\n    /// Creates new instance of `ReplaySubject` that replays at most `bufferSize` last elements of sequence.\n    ///\n    /// - parameter bufferSize: Maximal number of elements to replay to observer after subscription.\n    /// - returns: New instance of replay subject.\n    public static func create(bufferSize: Int) -> ReplaySubject<Element> {\n        if bufferSize == 1 {\n            return ReplayOne()\n        }\n        else {\n            return ReplayMany(bufferSize: bufferSize)\n        }\n    }\n\n    /// Creates a new instance of `ReplaySubject` that buffers all the elements of a sequence.\n    /// To avoid filling up memory, developer needs to make sure that the use case will only ever store a 'reasonable'\n    /// number of elements.\n    public static func createUnbounded() -> ReplaySubject<Element> {\n        return ReplayAll()\n    }\n\n    #if TRACE_RESOURCES\n        override init() {\n            _ = Resources.incrementTotal()\n        }\n\n        deinit {\n            _ = Resources.decrementTotal()\n        }\n    #endif\n}\n\nfileprivate class ReplayBufferBase<Element>\n    : ReplaySubject<Element>\n    , SynchronizedUnsubscribeType {\n    \n    func trim() {\n        rxAbstractMethod()\n    }\n    \n    func addValueToBuffer(_ value: Element) {\n        rxAbstractMethod()\n    }\n    \n    func replayBuffer<O: ObserverType>(_ observer: O) where O.E == Element {\n        rxAbstractMethod()\n    }\n    \n    override func on(_ event: Event<Element>) {\n        #if DEBUG\n            _synchronizationTracker.register(synchronizationErrorMessage: .default)\n            defer { _synchronizationTracker.unregister() }\n        #endif\n        dispatch(_synchronized_on(event), event)\n    }\n\n    func _synchronized_on(_ event: Event<E>) -> Observers {\n        _lock.lock(); defer { _lock.unlock() }\n        if _isDisposed {\n            return Observers()\n        }\n        \n        if _isStopped {\n            return Observers()\n        }\n        \n        switch event {\n        case .next(let element):\n            addValueToBuffer(element)\n            trim()\n            return _observers\n        case .error, .completed:\n            _stoppedEvent = event\n            trim()\n            let observers = _observers\n            _observers.removeAll()\n            return observers\n        }\n    }\n    \n    override func subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == Element {\n        _lock.lock()\n        let subscription = _synchronized_subscribe(observer)\n        _lock.unlock()\n        return subscription\n    }\n\n    func _synchronized_subscribe<O : ObserverType>(_ observer: O) -> Disposable where O.E == E {\n        if _isDisposed {\n            observer.on(.error(RxError.disposed(object: self)))\n            return Disposables.create()\n        }\n     \n        let anyObserver = observer.asObserver()\n        \n        replayBuffer(anyObserver)\n        if let stoppedEvent = _stoppedEvent {\n            observer.on(stoppedEvent)\n            return Disposables.create()\n        }\n        else {\n            let key = _observers.insert(observer.on)\n            return SubscriptionDisposable(owner: self, key: key)\n        }\n    }\n\n    func synchronizedUnsubscribe(_ disposeKey: DisposeKey) {\n        _lock.lock()\n        _synchronized_unsubscribe(disposeKey)\n        _lock.unlock()\n    }\n\n    func _synchronized_unsubscribe(_ disposeKey: DisposeKey) {\n        if _isDisposed {\n            return\n        }\n        \n        _ = _observers.removeKey(disposeKey)\n    }\n    \n    override func dispose() {\n        super.dispose()\n\n        synchronizedDispose()\n    }\n\n    func synchronizedDispose() {\n        _lock.lock()\n        _synchronized_dispose()\n        _lock.unlock()\n    }\n\n    func _synchronized_dispose() {\n        _isDisposed = true\n        _observers.removeAll()\n    }\n}\n\nfileprivate final class ReplayOne<Element> : ReplayBufferBase<Element> {\n    private var _value: Element?\n    \n    override init() {\n        super.init()\n    }\n    \n    override func trim() {\n        \n    }\n    \n    override func addValueToBuffer(_ value: Element) {\n        _value = value\n    }\n\n    override func replayBuffer<O: ObserverType>(_ observer: O) where O.E == Element {\n        if let value = _value {\n            observer.on(.next(value))\n        }\n    }\n\n    override func _synchronized_dispose() {\n        super._synchronized_dispose()\n        _value = nil\n    }\n}\n\nfileprivate class ReplayManyBase<Element> : ReplayBufferBase<Element> {\n    fileprivate var _queue: Queue<Element>\n    \n    init(queueSize: Int) {\n        _queue = Queue(capacity: queueSize + 1)\n    }\n    \n    override func addValueToBuffer(_ value: Element) {\n        _queue.enqueue(value)\n    }\n\n    override func replayBuffer<O: ObserverType>(_ observer: O) where O.E == Element {\n        for item in _queue {\n            observer.on(.next(item))\n        }\n    }\n\n    override func _synchronized_dispose() {\n        super._synchronized_dispose()\n        _queue = Queue(capacity: 0)\n    }\n}\n\nfileprivate final class ReplayMany<Element> : ReplayManyBase<Element> {\n    private let _bufferSize: Int\n    \n    init(bufferSize: Int) {\n        _bufferSize = bufferSize\n        \n        super.init(queueSize: bufferSize)\n    }\n    \n    override func trim() {\n        while _queue.count > _bufferSize {\n            _ = _queue.dequeue()\n        }\n    }\n}\n\nfileprivate final class ReplayAll<Element> : ReplayManyBase<Element> {\n    init() {\n        super.init(queueSize: 0)\n    }\n    \n    override func trim() {\n        \n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Subjects/SubjectType.swift",
    "content": "//\n//  SubjectType.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/1/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n/// Represents an object that is both an observable sequence as well as an observer.\npublic protocol SubjectType : ObservableType {\n    /// The type of the observer that represents this subject.\n    ///\n    /// Usually this type is type of subject itself, but it doesn't have to be.\n    associatedtype SubjectObserverType : ObserverType\n\n    /// Returns observer interface for subject.\n    ///\n    /// - returns: Observer interface for subject.\n    func asObserver() -> SubjectObserverType\n    \n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/SwiftSupport/SwiftSupport.swift",
    "content": "//\n//  SwiftSupport.swift\n//  RxSwift\n//\n//  Created by Volodymyr  Gorbenko on 3/6/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nimport Foundation\n\n#if swift(>=4.0)\n    typealias IntMax = Int64\n    public typealias RxAbstractInteger = FixedWidthInteger\n    \n    extension SignedInteger {\n        func toIntMax() -> IntMax {\n            return IntMax(self)\n        }\n    }\n#else\n    public typealias RxAbstractInteger = SignedInteger\n  \n    extension Array {\n        public mutating func swapAt(_ i: Int, _ j: Int) {\n            swap(&self[i], &self[j])\n        }\n    }\n  \n#endif\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Traits/Completable+AndThen.swift",
    "content": "//\n//  Completable+AndThen.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 7/2/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nextension PrimitiveSequenceType where TraitType == CompletableTrait, ElementType == Never {\n    /**\n     Concatenates the second observable sequence to `self` upon successful termination of `self`.\n\n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n\n     - parameter second: Second observable sequence.\n     - returns: An observable sequence that contains the elements of `self`, followed by those of the second sequence.\n     */\n    public func andThen<E>(_ second: Single<E>) -> Single<E> {\n        let completable = self.primitiveSequence.asObservable()\n        return Single(raw: ConcatCompletable(completable: completable, second: second.asObservable()))\n    }\n\n    /**\n     Concatenates the second observable sequence to `self` upon successful termination of `self`.\n\n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n\n     - parameter second: Second observable sequence.\n     - returns: An observable sequence that contains the elements of `self`, followed by those of the second sequence.\n     */\n    public func andThen<E>(_ second: Maybe<E>) -> Maybe<E> {\n        let completable = self.primitiveSequence.asObservable()\n        return Maybe(raw: ConcatCompletable(completable: completable, second: second.asObservable()))\n    }\n\n    /**\n     Concatenates the second observable sequence to `self` upon successful termination of `self`.\n\n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n\n     - parameter second: Second observable sequence.\n     - returns: An observable sequence that contains the elements of `self`, followed by those of the second sequence.\n     */\n    public func andThen(_ second: Completable) -> Completable {\n        let completable = self.primitiveSequence.asObservable()\n        return Completable(raw: ConcatCompletable(completable: completable, second: second.asObservable()))\n    }\n\n    /**\n     Concatenates the second observable sequence to `self` upon successful termination of `self`.\n\n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n\n     - parameter second: Second observable sequence.\n     - returns: An observable sequence that contains the elements of `self`, followed by those of the second sequence.\n     */\n    public func andThen<E>(_ second: Observable<E>) -> Observable<E> {\n        let completable = self.primitiveSequence.asObservable()\n        return ConcatCompletable(completable: completable, second: second.asObservable())\n    }\n}\n\nfinal fileprivate class ConcatCompletable<Element> : Producer<Element> {\n    fileprivate let _completable: Observable<Never>\n    fileprivate let _second: Observable<Element>\n\n    init(completable: Observable<Never>, second: Observable<Element>) {\n        self._completable = completable\n        self._second = second\n    }\n\n    override func run<O>(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O : ObserverType, O.E == Element {\n        let sink = ConcatCompletableSink(parent: self, observer: observer, cancel: cancel)\n        let subscription = sink.run()\n        return (sink: sink, subscription: subscription)\n    }\n}\n\nfinal fileprivate class ConcatCompletableSink<O: ObserverType>\n    : Sink<O>\n    , ObserverType {\n    typealias E = Never\n    typealias Parent = ConcatCompletable<O.E>\n\n    private let _parent: Parent\n    private let _subscription = SerialDisposable()\n    \n    init(parent: Parent, observer: O, cancel: Cancelable) {\n        self._parent = parent\n        super.init(observer: observer, cancel: cancel)\n    }\n\n    func on(_ event: Event<E>) {\n        switch event {\n        case .error(let error):\n            self.forwardOn(.error(error))\n            self.dispose()\n        case .next:\n            break\n        case .completed:\n            let otherSink = ConcatCompletableSinkOther(parent: self)\n            _subscription.disposable = _parent._second.subscribe(otherSink)\n        }\n    }\n\n    func run() -> Disposable {\n        let subscription = SingleAssignmentDisposable()\n        _subscription.disposable = subscription\n        subscription.setDisposable(_parent._completable.subscribe(self))\n        return _subscription\n    }\n}\n\nfinal fileprivate class ConcatCompletableSinkOther<O: ObserverType>\n    : ObserverType {\n    typealias E = O.E\n\n    typealias Parent = ConcatCompletableSink<O>\n    \n    private let _parent: Parent\n\n    init(parent: Parent) {\n        self._parent = parent\n    }\n\n    func on(_ event: Event<O.E>) {\n        _parent.forwardOn(event)\n        if event.isStopEvent {\n            _parent.dispose()\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Traits/Completable.swift",
    "content": "//\n//  Completable.swift\n//  RxSwift\n//\n//  Created by sergdort on 19/08/2017.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n/// Sequence containing 0 elements\npublic enum CompletableTrait { }\n/// Represents a push style sequence containing 0 elements.\npublic typealias Completable = PrimitiveSequence<CompletableTrait, Swift.Never>\n\npublic enum CompletableEvent {\n    /// Sequence terminated with an error. (underlying observable sequence emits: `.error(Error)`)\n    case error(Swift.Error)\n    \n    /// Sequence completed successfully.\n    case completed\n}\n\npublic extension PrimitiveSequenceType where TraitType == CompletableTrait, ElementType == Swift.Never {\n    public typealias CompletableObserver = (CompletableEvent) -> ()\n    \n    /**\n     Creates an observable sequence from a specified subscribe method implementation.\n     \n     - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html)\n     \n     - parameter subscribe: Implementation of the resulting observable sequence's `subscribe` method.\n     - returns: The observable sequence with the specified implementation for the `subscribe` method.\n     */\n    public static func create(subscribe: @escaping (@escaping CompletableObserver) -> Disposable) -> PrimitiveSequence<TraitType, ElementType> {\n        let source = Observable<ElementType>.create { observer in\n            return subscribe { event in\n                switch event {\n                case .error(let error):\n                    observer.on(.error(error))\n                case .completed:\n                    observer.on(.completed)\n                }\n            }\n        }\n        \n        return PrimitiveSequence(raw: source)\n    }\n    \n    /**\n     Subscribes `observer` to receive events for this sequence.\n     \n     - returns: Subscription for `observer` that can be used to cancel production of sequence elements and free resources.\n     */\n    public func subscribe(_ observer: @escaping (CompletableEvent) -> ()) -> Disposable {\n        var stopped = false\n        return self.primitiveSequence.asObservable().subscribe { event in\n            if stopped { return }\n            stopped = true\n            \n            switch event {\n            case .next:\n                rxFatalError(\"Completables can't emit values\")\n            case .error(let error):\n                observer(.error(error))\n            case .completed:\n                observer(.completed)\n            }\n        }\n    }\n    \n    /**\n     Subscribes a completion handler and an error handler for this sequence.\n     \n     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.\n     - parameter onError: Action to invoke upon errored termination of the observable sequence.\n     - returns: Subscription object used to unsubscribe from the observable sequence.\n     */\n    public func subscribe(onCompleted: (() -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil) -> Disposable {\n        return self.primitiveSequence.subscribe { event in\n            switch event {\n            case .error(let error):\n                onError?(error)\n            case .completed:\n                onCompleted?()\n            }\n        }\n    }\n}\n\npublic extension PrimitiveSequenceType where TraitType == CompletableTrait, ElementType == Swift.Never {\n    /**\n     Returns an observable sequence that terminates with an `error`.\n\n     - seealso: [throw operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)\n\n     - returns: The observable sequence that terminates with specified error.\n     */\n    public static func error(_ error: Swift.Error) -> Completable {\n        return PrimitiveSequence(raw: Observable.error(error))\n    }\n\n    /**\n     Returns a non-terminating observable sequence, which can be used to denote an infinite duration.\n\n     - seealso: [never operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)\n\n     - returns: An observable sequence whose observers will never get called.\n     */\n    public static func never() -> Completable {\n        return PrimitiveSequence(raw: Observable.never())\n    }\n\n    /**\n     Returns an empty observable sequence, using the specified scheduler to send out the single `Completed` message.\n\n     - seealso: [empty operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)\n\n     - returns: An observable sequence with no elements.\n     */\n    public static func empty() -> Completable {\n        return Completable(raw: Observable.empty())\n    }\n\n}\n\npublic extension PrimitiveSequenceType where TraitType == CompletableTrait, ElementType == Swift.Never {    \n    /**\n     Invokes an action for each event in the observable sequence, and propagates all observer messages through the result sequence.\n     \n     - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html)\n     \n     - parameter onNext: Action to invoke for each element in the observable sequence.\n     - parameter onError: Action to invoke upon errored termination of the observable sequence.\n     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.\n     - parameter onSubscribe: Action to invoke before subscribing to source observable sequence.\n     - parameter onSubscribed: Action to invoke after subscribing to source observable sequence.\n     - parameter onDispose: Action to invoke after subscription to source observable has been disposed for any reason. It can be either because sequence terminates for some reason or observer subscription being disposed.\n     - returns: The source sequence with the side-effecting behavior applied.\n     */\n    public func `do`(onError: ((Swift.Error) throws -> Void)? = nil,\n                     onCompleted: (() throws -> Void)? = nil,\n                     onSubscribe: (() -> ())? = nil,\n                     onSubscribed: (() -> ())? = nil,\n                     onDispose: (() -> ())? = nil)\n        -> Completable {\n            return Completable(raw: primitiveSequence.source.do(\n                onError: onError,\n                onCompleted: onCompleted,\n                onSubscribe: onSubscribe,\n                onSubscribed: onSubscribed,\n                onDispose: onDispose)\n            )\n    }\n\n\n\n    /**\n     Concatenates the second observable sequence to `self` upon successful termination of `self`.\n     \n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n     \n     - parameter second: Second observable sequence.\n     - returns: An observable sequence that contains the elements of `self`, followed by those of the second sequence.\n     */\n    public func concat(_ second: Completable) -> Completable {\n        return Completable.concat(primitiveSequence, second)\n    }\n    \n    /**\n     Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully.\n     \n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n     \n     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.\n     */\n    public static func concat<S: Sequence>(_ sequence: S) -> Completable\n        where S.Iterator.Element == Completable {\n            let source = Observable.concat(sequence.lazy.map { $0.asObservable() })\n            return Completable(raw: source)\n    }\n    \n    /**\n     Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully.\n     \n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n     \n     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.\n     */\n    public static func concat<C: Collection>(_ collection: C) -> Completable\n        where C.Iterator.Element == Completable {\n            let source = Observable.concat(collection.map { $0.asObservable() })\n            return Completable(raw: source)\n    }\n    \n    /**\n     Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully.\n     \n     - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html)\n     \n     - returns: An observable sequence that contains the elements of each given sequence, in sequential order.\n     */\n    public static func concat(_ sources: Completable ...) -> Completable {\n        let source = Observable.concat(sources.map { $0.asObservable() })\n        return Completable(raw: source)\n    }\n    \n    /**\n     Merges elements from all observable sequences from collection into a single observable sequence.\n     \n     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)\n     \n     - parameter sources: Collection of observable sequences to merge.\n     - returns: The observable sequence that merges the elements of the observable sequences.\n     */\n    public static func merge<C: Collection>(_ sources: C) -> Completable\n        where C.Iterator.Element == Completable {\n            let source = Observable.merge(sources.map { $0.asObservable() })\n            return Completable(raw: source)\n    }\n    \n    /**\n     Merges elements from all observable sequences from array into a single observable sequence.\n     \n     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)\n     \n     - parameter sources: Array of observable sequences to merge.\n     - returns: The observable sequence that merges the elements of the observable sequences.\n     */\n    public static func merge(_ sources: [Completable]) -> Completable {\n        let source = Observable.merge(sources.map { $0.asObservable() })\n        return Completable(raw: source)\n    }\n    \n    /**\n     Merges elements from all observable sequences into a single observable sequence.\n     \n     - seealso: [merge operator on reactivex.io](http://reactivex.io/documentation/operators/merge.html)\n     \n     - parameter sources: Collection of observable sequences to merge.\n     - returns: The observable sequence that merges the elements of the observable sequences.\n     */\n    public static func merge(_ sources: Completable...) -> Completable {\n        let source = Observable.merge(sources.map { $0.asObservable() })\n        return Completable(raw: source)\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Traits/Maybe.swift",
    "content": "//\n//  Maybe.swift\n//  RxSwift\n//\n//  Created by sergdort on 19/08/2017.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n/// Sequence containing 0 or 1 elements\npublic enum MaybeTrait { }\n/// Represents a push style sequence containing 0 or 1 element.\npublic typealias Maybe<Element> = PrimitiveSequence<MaybeTrait, Element>\n\npublic enum MaybeEvent<Element> {\n    /// One and only sequence element is produced. (underlying observable sequence emits: `.next(Element)`, `.completed`)\n    case success(Element)\n    \n    /// Sequence terminated with an error. (underlying observable sequence emits: `.error(Error)`)\n    case error(Swift.Error)\n    \n    /// Sequence completed successfully.\n    case completed\n}\n\npublic extension PrimitiveSequenceType where TraitType == MaybeTrait {\n    public typealias MaybeObserver = (MaybeEvent<ElementType>) -> ()\n    \n    /**\n     Creates an observable sequence from a specified subscribe method implementation.\n     \n     - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html)\n     \n     - parameter subscribe: Implementation of the resulting observable sequence's `subscribe` method.\n     - returns: The observable sequence with the specified implementation for the `subscribe` method.\n     */\n    public static func create(subscribe: @escaping (@escaping MaybeObserver) -> Disposable) -> PrimitiveSequence<TraitType, ElementType> {\n        let source = Observable<ElementType>.create { observer in\n            return subscribe { event in\n                switch event {\n                case .success(let element):\n                    observer.on(.next(element))\n                    observer.on(.completed)\n                case .error(let error):\n                    observer.on(.error(error))\n                case .completed:\n                    observer.on(.completed)\n                }\n            }\n        }\n        \n        return PrimitiveSequence(raw: source)\n    }\n    \n    /**\n     Subscribes `observer` to receive events for this sequence.\n     \n     - returns: Subscription for `observer` that can be used to cancel production of sequence elements and free resources.\n     */\n    public func subscribe(_ observer: @escaping (MaybeEvent<ElementType>) -> ()) -> Disposable {\n        var stopped = false\n        return self.primitiveSequence.asObservable().subscribe { event in\n            if stopped { return }\n            stopped = true\n            \n            switch event {\n            case .next(let element):\n                observer(.success(element))\n            case .error(let error):\n                observer(.error(error))\n            case .completed:\n                observer(.completed)\n            }\n        }\n    }\n    \n    /**\n     Subscribes a success handler, an error handler, and a completion handler for this sequence.\n     \n     - parameter onSuccess: Action to invoke for each element in the observable sequence.\n     - parameter onError: Action to invoke upon errored termination of the observable sequence.\n     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.\n     - returns: Subscription object used to unsubscribe from the observable sequence.\n     */\n    public func subscribe(onSuccess: ((ElementType) -> Void)? = nil,\n                          onError: ((Swift.Error) -> Void)? = nil,\n                          onCompleted: (() -> Void)? = nil) -> Disposable {\n        return self.primitiveSequence.subscribe { event in\n            switch event {\n            case .success(let element):\n                onSuccess?(element)\n            case .error(let error):\n                onError?(error)\n            case .completed:\n                onCompleted?()\n            }\n        }\n    }\n}\n\npublic extension PrimitiveSequenceType where TraitType == MaybeTrait {    \n    /**\n     Returns an observable sequence that contains a single element.\n     \n     - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html)\n     \n     - parameter element: Single element in the resulting observable sequence.\n     - returns: An observable sequence containing the single specified element.\n     */\n    public static func just(_ element: ElementType) -> Maybe<ElementType> {\n        return Maybe(raw: Observable.just(element))\n    }\n    \n    /**\n     Returns an observable sequence that contains a single element.\n     \n     - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html)\n     \n     - parameter element: Single element in the resulting observable sequence.\n     - parameter: Scheduler to send the single element on.\n     - returns: An observable sequence containing the single specified element.\n     */\n    public static func just(_ element: ElementType, scheduler: ImmediateSchedulerType) -> Maybe<ElementType> {\n        return Maybe(raw: Observable.just(element, scheduler: scheduler))\n    }\n\n    /**\n     Returns an observable sequence that terminates with an `error`.\n\n     - seealso: [throw operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)\n\n     - returns: The observable sequence that terminates with specified error.\n     */\n    public static func error(_ error: Swift.Error) -> Maybe<ElementType> {\n        return PrimitiveSequence(raw: Observable.error(error))\n    }\n\n    /**\n     Returns a non-terminating observable sequence, which can be used to denote an infinite duration.\n\n     - seealso: [never operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)\n\n     - returns: An observable sequence whose observers will never get called.\n     */\n    public static func never() -> Maybe<ElementType> {\n        return PrimitiveSequence(raw: Observable.never())\n    }\n\n    /**\n     Returns an empty observable sequence, using the specified scheduler to send out the single `Completed` message.\n\n     - seealso: [empty operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)\n\n     - returns: An observable sequence with no elements.\n     */\n    public static func empty() -> Maybe<ElementType> {\n        return Maybe(raw: Observable.empty())\n    }\n}\n\npublic extension PrimitiveSequenceType where TraitType == MaybeTrait {\n    /**\n     Invokes an action for each event in the observable sequence, and propagates all observer messages through the result sequence.\n     \n     - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html)\n     \n     - parameter onNext: Action to invoke for each element in the observable sequence.\n     - parameter onError: Action to invoke upon errored termination of the observable sequence.\n     - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence.\n     - parameter onSubscribe: Action to invoke before subscribing to source observable sequence.\n     - parameter onSubscribed: Action to invoke after subscribing to source observable sequence.\n     - parameter onDispose: Action to invoke after subscription to source observable has been disposed for any reason. It can be either because sequence terminates for some reason or observer subscription being disposed.\n     - returns: The source sequence with the side-effecting behavior applied.\n     */\n    public func `do`(onNext: ((ElementType) throws -> Void)? = nil,\n                     onError: ((Swift.Error) throws -> Void)? = nil,\n                     onCompleted: (() throws -> Void)? = nil,\n                     onSubscribe: (() -> ())? = nil,\n                     onSubscribed: (() -> ())? = nil,\n                     onDispose: (() -> ())? = nil)\n        -> Maybe<ElementType> {\n            return Maybe(raw: primitiveSequence.source.do(\n                onNext: onNext,\n                onError: onError,\n                onCompleted: onCompleted,\n                onSubscribe: onSubscribe,\n                onSubscribed: onSubscribed,\n                onDispose: onDispose)\n            )\n    }\n    \n    /**\n     Filters the elements of an observable sequence based on a predicate.\n     \n     - seealso: [filter operator on reactivex.io](http://reactivex.io/documentation/operators/filter.html)\n     \n     - parameter predicate: A function to test each source element for a condition.\n     - returns: An observable sequence that contains elements from the input sequence that satisfy the condition.\n     */\n    public func filter(_ predicate: @escaping (ElementType) throws -> Bool)\n        -> Maybe<ElementType> {\n            return Maybe(raw: primitiveSequence.source.filter(predicate))\n    }\n    \n    /**\n     Projects each element of an observable sequence into a new form.\n     \n     - seealso: [map operator on reactivex.io](http://reactivex.io/documentation/operators/map.html)\n     \n     - parameter transform: A transform function to apply to each source element.\n     - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source.\n     \n     */\n    public func map<R>(_ transform: @escaping (ElementType) throws -> R)\n        -> Maybe<R> {\n            return Maybe(raw: primitiveSequence.source.map(transform))\n    }\n\n    /**\n     Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n\n     - seealso: [flatMap operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html)\n\n     - parameter selector: A transform function to apply to each element.\n     - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.\n     */\n    public func flatMap<R>(_ selector: @escaping (ElementType) throws -> Maybe<R>)\n        -> Maybe<R> {\n            return Maybe<R>(raw: primitiveSequence.source.flatMap(selector))\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Traits/ObservableType+PrimitiveSequence.swift",
    "content": "//\n//  ObservableType+PrimitiveSequence.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 9/17/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\nextension ObservableType {\n    /**\n     The `asSingle` operator throws a `RxError.noElements` or `RxError.moreThanOneElement`\n     if the source Observable does not emit exactly one element before successfully completing.\n\n     - seealso: [single operator on reactivex.io](http://reactivex.io/documentation/operators/first.html)\n\n     - returns: An observable sequence that emits a single element or throws an exception if more (or none) of them are emitted.\n     */\n    public func asSingle() -> Single<E> {\n        return PrimitiveSequence(raw: AsSingle(source: self.asObservable()))\n    }\n\n    /**\n     The `asMaybe` operator throws a ``RxError.moreThanOneElement`\n     if the source Observable does not emit at most one element before successfully completing.\n\n     - seealso: [single operator on reactivex.io](http://reactivex.io/documentation/operators/first.html)\n\n     - returns: An observable sequence that emits a single element, completes or throws an exception if more of them are emitted.\n     */\n    public func asMaybe() -> Maybe<E> {\n        return PrimitiveSequence(raw: AsMaybe(source: self.asObservable()))\n    }\n}\n\nextension ObservableType where E == Never {\n    /**\n     - returns: An observable sequence that completes.\n     */\n    public func asCompletable()\n        -> Completable {\n            return PrimitiveSequence(raw: self.asObservable())\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Traits/PrimitiveSequence+Zip+arity.swift",
    "content": "// This file is autogenerated. Take a look at `Preprocessor` target in RxSwift project \n//\n//  PrimitiveSequence+Zip+arity.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 5/23/15.\n//  Copyright © 2015 Krunoslav Zaher. All rights reserved.\n//\n\n\n\n// 2\n\nextension PrimitiveSequenceType where TraitType == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>, resultSelector: @escaping (E1, E2) throws -> ElementType)\n        -> PrimitiveSequence<TraitType, ElementType> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where ElementType == Any, TraitType == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>)\n        -> PrimitiveSequence<TraitType, (E1, E2)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable())\n            )\n    }\n}\n\nextension PrimitiveSequenceType where TraitType == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>, resultSelector: @escaping (E1, E2) throws -> ElementType)\n        -> PrimitiveSequence<TraitType, ElementType> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where ElementType == Any, TraitType == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>)\n        -> PrimitiveSequence<TraitType, (E1, E2)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable())\n            )\n    }\n}\n\n\n\n\n// 3\n\nextension PrimitiveSequenceType where TraitType == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>, _ source3: PrimitiveSequence<TraitType, E3>, resultSelector: @escaping (E1, E2, E3) throws -> ElementType)\n        -> PrimitiveSequence<TraitType, ElementType> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(), source3.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where ElementType == Any, TraitType == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>, _ source3: PrimitiveSequence<TraitType, E3>)\n        -> PrimitiveSequence<TraitType, (E1, E2, E3)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable(), source3.asObservable())\n            )\n    }\n}\n\nextension PrimitiveSequenceType where TraitType == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>, _ source3: PrimitiveSequence<TraitType, E3>, resultSelector: @escaping (E1, E2, E3) throws -> ElementType)\n        -> PrimitiveSequence<TraitType, ElementType> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(), source3.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where ElementType == Any, TraitType == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>, _ source3: PrimitiveSequence<TraitType, E3>)\n        -> PrimitiveSequence<TraitType, (E1, E2, E3)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable(), source3.asObservable())\n            )\n    }\n}\n\n\n\n\n// 4\n\nextension PrimitiveSequenceType where TraitType == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>, _ source3: PrimitiveSequence<TraitType, E3>, _ source4: PrimitiveSequence<TraitType, E4>, resultSelector: @escaping (E1, E2, E3, E4) throws -> ElementType)\n        -> PrimitiveSequence<TraitType, ElementType> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where ElementType == Any, TraitType == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>, _ source3: PrimitiveSequence<TraitType, E3>, _ source4: PrimitiveSequence<TraitType, E4>)\n        -> PrimitiveSequence<TraitType, (E1, E2, E3, E4)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable())\n            )\n    }\n}\n\nextension PrimitiveSequenceType where TraitType == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>, _ source3: PrimitiveSequence<TraitType, E3>, _ source4: PrimitiveSequence<TraitType, E4>, resultSelector: @escaping (E1, E2, E3, E4) throws -> ElementType)\n        -> PrimitiveSequence<TraitType, ElementType> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where ElementType == Any, TraitType == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>, _ source3: PrimitiveSequence<TraitType, E3>, _ source4: PrimitiveSequence<TraitType, E4>)\n        -> PrimitiveSequence<TraitType, (E1, E2, E3, E4)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable())\n            )\n    }\n}\n\n\n\n\n// 5\n\nextension PrimitiveSequenceType where TraitType == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>, _ source3: PrimitiveSequence<TraitType, E3>, _ source4: PrimitiveSequence<TraitType, E4>, _ source5: PrimitiveSequence<TraitType, E5>, resultSelector: @escaping (E1, E2, E3, E4, E5) throws -> ElementType)\n        -> PrimitiveSequence<TraitType, ElementType> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where ElementType == Any, TraitType == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>, _ source3: PrimitiveSequence<TraitType, E3>, _ source4: PrimitiveSequence<TraitType, E4>, _ source5: PrimitiveSequence<TraitType, E5>)\n        -> PrimitiveSequence<TraitType, (E1, E2, E3, E4, E5)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable())\n            )\n    }\n}\n\nextension PrimitiveSequenceType where TraitType == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>, _ source3: PrimitiveSequence<TraitType, E3>, _ source4: PrimitiveSequence<TraitType, E4>, _ source5: PrimitiveSequence<TraitType, E5>, resultSelector: @escaping (E1, E2, E3, E4, E5) throws -> ElementType)\n        -> PrimitiveSequence<TraitType, ElementType> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where ElementType == Any, TraitType == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>, _ source3: PrimitiveSequence<TraitType, E3>, _ source4: PrimitiveSequence<TraitType, E4>, _ source5: PrimitiveSequence<TraitType, E5>)\n        -> PrimitiveSequence<TraitType, (E1, E2, E3, E4, E5)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable())\n            )\n    }\n}\n\n\n\n\n// 6\n\nextension PrimitiveSequenceType where TraitType == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5, E6>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>, _ source3: PrimitiveSequence<TraitType, E3>, _ source4: PrimitiveSequence<TraitType, E4>, _ source5: PrimitiveSequence<TraitType, E5>, _ source6: PrimitiveSequence<TraitType, E6>, resultSelector: @escaping (E1, E2, E3, E4, E5, E6) throws -> ElementType)\n        -> PrimitiveSequence<TraitType, ElementType> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where ElementType == Any, TraitType == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5, E6>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>, _ source3: PrimitiveSequence<TraitType, E3>, _ source4: PrimitiveSequence<TraitType, E4>, _ source5: PrimitiveSequence<TraitType, E5>, _ source6: PrimitiveSequence<TraitType, E6>)\n        -> PrimitiveSequence<TraitType, (E1, E2, E3, E4, E5, E6)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable())\n            )\n    }\n}\n\nextension PrimitiveSequenceType where TraitType == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5, E6>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>, _ source3: PrimitiveSequence<TraitType, E3>, _ source4: PrimitiveSequence<TraitType, E4>, _ source5: PrimitiveSequence<TraitType, E5>, _ source6: PrimitiveSequence<TraitType, E6>, resultSelector: @escaping (E1, E2, E3, E4, E5, E6) throws -> ElementType)\n        -> PrimitiveSequence<TraitType, ElementType> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where ElementType == Any, TraitType == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5, E6>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>, _ source3: PrimitiveSequence<TraitType, E3>, _ source4: PrimitiveSequence<TraitType, E4>, _ source5: PrimitiveSequence<TraitType, E5>, _ source6: PrimitiveSequence<TraitType, E6>)\n        -> PrimitiveSequence<TraitType, (E1, E2, E3, E4, E5, E6)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable())\n            )\n    }\n}\n\n\n\n\n// 7\n\nextension PrimitiveSequenceType where TraitType == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5, E6, E7>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>, _ source3: PrimitiveSequence<TraitType, E3>, _ source4: PrimitiveSequence<TraitType, E4>, _ source5: PrimitiveSequence<TraitType, E5>, _ source6: PrimitiveSequence<TraitType, E6>, _ source7: PrimitiveSequence<TraitType, E7>, resultSelector: @escaping (E1, E2, E3, E4, E5, E6, E7) throws -> ElementType)\n        -> PrimitiveSequence<TraitType, ElementType> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(), source7.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where ElementType == Any, TraitType == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5, E6, E7>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>, _ source3: PrimitiveSequence<TraitType, E3>, _ source4: PrimitiveSequence<TraitType, E4>, _ source5: PrimitiveSequence<TraitType, E5>, _ source6: PrimitiveSequence<TraitType, E6>, _ source7: PrimitiveSequence<TraitType, E7>)\n        -> PrimitiveSequence<TraitType, (E1, E2, E3, E4, E5, E6, E7)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(), source7.asObservable())\n            )\n    }\n}\n\nextension PrimitiveSequenceType where TraitType == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5, E6, E7>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>, _ source3: PrimitiveSequence<TraitType, E3>, _ source4: PrimitiveSequence<TraitType, E4>, _ source5: PrimitiveSequence<TraitType, E5>, _ source6: PrimitiveSequence<TraitType, E6>, _ source7: PrimitiveSequence<TraitType, E7>, resultSelector: @escaping (E1, E2, E3, E4, E5, E6, E7) throws -> ElementType)\n        -> PrimitiveSequence<TraitType, ElementType> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(), source7.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where ElementType == Any, TraitType == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5, E6, E7>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>, _ source3: PrimitiveSequence<TraitType, E3>, _ source4: PrimitiveSequence<TraitType, E4>, _ source5: PrimitiveSequence<TraitType, E5>, _ source6: PrimitiveSequence<TraitType, E6>, _ source7: PrimitiveSequence<TraitType, E7>)\n        -> PrimitiveSequence<TraitType, (E1, E2, E3, E4, E5, E6, E7)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(), source7.asObservable())\n            )\n    }\n}\n\n\n\n\n// 8\n\nextension PrimitiveSequenceType where TraitType == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5, E6, E7, E8>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>, _ source3: PrimitiveSequence<TraitType, E3>, _ source4: PrimitiveSequence<TraitType, E4>, _ source5: PrimitiveSequence<TraitType, E5>, _ source6: PrimitiveSequence<TraitType, E6>, _ source7: PrimitiveSequence<TraitType, E7>, _ source8: PrimitiveSequence<TraitType, E8>, resultSelector: @escaping (E1, E2, E3, E4, E5, E6, E7, E8) throws -> ElementType)\n        -> PrimitiveSequence<TraitType, ElementType> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(), source7.asObservable(), source8.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where ElementType == Any, TraitType == SingleTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5, E6, E7, E8>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>, _ source3: PrimitiveSequence<TraitType, E3>, _ source4: PrimitiveSequence<TraitType, E4>, _ source5: PrimitiveSequence<TraitType, E5>, _ source6: PrimitiveSequence<TraitType, E6>, _ source7: PrimitiveSequence<TraitType, E7>, _ source8: PrimitiveSequence<TraitType, E8>)\n        -> PrimitiveSequence<TraitType, (E1, E2, E3, E4, E5, E6, E7, E8)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(), source7.asObservable(), source8.asObservable())\n            )\n    }\n}\n\nextension PrimitiveSequenceType where TraitType == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources.\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5, E6, E7, E8>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>, _ source3: PrimitiveSequence<TraitType, E3>, _ source4: PrimitiveSequence<TraitType, E4>, _ source5: PrimitiveSequence<TraitType, E5>, _ source6: PrimitiveSequence<TraitType, E6>, _ source7: PrimitiveSequence<TraitType, E7>, _ source8: PrimitiveSequence<TraitType, E8>, resultSelector: @escaping (E1, E2, E3, E4, E5, E6, E7, E8) throws -> ElementType)\n        -> PrimitiveSequence<TraitType, ElementType> {\n            return PrimitiveSequence(raw: Observable.zip(\n            source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(), source7.asObservable(), source8.asObservable(),\n                resultSelector: resultSelector)\n            )\n    }\n}\n\nextension PrimitiveSequenceType where ElementType == Any, TraitType == MaybeTrait {\n    /**\n    Merges the specified observable sequences into one observable sequence of tuples whenever all of the observable sequences have produced an element at a corresponding index.\n\n    - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html)\n\n    - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n    */\n    public static func zip<E1, E2, E3, E4, E5, E6, E7, E8>(_ source1: PrimitiveSequence<TraitType, E1>, _ source2: PrimitiveSequence<TraitType, E2>, _ source3: PrimitiveSequence<TraitType, E3>, _ source4: PrimitiveSequence<TraitType, E4>, _ source5: PrimitiveSequence<TraitType, E5>, _ source6: PrimitiveSequence<TraitType, E6>, _ source7: PrimitiveSequence<TraitType, E7>, _ source8: PrimitiveSequence<TraitType, E8>)\n        -> PrimitiveSequence<TraitType, (E1, E2, E3, E4, E5, E6, E7, E8)> {\n        return PrimitiveSequence(raw: Observable.zip(\n                source1.asObservable(), source2.asObservable(), source3.asObservable(), source4.asObservable(), source5.asObservable(), source6.asObservable(), source7.asObservable(), source8.asObservable())\n            )\n    }\n}\n\n\n\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Traits/PrimitiveSequence.swift",
    "content": "//\n//  PrimitiveSequence.swift\n//  RxSwift\n//\n//  Created by Krunoslav Zaher on 3/5/17.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n/// Observable sequences containing 0 or 1 element.\npublic struct PrimitiveSequence<Trait, Element> {\n    let source: Observable<Element>\n\n    init(raw: Observable<Element>) {\n        self.source = raw\n    }\n}\n\n/// Observable sequences containing 0 or 1 element\npublic protocol PrimitiveSequenceType {\n    /// Additional constraints\n    associatedtype TraitType\n    /// Sequence element type\n    associatedtype ElementType\n\n    // Converts `self` to primitive sequence.\n    ///\n    /// - returns: Observable sequence that represents `self`.\n    var primitiveSequence: PrimitiveSequence<TraitType, ElementType> { get }\n}\n\nextension PrimitiveSequence: PrimitiveSequenceType {\n    /// Additional constraints\n    public typealias TraitType = Trait\n    /// Sequence element type\n    public typealias ElementType = Element\n\n    // Converts `self` to primitive sequence.\n    ///\n    /// - returns: Observable sequence that represents `self`.\n    public var primitiveSequence: PrimitiveSequence<TraitType, ElementType> {\n        return self\n    }\n}\n\nextension PrimitiveSequence: ObservableConvertibleType {\n    /// Type of elements in sequence.\n    public typealias E = Element\n\n    /// Converts `self` to `Observable` sequence.\n    ///\n    /// - returns: Observable sequence that represents `self`.\n    public func asObservable() -> Observable<E> {\n        return source\n    }\n}\n\nextension PrimitiveSequence {\n    /**\n     Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n\n     - seealso: [defer operator on reactivex.io](http://reactivex.io/documentation/operators/defer.html)\n\n     - parameter observableFactory: Observable factory function to invoke for each observer that subscribes to the resulting sequence.\n     - returns: An observable sequence whose observers trigger an invocation of the given observable factory function.\n     */\n    public static func deferred(_ observableFactory: @escaping () throws -> PrimitiveSequence<Trait, Element>)\n        -> PrimitiveSequence<Trait, Element> {\n        return PrimitiveSequence(raw: Observable.deferred {\n            try observableFactory().asObservable()\n        })\n    }\n\n    /**\n     Returns an observable sequence by the source observable sequence shifted forward in time by a specified delay. Error events from the source observable sequence are not delayed.\n\n     - seealso: [delay operator on reactivex.io](http://reactivex.io/documentation/operators/delay.html)\n\n     - parameter dueTime: Relative time shift of the source by.\n     - parameter scheduler: Scheduler to run the subscription delay timer on.\n     - returns: the source Observable shifted in time by the specified delay.\n     */\n    public func delay(_ dueTime: RxTimeInterval, scheduler: SchedulerType)\n        -> PrimitiveSequence<Trait, Element> {\n        return PrimitiveSequence(raw: primitiveSequence.source.delay(dueTime, scheduler: scheduler))\n    }\n\n    /**\n     Time shifts the observable sequence by delaying the subscription with the specified relative time duration, using the specified scheduler to run timers.\n\n     - seealso: [delay operator on reactivex.io](http://reactivex.io/documentation/operators/delay.html)\n\n     - parameter dueTime: Relative time shift of the subscription.\n     - parameter scheduler: Scheduler to run the subscription delay timer on.\n     - returns: Time-shifted sequence.\n     */\n    public func delaySubscription(_ dueTime: RxTimeInterval, scheduler: SchedulerType)\n        -> PrimitiveSequence<Trait, Element> {\n        return PrimitiveSequence(raw: source.delaySubscription(dueTime, scheduler: scheduler))\n    }\n    \n    /**\n     Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n\n     This only invokes observer callbacks on a `scheduler`. In case the subscription and/or unsubscription\n     actions have side-effects that require to be run on a scheduler, use `subscribeOn`.\n\n     - seealso: [observeOn operator on reactivex.io](http://reactivex.io/documentation/operators/observeon.html)\n\n     - parameter scheduler: Scheduler to notify observers on.\n     - returns: The source sequence whose observations happen on the specified scheduler.\n     */\n    public func observeOn(_ scheduler: ImmediateSchedulerType)\n        -> PrimitiveSequence<Trait, Element> {\n        return PrimitiveSequence(raw: source.observeOn(scheduler))\n    }\n\n    /**\n    Wraps the source sequence in order to run its subscription and unsubscription logic on the specified \n    scheduler. \n    \n    This operation is not commonly used.\n    \n    This only performs the side-effects of subscription and unsubscription on the specified scheduler. \n    \n    In order to invoke observer callbacks on a `scheduler`, use `observeOn`.\n\n    - seealso: [subscribeOn operator on reactivex.io](http://reactivex.io/documentation/operators/subscribeon.html)\n    \n    - parameter scheduler: Scheduler to perform subscription and unsubscription actions on.\n    - returns: The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n    */\n    public func subscribeOn(_ scheduler: ImmediateSchedulerType)\n        -> PrimitiveSequence<Trait, Element> {\n        return PrimitiveSequence(raw: source.subscribeOn(scheduler))\n    }\n\n    /**\n     Continues an observable sequence that is terminated by an error with the observable sequence produced by the handler.\n\n     - seealso: [catch operator on reactivex.io](http://reactivex.io/documentation/operators/catch.html)\n\n     - parameter handler: Error handler function, producing another observable sequence.\n     - returns: An observable sequence containing the source sequence's elements, followed by the elements produced by the handler's resulting observable sequence in case an error occurred.\n     */\n    public func catchError(_ handler: @escaping (Swift.Error) throws -> PrimitiveSequence<Trait, Element>)\n        -> PrimitiveSequence<Trait, Element> {\n        return PrimitiveSequence(raw: source.catchError { try handler($0).asObservable() })\n    }\n\n    /**\n     Repeats the source observable sequence the specified number of times in case of an error or until it successfully terminates.\n\n     If you encounter an error and want it to retry once, then you must use `retry(2)`\n\n     - seealso: [retry operator on reactivex.io](http://reactivex.io/documentation/operators/retry.html)\n\n     - parameter maxAttemptCount: Maximum number of times to repeat the sequence.\n     - returns: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n     */\n    public func retry(_ maxAttemptCount: Int)\n        -> PrimitiveSequence<Trait, Element> {\n        return PrimitiveSequence(raw: source.retry(maxAttemptCount))\n    }\n\n    /**\n     Repeats the source observable sequence on error when the notifier emits a next value.\n     If the source observable errors and the notifier completes, it will complete the source sequence.\n\n     - seealso: [retry operator on reactivex.io](http://reactivex.io/documentation/operators/retry.html)\n\n     - parameter notificationHandler: A handler that is passed an observable sequence of errors raised by the source observable and returns and observable that either continues, completes or errors. This behavior is then applied to the source observable.\n     - returns: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully or is notified to error or complete.\n     */\n    public func retryWhen<TriggerObservable: ObservableType, Error: Swift.Error>(_ notificationHandler: @escaping (Observable<Error>) -> TriggerObservable)\n        -> PrimitiveSequence<Trait, Element> {\n        return PrimitiveSequence(raw: source.retryWhen(notificationHandler))\n    }\n\n    /**\n     Repeats the source observable sequence on error when the notifier emits a next value.\n     If the source observable errors and the notifier completes, it will complete the source sequence.\n\n     - seealso: [retry operator on reactivex.io](http://reactivex.io/documentation/operators/retry.html)\n\n     - parameter notificationHandler: A handler that is passed an observable sequence of errors raised by the source observable and returns and observable that either continues, completes or errors. This behavior is then applied to the source observable.\n     - returns: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully or is notified to error or complete.\n     */\n    public func retryWhen<TriggerObservable: ObservableType>(_ notificationHandler: @escaping (Observable<Swift.Error>) -> TriggerObservable)\n        -> PrimitiveSequence<Trait, Element> {\n        return PrimitiveSequence(raw: source.retryWhen(notificationHandler))\n    }\n\n    /**\n     Prints received events for all observers on standard output.\n\n     - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html)\n\n     - parameter identifier: Identifier that is printed together with event description to standard output.\n     - parameter trimOutput: Should output be trimmed to max 40 characters.\n     - returns: An observable sequence whose events are printed to standard output.\n     */\n    public func debug(_ identifier: String? = nil, trimOutput: Bool = false, file: String = #file, line: UInt = #line, function: String = #function)\n        -> PrimitiveSequence<Trait, Element> {\n            return PrimitiveSequence(raw: source.debug(identifier, trimOutput: trimOutput, file: file, line: line, function: function))\n    }\n    \n    /**\n     Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n     \n     - seealso: [using operator on reactivex.io](http://reactivex.io/documentation/operators/using.html)\n     \n     - parameter resourceFactory: Factory function to obtain a resource object.\n     - parameter primitiveSequenceFactory: Factory function to obtain an observable sequence that depends on the obtained resource.\n     - returns: An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n     */\n    public static func using<Resource: Disposable>(_ resourceFactory: @escaping () throws -> Resource, primitiveSequenceFactory: @escaping (Resource) throws -> PrimitiveSequence<Trait, Element>)\n        -> PrimitiveSequence<Trait, Element> {\n            return PrimitiveSequence(raw: Observable.using(resourceFactory, observableFactory: { (resource: Resource) throws -> Observable<E> in\n                return try primitiveSequenceFactory(resource).asObservable()\n            }))\n    }\n\n    /**\n     Applies a timeout policy for each element in the observable sequence. If the next element isn't received within the specified timeout duration starting from its predecessor, a TimeoutError is propagated to the observer.\n     \n     - seealso: [timeout operator on reactivex.io](http://reactivex.io/documentation/operators/timeout.html)\n     \n     - parameter dueTime: Maximum duration between values before a timeout occurs.\n     - parameter scheduler: Scheduler to run the timeout timer on.\n     - returns: An observable sequence with a `RxError.timeout` in case of a timeout.\n     */\n    public func timeout(_ dueTime: RxTimeInterval, scheduler: SchedulerType)\n        -> PrimitiveSequence<Trait, Element>  {\n            return PrimitiveSequence<Trait, Element>(raw: primitiveSequence.source.timeout(dueTime, scheduler: scheduler))\n    }\n    \n    /**\n     Applies a timeout policy for each element in the observable sequence, using the specified scheduler to run timeout timers. If the next element isn't received within the specified timeout duration starting from its predecessor, the other observable sequence is used to produce future messages from that point on.\n     \n     - seealso: [timeout operator on reactivex.io](http://reactivex.io/documentation/operators/timeout.html)\n     \n     - parameter dueTime: Maximum duration between values before a timeout occurs.\n     - parameter other: Sequence to return in case of a timeout.\n     - parameter scheduler: Scheduler to run the timeout timer on.\n     - returns: The source sequence switching to the other sequence in case of a timeout.\n     */\n    public func timeout(_ dueTime: RxTimeInterval,\n                        other: PrimitiveSequence<Trait, Element>,\n                        scheduler: SchedulerType) -> PrimitiveSequence<Trait, Element> {\n        return PrimitiveSequence<Trait, Element>(raw: primitiveSequence.source.timeout(dueTime, other: other.source, scheduler: scheduler))\n    }\n}\n\nextension PrimitiveSequenceType where ElementType: RxAbstractInteger\n{\n    /**\n     Returns an observable sequence that periodically produces a value after the specified initial relative due time has elapsed, using the specified scheduler to run timers.\n\n     - seealso: [timer operator on reactivex.io](http://reactivex.io/documentation/operators/timer.html)\n\n     - parameter dueTime: Relative time at which to produce the first value.\n     - parameter scheduler: Scheduler to run timers on.\n     - returns: An observable sequence that produces a value after due time has elapsed and then each period.\n     */\n    public static func timer(_ dueTime: RxTimeInterval, scheduler: SchedulerType)\n        -> PrimitiveSequence<TraitType, ElementType>  {\n        return PrimitiveSequence(raw: Observable<ElementType>.timer(dueTime, scheduler: scheduler))\n    }\n}\n"
  },
  {
    "path": "Pods/RxSwift/RxSwift/Traits/Single.swift",
    "content": "//\n//  Single.swift\n//  RxSwift\n//\n//  Created by sergdort on 19/08/2017.\n//  Copyright © 2017 Krunoslav Zaher. All rights reserved.\n//\n\n/// Sequence containing exactly 1 element\npublic enum SingleTrait { }\n/// Represents a push style sequence containing 1 element.\npublic typealias Single<Element> = PrimitiveSequence<SingleTrait, Element>\n\npublic enum SingleEvent<Element> {\n    /// One and only sequence element is produced. (underlying observable sequence emits: `.next(Element)`, `.completed`)\n    case success(Element)\n    \n    /// Sequence terminated with an error. (underlying observable sequence emits: `.error(Error)`)\n    case error(Swift.Error)\n}\n\nextension PrimitiveSequenceType where TraitType == SingleTrait {\n    public typealias SingleObserver = (SingleEvent<ElementType>) -> ()\n    \n    /**\n     Creates an observable sequence from a specified subscribe method implementation.\n     \n     - seealso: [create operator on reactivex.io](http://reactivex.io/documentation/operators/create.html)\n     \n     - parameter subscribe: Implementation of the resulting observable sequence's `subscribe` method.\n     - returns: The observable sequence with the specified implementation for the `subscribe` method.\n     */\n    public static func create(subscribe: @escaping (@escaping SingleObserver) -> Disposable) -> Single<ElementType> {\n        let source = Observable<ElementType>.create { observer in\n            return subscribe { event in\n                switch event {\n                case .success(let element):\n                    observer.on(.next(element))\n                    observer.on(.completed)\n                case .error(let error):\n                    observer.on(.error(error))\n                }\n            }\n        }\n        \n        return PrimitiveSequence(raw: source)\n    }\n    \n    \n    /**\n     Subscribes `observer` to receive events for this sequence.\n     \n     - returns: Subscription for `observer` that can be used to cancel production of sequence elements and free resources.\n     */\n    public func subscribe(_ observer: @escaping (SingleEvent<ElementType>) -> ()) -> Disposable {\n        var stopped = false\n        return self.primitiveSequence.asObservable().subscribe { event in\n            if stopped { return }\n            stopped = true\n            \n            switch event {\n            case .next(let element):\n                observer(.success(element))\n            case .error(let error):\n                observer(.error(error))\n            case .completed:\n                rxFatalErrorInDebug(\"Singles can't emit a completion event\")\n            }\n        }\n    }\n    \n    /**\n     Subscribes a success handler, and an error handler for this sequence.\n     \n     - parameter onSuccess: Action to invoke for each element in the observable sequence.\n     - parameter onError: Action to invoke upon errored termination of the observable sequence.\n     - returns: Subscription object used to unsubscribe from the observable sequence.\n     */\n    public func subscribe(onSuccess: ((ElementType) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil) -> Disposable {\n        return self.primitiveSequence.subscribe { event in\n            switch event {\n            case .success(let element):\n                onSuccess?(element)\n            case .error(let error):\n                onError?(error)\n            }\n        }\n    }\n}\n\nextension PrimitiveSequenceType where TraitType == SingleTrait {\n    /**\n     Returns an observable sequence that contains a single element.\n     \n     - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html)\n     \n     - parameter element: Single element in the resulting observable sequence.\n     - returns: An observable sequence containing the single specified element.\n     */\n    public static func just(_ element: ElementType) -> Single<ElementType> {\n        return Single(raw: Observable.just(element))\n    }\n    \n    /**\n     Returns an observable sequence that contains a single element.\n     \n     - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html)\n     \n     - parameter element: Single element in the resulting observable sequence.\n     - parameter: Scheduler to send the single element on.\n     - returns: An observable sequence containing the single specified element.\n     */\n    public static func just(_ element: ElementType, scheduler: ImmediateSchedulerType) -> Single<ElementType> {\n        return Single(raw: Observable.just(element, scheduler: scheduler))\n    }\n\n    /**\n     Returns an observable sequence that terminates with an `error`.\n\n     - seealso: [throw operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)\n\n     - returns: The observable sequence that terminates with specified error.\n     */\n    public static func error(_ error: Swift.Error) -> Single<ElementType> {\n        return PrimitiveSequence(raw: Observable.error(error))\n    }\n\n    /**\n     Returns a non-terminating observable sequence, which can be used to denote an infinite duration.\n\n     - seealso: [never operator on reactivex.io](http://reactivex.io/documentation/operators/empty-never-throw.html)\n\n     - returns: An observable sequence whose observers will never get called.\n     */\n    public static func never() -> Single<ElementType> {\n        return PrimitiveSequence(raw: Observable.never())\n    }\n}\n\nextension PrimitiveSequenceType where TraitType == SingleTrait {\n    /**\n     Invokes an action for each event in the observable sequence, and propagates all observer messages through the result sequence.\n     \n     - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html)\n     \n     - parameter onNext: Action to invoke for each element in the observable sequence.\n     - parameter onError: Action to invoke upon errored termination of the observable sequence.\n     - parameter onSubscribe: Action to invoke before subscribing to source observable sequence.\n     - parameter onSubscribed: Action to invoke after subscribing to source observable sequence.\n     - parameter onDispose: Action to invoke after subscription to source observable has been disposed for any reason. It can be either because sequence terminates for some reason or observer subscription being disposed.\n     - returns: The source sequence with the side-effecting behavior applied.\n     */\n    public func `do`(onNext: ((ElementType) throws -> Void)? = nil,\n                     onError: ((Swift.Error) throws -> Void)? = nil,\n                     onSubscribe: (() -> ())? = nil,\n                     onSubscribed: (() -> ())? = nil,\n                     onDispose: (() -> ())? = nil)\n        -> Single<ElementType> {\n            return Single(raw: primitiveSequence.source.do(\n                onNext: onNext,\n                onError: onError,\n                onSubscribe: onSubscribe,\n                onSubscribed: onSubscribed,\n                onDispose: onDispose)\n            )\n    }\n    \n    /**\n     Filters the elements of an observable sequence based on a predicate.\n     \n     - seealso: [filter operator on reactivex.io](http://reactivex.io/documentation/operators/filter.html)\n     \n     - parameter predicate: A function to test each source element for a condition.\n     - returns: An observable sequence that contains elements from the input sequence that satisfy the condition.\n     */\n    public func filter(_ predicate: @escaping (ElementType) throws -> Bool)\n        -> Maybe<ElementType> {\n            return Maybe(raw: primitiveSequence.source.filter(predicate))\n    }\n    \n    \n    /**\n     Projects each element of an observable sequence into a new form.\n     \n     - seealso: [map operator on reactivex.io](http://reactivex.io/documentation/operators/map.html)\n     \n     - parameter transform: A transform function to apply to each source element.\n     - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source.\n     \n     */\n    public func map<R>(_ transform: @escaping (ElementType) throws -> R)\n        -> Single<R> {\n            return Single(raw: primitiveSequence.source.map(transform))\n    }\n    \n    /**\n     Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n     \n     - seealso: [flatMap operator on reactivex.io](http://reactivex.io/documentation/operators/flatmap.html)\n     \n     - parameter selector: A transform function to apply to each element.\n     - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence.\n     */\n    public func flatMap<R>(_ selector: @escaping (ElementType) throws -> Single<R>)\n        -> Single<R> {\n            return Single<R>(raw: primitiveSequence.source.flatMap(selector))\n    }\n}\n"
  },
  {
    "path": "Pods/SnapKit/LICENSE",
    "content": "Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "Pods/SnapKit/README.md",
    "content": "<img src=\"http://snapkit.io/images/banner.jpg\" alt=\"\" />\n\nSnapKit is a DSL to make Auto Layout easy on both iOS and OS X.\n\n[![Build Status](https://travis-ci.org/SnapKit/SnapKit.svg)](https://travis-ci.org/SnapKit/SnapKit)\n[![Platform](https://img.shields.io/cocoapods/p/SnapKit.svg?style=flat)](https://github.com/SnapKit/SnapKit)\n[![Cocoapods Compatible](https://img.shields.io/cocoapods/v/SnapKit.svg)](https://cocoapods.org/pods/SnapKit)\n[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)\n\n#### ⚠️ **To use with Swift 3.x please ensure you are using >= 3.0.0** ⚠️ \n#### ⚠️ **To use with Swift 4.x please ensure you are using >= 4.0.0** ⚠️ \n\n## Contents\n\n- [Requirements](#requirements)\n- [Migration Guides](#migration-guides)\n- [Communication](#communication)\n- [Installation](#installation)\n- [Usage](#usage)\n- [Credits](#credits)\n- [License](#license)\n\n## Requirements\n\n- iOS 8.0+ / Mac OS X 10.11+ / tvOS 9.0+\n- Xcode 9.0+\n- Swift 3.0+\n\n## Communication\n\n- If you **need help**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/snapkit). (Tag 'snapkit')\n- If you'd like to **ask a general question**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/snapkit).\n- If you **found a bug**, open an issue.\n- If you **have a feature request**, open an issue.\n- If you **want to contribute**, submit a pull request.\n\n\n## Installation\n\n### CocoaPods\n\n[CocoaPods](http://cocoapods.org) is a dependency manager for Cocoa projects. You can install it with the following command:\n\n```bash\n$ gem install cocoapods\n```\n\n> CocoaPods 1.1.0+ is required to build SnapKit 4.0.0+.\n\nTo integrate SnapKit into your Xcode project using CocoaPods, specify it in your `Podfile`:\n\n```ruby\nsource 'https://github.com/CocoaPods/Specs.git'\nplatform :ios, '10.0'\nuse_frameworks!\n\ntarget '<Your Target Name>' do\n    pod 'SnapKit', '~> 4.0.0'\nend\n```\n\nThen, run the following command:\n\n```bash\n$ pod install\n```\n\n### Carthage\n\n[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks.\n\nYou can install Carthage with [Homebrew](http://brew.sh/) using the following command:\n\n```bash\n$ brew update\n$ brew install carthage\n```\n\nTo integrate SnapKit into your Xcode project using Carthage, specify it in your `Cartfile`:\n\n```ogdl\ngithub \"SnapKit/SnapKit\" ~> 4.0.0\n```\n\nRun `carthage update` to build the framework and drag the built `SnapKit.framework` into your Xcode project.\n\n### Manually\n\nIf you prefer not to use either of the aforementioned dependency managers, you can integrate SnapKit into your project manually.\n\n---\n\n## Usage\n\n### Quick Start\n\n```swift\nimport SnapKit\n\nclass MyViewController: UIViewController {\n\n    lazy var box = UIView()\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        self.view.addSubview(box)\n        box.snp.makeConstraints { (make) -> Void in\n           make.width.height.equalTo(50)\n           make.center.equalTo(self.view)\n        }\n    }\n\n}\n```\n\n### Resources\n\n- [Documentation](http://snapkit.io/docs/)\n- [F.A.Q.](http://snapkit.io/faq/)\n\n## Credits\n\n- Robert Payne ([@robertjpayne](https://twitter.com/robertjpayne))\n- Many other contributors\n\n## License\n\nSnapKit is released under the MIT license. See LICENSE for details.\n"
  },
  {
    "path": "Pods/SnapKit/Source/Constraint.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\npublic final class Constraint {\n\n    internal let sourceLocation: (String, UInt)\n    internal let label: String?\n\n    private let from: ConstraintItem\n    private let to: ConstraintItem\n    private let relation: ConstraintRelation\n    private let multiplier: ConstraintMultiplierTarget\n    private var constant: ConstraintConstantTarget {\n        didSet {\n            self.updateConstantAndPriorityIfNeeded()\n        }\n    }\n    private var priority: ConstraintPriorityTarget {\n        didSet {\n          self.updateConstantAndPriorityIfNeeded()\n        }\n    }\n    public var layoutConstraints: [LayoutConstraint]\n    \n    public var isActive: Bool {\n        for layoutConstraint in self.layoutConstraints {\n            if layoutConstraint.isActive {\n                return true\n            }\n        }\n        return false\n    }\n    \n    // MARK: Initialization\n\n    internal init(from: ConstraintItem,\n                  to: ConstraintItem,\n                  relation: ConstraintRelation,\n                  sourceLocation: (String, UInt),\n                  label: String?,\n                  multiplier: ConstraintMultiplierTarget,\n                  constant: ConstraintConstantTarget,\n                  priority: ConstraintPriorityTarget) {\n        self.from = from\n        self.to = to\n        self.relation = relation\n        self.sourceLocation = sourceLocation\n        self.label = label\n        self.multiplier = multiplier\n        self.constant = constant\n        self.priority = priority\n        self.layoutConstraints = []\n\n        // get attributes\n        let layoutFromAttributes = self.from.attributes.layoutAttributes\n        let layoutToAttributes = self.to.attributes.layoutAttributes\n\n        // get layout from\n        let layoutFrom = self.from.layoutConstraintItem!\n\n        // get relation\n        let layoutRelation = self.relation.layoutRelation\n\n        for layoutFromAttribute in layoutFromAttributes {\n            // get layout to attribute\n            let layoutToAttribute: LayoutAttribute\n            #if os(iOS) || os(tvOS)\n                if layoutToAttributes.count > 0 {\n                    if self.from.attributes == .edges && self.to.attributes == .margins {\n                        switch layoutFromAttribute {\n                        case .left:\n                            layoutToAttribute = .leftMargin\n                        case .right:\n                            layoutToAttribute = .rightMargin\n                        case .top:\n                            layoutToAttribute = .topMargin\n                        case .bottom:\n                            layoutToAttribute = .bottomMargin\n                        default:\n                            fatalError()\n                        }\n                    } else if self.from.attributes == .margins && self.to.attributes == .edges {\n                        switch layoutFromAttribute {\n                        case .leftMargin:\n                            layoutToAttribute = .left\n                        case .rightMargin:\n                            layoutToAttribute = .right\n                        case .topMargin:\n                            layoutToAttribute = .top\n                        case .bottomMargin:\n                            layoutToAttribute = .bottom\n                        default:\n                            fatalError()\n                        }\n                    } else if self.from.attributes == self.to.attributes {\n                        layoutToAttribute = layoutFromAttribute\n                    } else {\n                        layoutToAttribute = layoutToAttributes[0]\n                    }\n                } else {\n                    if self.to.target == nil && (layoutFromAttribute == .centerX || layoutFromAttribute == .centerY) {\n                        layoutToAttribute = layoutFromAttribute == .centerX ? .left : .top\n                    } else {\n                        layoutToAttribute = layoutFromAttribute\n                    }\n                }\n            #else\n                if self.from.attributes == self.to.attributes {\n                    layoutToAttribute = layoutFromAttribute\n                } else if layoutToAttributes.count > 0 {\n                    layoutToAttribute = layoutToAttributes[0]\n                } else {\n                    layoutToAttribute = layoutFromAttribute\n                }\n            #endif\n\n            // get layout constant\n            let layoutConstant: CGFloat = self.constant.constraintConstantTargetValueFor(layoutAttribute: layoutToAttribute)\n\n            // get layout to\n            var layoutTo: AnyObject? = self.to.target\n\n            // use superview if possible\n            if layoutTo == nil && layoutToAttribute != .width && layoutToAttribute != .height {\n                layoutTo = layoutFrom.superview\n            }\n\n            // create layout constraint\n            let layoutConstraint = LayoutConstraint(\n                item: layoutFrom,\n                attribute: layoutFromAttribute,\n                relatedBy: layoutRelation,\n                toItem: layoutTo,\n                attribute: layoutToAttribute,\n                multiplier: self.multiplier.constraintMultiplierTargetValue,\n                constant: layoutConstant\n            )\n\n            // set label\n            layoutConstraint.label = self.label\n\n            // set priority\n            layoutConstraint.priority = LayoutPriority(rawValue: self.priority.constraintPriorityTargetValue)\n\n            // set constraint\n            layoutConstraint.constraint = self\n\n            // append\n            self.layoutConstraints.append(layoutConstraint)\n        }\n    }\n\n    // MARK: Public\n\n    @available(*, deprecated:3.0, message:\"Use activate().\")\n    public func install() {\n        self.activate()\n    }\n\n    @available(*, deprecated:3.0, message:\"Use deactivate().\")\n    public func uninstall() {\n        self.deactivate()\n    }\n\n    public func activate() {\n        self.activateIfNeeded()\n    }\n\n    public func deactivate() {\n        self.deactivateIfNeeded()\n    }\n\n    @discardableResult\n    public func update(offset: ConstraintOffsetTarget) -> Constraint {\n        self.constant = offset.constraintOffsetTargetValue\n        return self\n    }\n\n    @discardableResult\n    public func update(inset: ConstraintInsetTarget) -> Constraint {\n        self.constant = inset.constraintInsetTargetValue\n        return self\n    }\n\n    @discardableResult\n    public func update(priority: ConstraintPriorityTarget) -> Constraint {\n        self.priority = priority.constraintPriorityTargetValue\n        return self\n    }\n\n    @available(*, deprecated:3.0, message:\"Use update(offset: ConstraintOffsetTarget) instead.\")\n    public func updateOffset(amount: ConstraintOffsetTarget) -> Void { self.update(offset: amount) }\n\n    @available(*, deprecated:3.0, message:\"Use update(inset: ConstraintInsetTarget) instead.\")\n    public func updateInsets(amount: ConstraintInsetTarget) -> Void { self.update(inset: amount) }\n\n    @available(*, deprecated:3.0, message:\"Use update(priority: ConstraintPriorityTarget) instead.\")\n    public func updatePriority(amount: ConstraintPriorityTarget) -> Void { self.update(priority: amount) }\n\n    @available(*, obsoleted:3.0, message:\"Use update(priority: ConstraintPriorityTarget) instead.\")\n    public func updatePriorityRequired() -> Void {}\n\n    @available(*, obsoleted:3.0, message:\"Use update(priority: ConstraintPriorityTarget) instead.\")\n    public func updatePriorityHigh() -> Void { fatalError(\"Must be implemented by Concrete subclass.\") }\n\n    @available(*, obsoleted:3.0, message:\"Use update(priority: ConstraintPriorityTarget) instead.\")\n    public func updatePriorityMedium() -> Void { fatalError(\"Must be implemented by Concrete subclass.\") }\n\n    @available(*, obsoleted:3.0, message:\"Use update(priority: ConstraintPriorityTarget) instead.\")\n    public func updatePriorityLow() -> Void { fatalError(\"Must be implemented by Concrete subclass.\") }\n\n    // MARK: Internal\n\n    internal func updateConstantAndPriorityIfNeeded() {\n        for layoutConstraint in self.layoutConstraints {\n            let attribute = (layoutConstraint.secondAttribute == .notAnAttribute) ? layoutConstraint.firstAttribute : layoutConstraint.secondAttribute\n            layoutConstraint.constant = self.constant.constraintConstantTargetValueFor(layoutAttribute: attribute)\n\n            let requiredPriority = ConstraintPriority.required.value\n            if (layoutConstraint.priority.rawValue < requiredPriority), (self.priority.constraintPriorityTargetValue != requiredPriority) {\n                layoutConstraint.priority = LayoutPriority(rawValue: self.priority.constraintPriorityTargetValue)\n            }\n        }\n    }\n\n    internal func activateIfNeeded(updatingExisting: Bool = false) {\n        guard let item = self.from.layoutConstraintItem else {\n            print(\"WARNING: SnapKit failed to get from item from constraint. Activate will be a no-op.\")\n            return\n        }\n        let layoutConstraints = self.layoutConstraints\n\n        if updatingExisting {\n            var existingLayoutConstraints: [LayoutConstraint] = []\n            for constraint in item.constraints {\n                existingLayoutConstraints += constraint.layoutConstraints\n            }\n\n            for layoutConstraint in layoutConstraints {\n                let existingLayoutConstraint = existingLayoutConstraints.first { $0 == layoutConstraint }\n                guard let updateLayoutConstraint = existingLayoutConstraint else {\n                    fatalError(\"Updated constraint could not find existing matching constraint to update: \\(layoutConstraint)\")\n                }\n\n                let updateLayoutAttribute = (updateLayoutConstraint.secondAttribute == .notAnAttribute) ? updateLayoutConstraint.firstAttribute : updateLayoutConstraint.secondAttribute\n                updateLayoutConstraint.constant = self.constant.constraintConstantTargetValueFor(layoutAttribute: updateLayoutAttribute)\n            }\n        } else {\n            NSLayoutConstraint.activate(layoutConstraints)\n            item.add(constraints: [self])\n        }\n    }\n\n    internal func deactivateIfNeeded() {\n        guard let item = self.from.layoutConstraintItem else {\n            print(\"WARNING: SnapKit failed to get from item from constraint. Deactivate will be a no-op.\")\n            return\n        }\n        let layoutConstraints = self.layoutConstraints\n        NSLayoutConstraint.deactivate(layoutConstraints)\n        item.remove(constraints: [self])\n    }\n}\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintAttributes.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\n\ninternal struct ConstraintAttributes : OptionSet {\n    \n    internal init(rawValue: UInt) {\n        self.rawValue = rawValue\n    }\n    internal init(_ rawValue: UInt) {\n        self.init(rawValue: rawValue)\n    }\n    internal init(nilLiteral: ()) {\n        self.rawValue = 0\n    }\n    \n    internal private(set) var rawValue: UInt\n    internal static var allZeros: ConstraintAttributes { return self.init(0) }\n    internal static func convertFromNilLiteral() -> ConstraintAttributes { return self.init(0) }\n    internal var boolValue: Bool { return self.rawValue != 0 }\n    \n    internal func toRaw() -> UInt { return self.rawValue }\n    internal static func fromRaw(_ raw: UInt) -> ConstraintAttributes? { return self.init(raw) }\n    internal static func fromMask(_ raw: UInt) -> ConstraintAttributes { return self.init(raw) }\n    \n    // normal\n    \n    internal static var none: ConstraintAttributes { return self.init(0) }\n    internal static var left: ConstraintAttributes { return self.init(1) }\n    internal static var top: ConstraintAttributes {  return self.init(2) }\n    internal static var right: ConstraintAttributes { return self.init(4) }\n    internal static var bottom: ConstraintAttributes { return self.init(8) }\n    internal static var leading: ConstraintAttributes { return self.init(16) }\n    internal static var trailing: ConstraintAttributes { return self.init(32) }\n    internal static var width: ConstraintAttributes { return self.init(64) }\n    internal static var height: ConstraintAttributes { return self.init(128) }\n    internal static var centerX: ConstraintAttributes { return self.init(256) }\n    internal static var centerY: ConstraintAttributes { return self.init(512) }\n    internal static var lastBaseline: ConstraintAttributes { return self.init(1024) }\n    \n    @available(iOS 8.0, OSX 10.11, *)\n    internal static var firstBaseline: ConstraintAttributes { return self.init(2048) }\n    \n    @available(iOS 8.0, *)\n    internal static var leftMargin: ConstraintAttributes { return self.init(4096) }\n    \n    @available(iOS 8.0, *)\n    internal static var rightMargin: ConstraintAttributes { return self.init(8192) }\n    \n    @available(iOS 8.0, *)\n    internal static var topMargin: ConstraintAttributes { return self.init(16384) }\n    \n    @available(iOS 8.0, *)\n    internal static var bottomMargin: ConstraintAttributes { return self.init(32768) }\n    \n    @available(iOS 8.0, *)\n    internal static var leadingMargin: ConstraintAttributes { return self.init(65536) }\n    \n    @available(iOS 8.0, *)\n    internal static var trailingMargin: ConstraintAttributes { return self.init(131072) }\n    \n    @available(iOS 8.0, *)\n    internal static var centerXWithinMargins: ConstraintAttributes { return self.init(262144) }\n    \n    @available(iOS 8.0, *)\n    internal static var centerYWithinMargins: ConstraintAttributes { return self.init(524288) }\n    \n    // aggregates\n    \n    internal static var edges: ConstraintAttributes { return self.init(15) }\n    internal static var size: ConstraintAttributes { return self.init(192) }\n    internal static var center: ConstraintAttributes { return self.init(768) }\n    \n    @available(iOS 8.0, *)\n    internal static var margins: ConstraintAttributes { return self.init(61440) }\n    \n    @available(iOS 8.0, *)\n    internal static var centerWithinMargins: ConstraintAttributes { return self.init(786432) }\n    \n    internal var layoutAttributes:[LayoutAttribute] {\n        var attrs = [LayoutAttribute]()\n        if (self.contains(ConstraintAttributes.left)) {\n            attrs.append(.left)\n        }\n        if (self.contains(ConstraintAttributes.top)) {\n            attrs.append(.top)\n        }\n        if (self.contains(ConstraintAttributes.right)) {\n            attrs.append(.right)\n        }\n        if (self.contains(ConstraintAttributes.bottom)) {\n            attrs.append(.bottom)\n        }\n        if (self.contains(ConstraintAttributes.leading)) {\n            attrs.append(.leading)\n        }\n        if (self.contains(ConstraintAttributes.trailing)) {\n            attrs.append(.trailing)\n        }\n        if (self.contains(ConstraintAttributes.width)) {\n            attrs.append(.width)\n        }\n        if (self.contains(ConstraintAttributes.height)) {\n            attrs.append(.height)\n        }\n        if (self.contains(ConstraintAttributes.centerX)) {\n            attrs.append(.centerX)\n        }\n        if (self.contains(ConstraintAttributes.centerY)) {\n            attrs.append(.centerY)\n        }\n        if (self.contains(ConstraintAttributes.lastBaseline)) {\n            attrs.append(.lastBaseline)\n        }\n        \n        #if os(iOS) || os(tvOS)\n            if (self.contains(ConstraintAttributes.firstBaseline)) {\n                attrs.append(.firstBaseline)\n            }\n            if (self.contains(ConstraintAttributes.leftMargin)) {\n                attrs.append(.leftMargin)\n            }\n            if (self.contains(ConstraintAttributes.rightMargin)) {\n                attrs.append(.rightMargin)\n            }\n            if (self.contains(ConstraintAttributes.topMargin)) {\n                attrs.append(.topMargin)\n            }\n            if (self.contains(ConstraintAttributes.bottomMargin)) {\n                attrs.append(.bottomMargin)\n            }\n            if (self.contains(ConstraintAttributes.leadingMargin)) {\n                attrs.append(.leadingMargin)\n            }\n            if (self.contains(ConstraintAttributes.trailingMargin)) {\n                attrs.append(.trailingMargin)\n            }\n            if (self.contains(ConstraintAttributes.centerXWithinMargins)) {\n                attrs.append(.centerXWithinMargins)\n            }\n            if (self.contains(ConstraintAttributes.centerYWithinMargins)) {\n                attrs.append(.centerYWithinMargins)\n            }\n        #endif\n        \n        return attrs\n    }\n}\n\ninternal func + (left: ConstraintAttributes, right: ConstraintAttributes) -> ConstraintAttributes {\n    return left.union(right)\n}\n\ninternal func +=(left: inout ConstraintAttributes, right: ConstraintAttributes) {\n    left.formUnion(right)\n}\n\ninternal func -=(left: inout ConstraintAttributes, right: ConstraintAttributes) {\n    left.subtract(right)\n}\n\ninternal func ==(left: ConstraintAttributes, right: ConstraintAttributes) -> Bool {\n    return left.rawValue == right.rawValue\n}\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintConfig.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n    public typealias ConstraintInterfaceLayoutDirection = UIUserInterfaceLayoutDirection\n#else\n    import AppKit\n    public typealias ConstraintInterfaceLayoutDirection = NSUserInterfaceLayoutDirection\n#endif\n\n\npublic struct ConstraintConfig {\n    \n    public static var interfaceLayoutDirection: ConstraintInterfaceLayoutDirection = .leftToRight\n    \n}\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintConstantTarget.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\n\npublic protocol ConstraintConstantTarget {\n}\n\nextension CGPoint: ConstraintConstantTarget {\n}\n\nextension CGSize: ConstraintConstantTarget {    \n}\n\nextension ConstraintInsets: ConstraintConstantTarget {\n}\n\nextension ConstraintConstantTarget {\n    \n    internal func constraintConstantTargetValueFor(layoutAttribute: LayoutAttribute) -> CGFloat {\n        if let value = self as? CGFloat {\n            return value\n        }\n        \n        if let value = self as? Float {\n            return CGFloat(value)\n        }\n        \n        if let value = self as? Double {\n            return CGFloat(value)\n        }\n        \n        if let value = self as? Int {\n            return CGFloat(value)\n        }\n        \n        if let value = self as? UInt {\n            return CGFloat(value)\n        }\n        \n        if let value = self as? CGSize {\n            if layoutAttribute == .width {\n                return value.width\n            } else if layoutAttribute == .height {\n                return value.height\n            } else {\n                return 0.0\n            }\n        }\n        \n        if let value = self as? CGPoint {\n            #if os(iOS) || os(tvOS)\n                switch layoutAttribute {\n                case .left, .right, .leading, .trailing, .centerX, .leftMargin, .rightMargin, .leadingMargin, .trailingMargin, .centerXWithinMargins:\n                    return value.x\n                case .top, .bottom, .centerY, .topMargin, .bottomMargin, .centerYWithinMargins, .lastBaseline, .firstBaseline:\n                    return value.y\n                case .width, .height, .notAnAttribute:\n                    return 0.0\n                }\n            #else\n                switch layoutAttribute {\n                case .left, .right, .leading, .trailing, .centerX:\n                    return value.x\n                case .top, .bottom, .centerY, .lastBaseline, .firstBaseline:\n                    return value.y\n                case .width, .height, .notAnAttribute:\n                    return 0.0\n                }\n            #endif\n        }\n        \n        if let value = self as? ConstraintInsets {\n            #if os(iOS) || os(tvOS)\n                switch layoutAttribute {\n                case .left, .leftMargin, .centerX, .centerXWithinMargins:\n                    return value.left\n                case .top, .topMargin, .centerY, .centerYWithinMargins, .lastBaseline, .firstBaseline:\n                    return value.top\n                case .right, .rightMargin:\n                    return -value.right\n                case .bottom, .bottomMargin:\n                    return -value.bottom\n                case .leading, .leadingMargin:\n                    return (ConstraintConfig.interfaceLayoutDirection == .leftToRight) ? value.left : value.right\n                case .trailing, .trailingMargin:\n                    return (ConstraintConfig.interfaceLayoutDirection == .leftToRight) ? -value.right : -value.left\n                case .width:\n                    return -(value.left + value.right)\n                case .height:\n                    return -(value.top + value.bottom)\n                case .notAnAttribute:\n                    return 0.0\n                }\n            #else\n                switch layoutAttribute {\n                case .left, .centerX:\n                    return value.left\n                case .top, .centerY, .lastBaseline, .firstBaseline:\n                    return value.top\n                case .right:\n                    return -value.right\n                case .bottom:\n                    return -value.bottom\n                case .leading:\n                    return (ConstraintConfig.interfaceLayoutDirection == .leftToRight) ? value.left : value.right\n                case .trailing:\n                    return (ConstraintConfig.interfaceLayoutDirection == .leftToRight) ? -value.right : -value.left\n                case .width:\n                    return -(value.left + value.right)\n                case .height:\n                    return -(value.top + value.bottom)\n                case .notAnAttribute:\n                    return 0.0\n                }\n            #endif\n        }\n        \n        return 0.0\n    }\n    \n}\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintDSL.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\n\npublic protocol ConstraintDSL {\n    \n    var target: AnyObject? { get }\n    \n    func setLabel(_ value: String?)\n    func label() -> String?\n    \n}\nextension ConstraintDSL {\n    \n    public func setLabel(_ value: String?) {\n        objc_setAssociatedObject(self.target as Any, &labelKey, value, .OBJC_ASSOCIATION_COPY_NONATOMIC)\n    }\n    public func label() -> String? {\n        return objc_getAssociatedObject(self.target as Any, &labelKey) as? String\n    }\n    \n}\nprivate var labelKey: UInt8 = 0\n\n\npublic protocol ConstraintBasicAttributesDSL : ConstraintDSL {\n}\nextension ConstraintBasicAttributesDSL {\n    \n    // MARK: Basics\n    \n    public var left: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.left)\n    }\n    \n    public var top: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.top)\n    }\n    \n    public var right: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.right)\n    }\n    \n    public var bottom: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.bottom)\n    }\n    \n    public var leading: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.leading)\n    }\n    \n    public var trailing: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.trailing)\n    }\n    \n    public var width: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.width)\n    }\n    \n    public var height: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.height)\n    }\n    \n    public var centerX: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.centerX)\n    }\n    \n    public var centerY: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.centerY)\n    }\n    \n    public var edges: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.edges)\n    }\n    \n    public var size: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.size)\n    }\n    \n    public var center: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.center)\n    }\n    \n}\n\npublic protocol ConstraintAttributesDSL : ConstraintBasicAttributesDSL {\n}\nextension ConstraintAttributesDSL {\n    \n    // MARK: Baselines\n    \n    @available(*, deprecated:3.0, message:\"Use .lastBaseline instead\")\n    public var baseline: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.lastBaseline)\n    }\n    \n    @available(iOS 8.0, OSX 10.11, *)\n    public var lastBaseline: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.lastBaseline)\n    }\n    \n    @available(iOS 8.0, OSX 10.11, *)\n    public var firstBaseline: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.firstBaseline)\n    }\n    \n    // MARK: Margins\n    \n    @available(iOS 8.0, *)\n    public var leftMargin: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.leftMargin)\n    }\n    \n    @available(iOS 8.0, *)\n    public var topMargin: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.topMargin)\n    }\n    \n    @available(iOS 8.0, *)\n    public var rightMargin: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.rightMargin)\n    }\n    \n    @available(iOS 8.0, *)\n    public var bottomMargin: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.bottomMargin)\n    }\n    \n    @available(iOS 8.0, *)\n    public var leadingMargin: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.leadingMargin)\n    }\n    \n    @available(iOS 8.0, *)\n    public var trailingMargin: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.trailingMargin)\n    }\n    \n    @available(iOS 8.0, *)\n    public var centerXWithinMargins: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.centerXWithinMargins)\n    }\n    \n    @available(iOS 8.0, *)\n    public var centerYWithinMargins: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.centerYWithinMargins)\n    }\n    \n    @available(iOS 8.0, *)\n    public var margins: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.margins)\n    }\n    \n    @available(iOS 8.0, *)\n    public var centerWithinMargins: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.centerWithinMargins)\n    }\n    \n}\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintDescription.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\n\npublic class ConstraintDescription {\n    \n    internal let item: LayoutConstraintItem\n    internal var attributes: ConstraintAttributes\n    internal var relation: ConstraintRelation? = nil\n    internal var sourceLocation: (String, UInt)? = nil\n    internal var label: String? = nil\n    internal var related: ConstraintItem? = nil\n    internal var multiplier: ConstraintMultiplierTarget = 1.0\n    internal var constant: ConstraintConstantTarget = 0.0\n    internal var priority: ConstraintPriorityTarget = 1000.0\n    internal lazy var constraint: Constraint? = {\n        guard let relation = self.relation,\n              let related = self.related,\n              let sourceLocation = self.sourceLocation else {\n            return nil\n        }\n        let from = ConstraintItem(target: self.item, attributes: self.attributes)\n        \n        return Constraint(\n            from: from,\n            to: related,\n            relation: relation,\n            sourceLocation: sourceLocation,\n            label: self.label,\n            multiplier: self.multiplier,\n            constant: self.constant,\n            priority: self.priority\n        )\n    }()\n    \n    // MARK: Initialization\n    \n    internal init(item: LayoutConstraintItem, attributes: ConstraintAttributes) {\n        self.item = item\n        self.attributes = attributes\n    }\n    \n}\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintInsetTarget.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\n\npublic protocol ConstraintInsetTarget: ConstraintConstantTarget {\n}\n\nextension Int: ConstraintInsetTarget {\n}\n\nextension UInt: ConstraintInsetTarget {\n}\n\nextension Float: ConstraintInsetTarget {\n}\n\nextension Double: ConstraintInsetTarget {\n}\n\nextension CGFloat: ConstraintInsetTarget {\n}\n\nextension ConstraintInsets: ConstraintInsetTarget {\n}\n\nextension ConstraintInsetTarget {\n\n    internal var constraintInsetTargetValue: ConstraintInsets {\n        if let amount = self as? ConstraintInsets {\n            return amount\n        } else if let amount = self as? Float {\n            return ConstraintInsets(top: CGFloat(amount), left: CGFloat(amount), bottom: CGFloat(amount), right: CGFloat(amount))\n        } else if let amount = self as? Double {\n            return ConstraintInsets(top: CGFloat(amount), left: CGFloat(amount), bottom: CGFloat(amount), right: CGFloat(amount))\n        } else if let amount = self as? CGFloat {\n            return ConstraintInsets(top: amount, left: amount, bottom: amount, right: amount)\n        } else if let amount = self as? Int {\n            return ConstraintInsets(top: CGFloat(amount), left: CGFloat(amount), bottom: CGFloat(amount), right: CGFloat(amount))\n        } else if let amount = self as? UInt {\n            return ConstraintInsets(top: CGFloat(amount), left: CGFloat(amount), bottom: CGFloat(amount), right: CGFloat(amount))\n        } else {\n            return ConstraintInsets(top: 0, left: 0, bottom: 0, right: 0)\n        }\n    }\n    \n}\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintInsets.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\n\n#if os(iOS) || os(tvOS)\n    public typealias ConstraintInsets = UIEdgeInsets\n#else\n    public typealias ConstraintInsets = NSEdgeInsets\n#endif\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintItem.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\n\npublic final class ConstraintItem {\n    \n    internal weak var target: AnyObject?\n    internal let attributes: ConstraintAttributes\n    \n    internal init(target: AnyObject?, attributes: ConstraintAttributes) {\n        self.target = target\n        self.attributes = attributes\n    }\n    \n    internal var layoutConstraintItem: LayoutConstraintItem? {\n        return self.target as? LayoutConstraintItem\n    }\n    \n}\n\npublic func ==(lhs: ConstraintItem, rhs: ConstraintItem) -> Bool {\n    // pointer equality\n    guard lhs !== rhs else {\n        return true\n    }\n    \n    // must both have valid targets and identical attributes\n    guard let target1 = lhs.target,\n          let target2 = rhs.target,\n          target1 === target2 && lhs.attributes == rhs.attributes else {\n            return false\n    }\n    \n    return true\n}\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintLayoutGuide+Extensions.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#endif\n    \n    \n@available(iOS 9.0, OSX 10.11, *)\npublic extension ConstraintLayoutGuide {\n    \n    public var snp: ConstraintLayoutGuideDSL {\n        return ConstraintLayoutGuideDSL(guide: self)\n    }\n    \n}\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintLayoutGuide.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\n\n#if os(iOS) || os(tvOS)\n    @available(iOS 9.0, *)\n    public typealias ConstraintLayoutGuide = UILayoutGuide\n#else\n    @available(OSX 10.11, *)\n    public typealias ConstraintLayoutGuide = NSLayoutGuide\n#endif\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintLayoutGuideDSL.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\n\n@available(iOS 9.0, OSX 10.11, *)\npublic struct ConstraintLayoutGuideDSL: ConstraintAttributesDSL {\n    \n    @discardableResult\n    public func prepareConstraints(_ closure: (_ make: ConstraintMaker) -> Void) -> [Constraint] {\n        return ConstraintMaker.prepareConstraints(item: self.guide, closure: closure)\n    }\n    \n    public func makeConstraints(_ closure: (_ make: ConstraintMaker) -> Void) {\n        ConstraintMaker.makeConstraints(item: self.guide, closure: closure)\n    }\n    \n    public func remakeConstraints(_ closure: (_ make: ConstraintMaker) -> Void) {\n        ConstraintMaker.remakeConstraints(item: self.guide, closure: closure)\n    }\n    \n    public func updateConstraints(_ closure: (_ make: ConstraintMaker) -> Void) {\n        ConstraintMaker.updateConstraints(item: self.guide, closure: closure)\n    }\n    \n    public func removeConstraints() {\n        ConstraintMaker.removeConstraints(item: self.guide)\n    }\n    \n    public var target: AnyObject? {\n        return self.guide\n    }\n    \n    internal let guide: ConstraintLayoutGuide\n    \n    internal init(guide: ConstraintLayoutGuide) {\n        self.guide = guide\n        \n    }\n    \n}\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintLayoutSupport.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\n\n#if os(iOS) || os(tvOS)\n    @available(iOS 8.0, *)\n    public typealias ConstraintLayoutSupport = UILayoutSupport\n#else\n    public class ConstraintLayoutSupport {}\n#endif\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintLayoutSupportDSL.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\n\n@available(iOS 8.0, *)\npublic struct ConstraintLayoutSupportDSL: ConstraintDSL {\n    \n    public var target: AnyObject? {\n        return self.support\n    }\n    \n    internal let support: ConstraintLayoutSupport\n    \n    internal init(support: ConstraintLayoutSupport) {\n        self.support = support\n        \n    }\n    \n    public var top: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.top)\n    }\n    \n    public var bottom: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.bottom)\n    }\n    \n    public var height: ConstraintItem {\n        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.height)\n    }\n}\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintMaker.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\npublic class ConstraintMaker {\n    \n    public var left: ConstraintMakerExtendable {\n        return self.makeExtendableWithAttributes(.left)\n    }\n    \n    public var top: ConstraintMakerExtendable {\n        return self.makeExtendableWithAttributes(.top)\n    }\n    \n    public var bottom: ConstraintMakerExtendable {\n        return self.makeExtendableWithAttributes(.bottom)\n    }\n    \n    public var right: ConstraintMakerExtendable {\n        return self.makeExtendableWithAttributes(.right)\n    }\n    \n    public var leading: ConstraintMakerExtendable {\n        return self.makeExtendableWithAttributes(.leading)\n    }\n    \n    public var trailing: ConstraintMakerExtendable {\n        return self.makeExtendableWithAttributes(.trailing)\n    }\n    \n    public var width: ConstraintMakerExtendable {\n        return self.makeExtendableWithAttributes(.width)\n    }\n    \n    public var height: ConstraintMakerExtendable {\n        return self.makeExtendableWithAttributes(.height)\n    }\n    \n    public var centerX: ConstraintMakerExtendable {\n        return self.makeExtendableWithAttributes(.centerX)\n    }\n    \n    public var centerY: ConstraintMakerExtendable {\n        return self.makeExtendableWithAttributes(.centerY)\n    }\n    \n    @available(*, deprecated:3.0, message:\"Use lastBaseline instead\")\n    public var baseline: ConstraintMakerExtendable {\n        return self.makeExtendableWithAttributes(.lastBaseline)\n    }\n    \n    public var lastBaseline: ConstraintMakerExtendable {\n        return self.makeExtendableWithAttributes(.lastBaseline)\n    }\n    \n    @available(iOS 8.0, OSX 10.11, *)\n    public var firstBaseline: ConstraintMakerExtendable {\n        return self.makeExtendableWithAttributes(.firstBaseline)\n    }\n    \n    @available(iOS 8.0, *)\n    public var leftMargin: ConstraintMakerExtendable {\n        return self.makeExtendableWithAttributes(.leftMargin)\n    }\n    \n    @available(iOS 8.0, *)\n    public var rightMargin: ConstraintMakerExtendable {\n        return self.makeExtendableWithAttributes(.rightMargin)\n    }\n    \n    @available(iOS 8.0, *)\n    public var topMargin: ConstraintMakerExtendable {\n        return self.makeExtendableWithAttributes(.topMargin)\n    }\n    \n    @available(iOS 8.0, *)\n    public var bottomMargin: ConstraintMakerExtendable {\n        return self.makeExtendableWithAttributes(.bottomMargin)\n    }\n    \n    @available(iOS 8.0, *)\n    public var leadingMargin: ConstraintMakerExtendable {\n        return self.makeExtendableWithAttributes(.leadingMargin)\n    }\n    \n    @available(iOS 8.0, *)\n    public var trailingMargin: ConstraintMakerExtendable {\n        return self.makeExtendableWithAttributes(.trailingMargin)\n    }\n    \n    @available(iOS 8.0, *)\n    public var centerXWithinMargins: ConstraintMakerExtendable {\n        return self.makeExtendableWithAttributes(.centerXWithinMargins)\n    }\n    \n    @available(iOS 8.0, *)\n    public var centerYWithinMargins: ConstraintMakerExtendable {\n        return self.makeExtendableWithAttributes(.centerYWithinMargins)\n    }\n    \n    public var edges: ConstraintMakerExtendable {\n        return self.makeExtendableWithAttributes(.edges)\n    }\n    public var size: ConstraintMakerExtendable {\n        return self.makeExtendableWithAttributes(.size)\n    }\n    public var center: ConstraintMakerExtendable {\n        return self.makeExtendableWithAttributes(.center)\n    }\n    \n    @available(iOS 8.0, *)\n    public var margins: ConstraintMakerExtendable {\n        return self.makeExtendableWithAttributes(.margins)\n    }\n    \n    @available(iOS 8.0, *)\n    public var centerWithinMargins: ConstraintMakerExtendable {\n        return self.makeExtendableWithAttributes(.centerWithinMargins)\n    }\n    \n    private let item: LayoutConstraintItem\n    private var descriptions = [ConstraintDescription]()\n    \n    internal init(item: LayoutConstraintItem) {\n        self.item = item\n        self.item.prepare()\n    }\n    \n    internal func makeExtendableWithAttributes(_ attributes: ConstraintAttributes) -> ConstraintMakerExtendable {\n        let description = ConstraintDescription(item: self.item, attributes: attributes)\n        self.descriptions.append(description)\n        return ConstraintMakerExtendable(description)\n    }\n    \n    internal static func prepareConstraints(item: LayoutConstraintItem, closure: (_ make: ConstraintMaker) -> Void) -> [Constraint] {\n        let maker = ConstraintMaker(item: item)\n        closure(maker)\n        var constraints: [Constraint] = []\n        for description in maker.descriptions {\n            guard let constraint = description.constraint else {\n                continue\n            }\n            constraints.append(constraint)\n        }\n        return constraints\n    }\n    \n    internal static func makeConstraints(item: LayoutConstraintItem, closure: (_ make: ConstraintMaker) -> Void) {\n        let maker = ConstraintMaker(item: item)\n        closure(maker)\n        var constraints: [Constraint] = []\n        for description in maker.descriptions {\n            guard let constraint = description.constraint else {\n                continue\n            }\n            constraints.append(constraint)\n        }\n        for constraint in constraints {\n            constraint.activateIfNeeded(updatingExisting: false)\n        }\n    }\n    \n    internal static func remakeConstraints(item: LayoutConstraintItem, closure: (_ make: ConstraintMaker) -> Void) {\n        self.removeConstraints(item: item)\n        self.makeConstraints(item: item, closure: closure)\n    }\n    \n    internal static func updateConstraints(item: LayoutConstraintItem, closure: (_ make: ConstraintMaker) -> Void) {\n        guard item.constraints.count > 0 else {\n            self.makeConstraints(item: item, closure: closure)\n            return\n        }\n        \n        let maker = ConstraintMaker(item: item)\n        closure(maker)\n        var constraints: [Constraint] = []\n        for description in maker.descriptions {\n            guard let constraint = description.constraint else {\n                continue\n            }\n            constraints.append(constraint)\n        }\n        for constraint in constraints {\n            constraint.activateIfNeeded(updatingExisting: true)\n        }\n    }\n    \n    internal static func removeConstraints(item: LayoutConstraintItem) {\n        let constraints = item.constraints\n        for constraint in constraints {\n            constraint.deactivateIfNeeded()\n        }\n    }\n    \n}\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintMakerEditable.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\n\npublic class ConstraintMakerEditable: ConstraintMakerPriortizable {\n\n    @discardableResult\n    public func multipliedBy(_ amount: ConstraintMultiplierTarget) -> ConstraintMakerEditable {\n        self.description.multiplier = amount\n        return self\n    }\n    \n    @discardableResult\n    public func dividedBy(_ amount: ConstraintMultiplierTarget) -> ConstraintMakerEditable {\n        return self.multipliedBy(1.0 / amount.constraintMultiplierTargetValue)\n    }\n    \n    @discardableResult\n    public func offset(_ amount: ConstraintOffsetTarget) -> ConstraintMakerEditable {\n        self.description.constant = amount.constraintOffsetTargetValue\n        return self\n    }\n    \n    @discardableResult\n    public func inset(_ amount: ConstraintInsetTarget) -> ConstraintMakerEditable {\n        self.description.constant = amount.constraintInsetTargetValue\n        return self\n    }\n    \n}\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintMakerExtendable.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\n\npublic class ConstraintMakerExtendable: ConstraintMakerRelatable {\n    \n    public var left: ConstraintMakerExtendable {\n        self.description.attributes += .left\n        return self\n    }\n    \n    public var top: ConstraintMakerExtendable {\n        self.description.attributes += .top\n        return self\n    }\n    \n    public var bottom: ConstraintMakerExtendable {\n        self.description.attributes += .bottom\n        return self\n    }\n    \n    public var right: ConstraintMakerExtendable {\n        self.description.attributes += .right\n        return self\n    }\n    \n    public var leading: ConstraintMakerExtendable {\n        self.description.attributes += .leading\n        return self\n    }\n    \n    public var trailing: ConstraintMakerExtendable {\n        self.description.attributes += .trailing\n        return self\n    }\n    \n    public var width: ConstraintMakerExtendable {\n        self.description.attributes += .width\n        return self\n    }\n    \n    public var height: ConstraintMakerExtendable {\n        self.description.attributes += .height\n        return self\n    }\n    \n    public var centerX: ConstraintMakerExtendable {\n        self.description.attributes += .centerX\n        return self\n    }\n    \n    public var centerY: ConstraintMakerExtendable {\n        self.description.attributes += .centerY\n        return self\n    }\n    \n    @available(*, deprecated:3.0, message:\"Use lastBaseline instead\")\n    public var baseline: ConstraintMakerExtendable {\n        self.description.attributes += .lastBaseline\n        return self\n    }\n    \n    public var lastBaseline: ConstraintMakerExtendable {\n        self.description.attributes += .lastBaseline\n        return self\n    }\n    \n    @available(iOS 8.0, OSX 10.11, *)\n    public var firstBaseline: ConstraintMakerExtendable {\n        self.description.attributes += .firstBaseline\n        return self\n    }\n    \n    @available(iOS 8.0, *)\n    public var leftMargin: ConstraintMakerExtendable {\n        self.description.attributes += .leftMargin\n        return self\n    }\n    \n    @available(iOS 8.0, *)\n    public var rightMargin: ConstraintMakerExtendable {\n        self.description.attributes += .rightMargin\n        return self\n    }\n    \n    @available(iOS 8.0, *)\n    public var topMargin: ConstraintMakerExtendable {\n        self.description.attributes += .topMargin\n        return self\n    }\n    \n    @available(iOS 8.0, *)\n    public var bottomMargin: ConstraintMakerExtendable {\n        self.description.attributes += .bottomMargin\n        return self\n    }\n    \n    @available(iOS 8.0, *)\n    public var leadingMargin: ConstraintMakerExtendable {\n        self.description.attributes += .leadingMargin\n        return self\n    }\n    \n    @available(iOS 8.0, *)\n    public var trailingMargin: ConstraintMakerExtendable {\n        self.description.attributes += .trailingMargin\n        return self\n    }\n    \n    @available(iOS 8.0, *)\n    public var centerXWithinMargins: ConstraintMakerExtendable {\n        self.description.attributes += .centerXWithinMargins\n        return self\n    }\n    \n    @available(iOS 8.0, *)\n    public var centerYWithinMargins: ConstraintMakerExtendable {\n        self.description.attributes += .centerYWithinMargins\n        return self\n    }\n    \n    public var edges: ConstraintMakerExtendable {\n        self.description.attributes += .edges\n        return self\n    }\n    public var size: ConstraintMakerExtendable {\n        self.description.attributes += .size\n        return self\n    }\n    \n    @available(iOS 8.0, *)\n    public var margins: ConstraintMakerExtendable {\n        self.description.attributes += .margins\n        return self\n    }\n    \n    @available(iOS 8.0, *)\n    public var centerWithinMargins: ConstraintMakerExtendable {\n        self.description.attributes += .centerWithinMargins\n        return self\n    }\n    \n}\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintMakerFinalizable.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\n\npublic class ConstraintMakerFinalizable {\n    \n    internal let description: ConstraintDescription\n    \n    internal init(_ description: ConstraintDescription) {\n        self.description = description\n    }\n    \n    @discardableResult\n    public func labeled(_ label: String) -> ConstraintMakerFinalizable {\n        self.description.label = label\n        return self\n    }\n    \n    public var constraint: Constraint {\n        return self.description.constraint!\n    }\n    \n}\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintMakerPriortizable.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\n\npublic class ConstraintMakerPriortizable: ConstraintMakerFinalizable {\n    \n    @discardableResult\n    public func priority(_ amount: ConstraintPriority) -> ConstraintMakerFinalizable {\n        self.description.priority = amount.value\n        return self\n    }\n    \n    @discardableResult\n    public func priority(_ amount: ConstraintPriorityTarget) -> ConstraintMakerFinalizable {\n        self.description.priority = amount\n        return self\n    }\n    \n    @available(*, deprecated:3.0, message:\"Use priority(.required) instead.\")\n    @discardableResult\n    public func priorityRequired() -> ConstraintMakerFinalizable {\n        return self.priority(.required)\n    }\n    \n    @available(*, deprecated:3.0, message:\"Use priority(.high) instead.\")\n    @discardableResult\n    public func priorityHigh() -> ConstraintMakerFinalizable {\n        return self.priority(.high)\n    }\n    \n    @available(*, deprecated:3.0, message:\"Use priority(.medium) instead.\")\n    @discardableResult\n    public func priorityMedium() -> ConstraintMakerFinalizable {\n        return self.priority(.medium)\n    }\n    \n    @available(*, deprecated:3.0, message:\"Use priority(.low) instead.\")\n    @discardableResult\n    public func priorityLow() -> ConstraintMakerFinalizable {\n        return self.priority(.low)\n    }\n}\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintMakerRelatable.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\n\npublic class ConstraintMakerRelatable {\n    \n    internal let description: ConstraintDescription\n    \n    internal init(_ description: ConstraintDescription) {\n        self.description = description\n    }\n    \n    internal func relatedTo(_ other: ConstraintRelatableTarget, relation: ConstraintRelation, file: String, line: UInt) -> ConstraintMakerEditable {\n        let related: ConstraintItem\n        let constant: ConstraintConstantTarget\n        \n        if let other = other as? ConstraintItem {\n            guard other.attributes == ConstraintAttributes.none ||\n                  other.attributes.layoutAttributes.count <= 1 ||\n                  other.attributes.layoutAttributes == self.description.attributes.layoutAttributes ||\n                  other.attributes == .edges && self.description.attributes == .margins ||\n                  other.attributes == .margins && self.description.attributes == .edges else {\n                fatalError(\"Cannot constraint to multiple non identical attributes. (\\(file), \\(line))\");\n            }\n            \n            related = other\n            constant = 0.0\n        } else if let other = other as? ConstraintView {\n            related = ConstraintItem(target: other, attributes: ConstraintAttributes.none)\n            constant = 0.0\n        } else if let other = other as? ConstraintConstantTarget {\n            related = ConstraintItem(target: nil, attributes: ConstraintAttributes.none)\n            constant = other\n        } else if #available(iOS 9.0, OSX 10.11, *), let other = other as? ConstraintLayoutGuide {\n            related = ConstraintItem(target: other, attributes: ConstraintAttributes.none)\n            constant = 0.0\n        } else {\n            fatalError(\"Invalid constraint. (\\(file), \\(line))\")\n        }\n        \n        let editable = ConstraintMakerEditable(self.description)\n        editable.description.sourceLocation = (file, line)\n        editable.description.relation = relation\n        editable.description.related = related\n        editable.description.constant = constant\n        return editable\n    }\n    \n    @discardableResult\n    public func equalTo(_ other: ConstraintRelatableTarget, _ file: String = #file, _ line: UInt = #line) -> ConstraintMakerEditable {\n        return self.relatedTo(other, relation: .equal, file: file, line: line)\n    }\n    \n    @discardableResult\n    public func equalToSuperview(_ file: String = #file, _ line: UInt = #line) -> ConstraintMakerEditable {\n        guard let other = self.description.item.superview else {\n            fatalError(\"Expected superview but found nil when attempting make constraint `equalToSuperview`.\")\n        }\n        return self.relatedTo(other, relation: .equal, file: file, line: line)\n    }\n    \n    @discardableResult\n    public func lessThanOrEqualTo(_ other: ConstraintRelatableTarget, _ file: String = #file, _ line: UInt = #line) -> ConstraintMakerEditable {\n        return self.relatedTo(other, relation: .lessThanOrEqual, file: file, line: line)\n    }\n    \n    @discardableResult\n    public func lessThanOrEqualToSuperview(_ file: String = #file, _ line: UInt = #line) -> ConstraintMakerEditable {\n        guard let other = self.description.item.superview else {\n            fatalError(\"Expected superview but found nil when attempting make constraint `lessThanOrEqualToSuperview`.\")\n        }\n        return self.relatedTo(other, relation: .lessThanOrEqual, file: file, line: line)\n    }\n    \n    @discardableResult\n    public func greaterThanOrEqualTo(_ other: ConstraintRelatableTarget, _ file: String = #file, line: UInt = #line) -> ConstraintMakerEditable {\n        return self.relatedTo(other, relation: .greaterThanOrEqual, file: file, line: line)\n    }\n    \n    @discardableResult\n    public func greaterThanOrEqualToSuperview(_ file: String = #file, line: UInt = #line) -> ConstraintMakerEditable {\n        guard let other = self.description.item.superview else {\n            fatalError(\"Expected superview but found nil when attempting make constraint `greaterThanOrEqualToSuperview`.\")\n        }\n        return self.relatedTo(other, relation: .greaterThanOrEqual, file: file, line: line)\n    }\n}\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintMultiplierTarget.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\n\npublic protocol ConstraintMultiplierTarget {\n    \n    var constraintMultiplierTargetValue: CGFloat { get }\n    \n}\n\nextension Int: ConstraintMultiplierTarget {\n    \n    public var constraintMultiplierTargetValue: CGFloat {\n        return CGFloat(self)\n    }\n    \n}\n\nextension UInt: ConstraintMultiplierTarget {\n    \n    public var constraintMultiplierTargetValue: CGFloat {\n        return CGFloat(self)\n    }\n    \n}\n\nextension Float: ConstraintMultiplierTarget {\n    \n    public var constraintMultiplierTargetValue: CGFloat {\n        return CGFloat(self)\n    }\n    \n}\n\nextension Double: ConstraintMultiplierTarget {\n    \n    public var constraintMultiplierTargetValue: CGFloat {\n        return CGFloat(self)\n    }\n    \n}\n\nextension CGFloat: ConstraintMultiplierTarget {\n    \n    public var constraintMultiplierTargetValue: CGFloat {\n        return self\n    }\n    \n}\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintOffsetTarget.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\n\npublic protocol ConstraintOffsetTarget: ConstraintConstantTarget {\n}\n\nextension Int: ConstraintOffsetTarget {\n}\n\nextension UInt: ConstraintOffsetTarget {\n}\n\nextension Float: ConstraintOffsetTarget {\n}\n\nextension Double: ConstraintOffsetTarget {\n}\n\nextension CGFloat: ConstraintOffsetTarget {\n}\n\nextension ConstraintOffsetTarget {\n    \n    internal var constraintOffsetTargetValue: CGFloat {\n        let offset: CGFloat\n        if let amount = self as? Float {\n            offset = CGFloat(amount)\n        } else if let amount = self as? Double {\n            offset = CGFloat(amount)\n        } else if let amount = self as? CGFloat {\n            offset = CGFloat(amount)\n        } else if let amount = self as? Int {\n            offset = CGFloat(amount)\n        } else if let amount = self as? UInt {\n            offset = CGFloat(amount)\n        } else {\n            offset = 0.0\n        }\n        return offset\n    }\n    \n}\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintPriority.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\npublic struct ConstraintPriority : ExpressibleByFloatLiteral, Equatable, Strideable {\n    public typealias FloatLiteralType = Float\n    \n    public let value: Float\n    \n    public init(floatLiteral value: Float) {\n        self.value = value\n    }\n    \n    public init(_ value: Float) {\n        self.value = value\n    }\n    \n    public static var required: ConstraintPriority {\n        return 1000.0\n    }\n    \n    public static var high: ConstraintPriority {\n        return 750.0\n    }\n    \n    public static var medium: ConstraintPriority {\n        #if os(OSX)\n            return 501.0\n        #else\n            return 500.0\n        #endif\n        \n    }\n    \n    public static var low: ConstraintPriority {\n        return 250.0\n    }\n    \n    public static func ==(lhs: ConstraintPriority, rhs: ConstraintPriority) -> Bool {\n        return lhs.value == rhs.value\n    }\n\n    // MARK: Strideable\n\n    public func advanced(by n: FloatLiteralType) -> ConstraintPriority {\n        return ConstraintPriority(floatLiteral: value + n)\n    }\n\n    public func distance(to other: ConstraintPriority) -> FloatLiteralType {\n        return other.value - value\n    }\n}\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintPriorityTarget.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\n\npublic protocol ConstraintPriorityTarget {\n    \n    var constraintPriorityTargetValue: Float { get }\n    \n}\n\nextension Int: ConstraintPriorityTarget {\n    \n    public var constraintPriorityTargetValue: Float {\n        return Float(self)\n    }\n    \n}\n\nextension UInt: ConstraintPriorityTarget {\n    \n    public var constraintPriorityTargetValue: Float {\n        return Float(self)\n    }\n    \n}\n\nextension Float: ConstraintPriorityTarget {\n    \n    public var constraintPriorityTargetValue: Float {\n        return self\n    }\n    \n}\n\nextension Double: ConstraintPriorityTarget {\n    \n    public var constraintPriorityTargetValue: Float {\n        return Float(self)\n    }\n    \n}\n\nextension CGFloat: ConstraintPriorityTarget {\n    \n    public var constraintPriorityTargetValue: Float {\n        return Float(self)\n    }\n    \n}\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintRelatableTarget.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\n\npublic protocol ConstraintRelatableTarget {\n}\n\nextension Int: ConstraintRelatableTarget {\n}\n\nextension UInt: ConstraintRelatableTarget {\n}\n\nextension Float: ConstraintRelatableTarget {\n}\n\nextension Double: ConstraintRelatableTarget {\n}\n\nextension CGFloat: ConstraintRelatableTarget {\n}\n\nextension CGSize: ConstraintRelatableTarget {\n}\n\nextension CGPoint: ConstraintRelatableTarget {\n}\n\nextension ConstraintInsets: ConstraintRelatableTarget {\n}\n\nextension ConstraintItem: ConstraintRelatableTarget {\n}\n\nextension ConstraintView: ConstraintRelatableTarget {\n}\n\n@available(iOS 9.0, OSX 10.11, *)\nextension ConstraintLayoutGuide: ConstraintRelatableTarget {\n}\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintRelation.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\n\ninternal enum ConstraintRelation : Int {\n    case equal = 1\n    case lessThanOrEqual\n    case greaterThanOrEqual\n    \n    internal var layoutRelation: LayoutRelation {\n        get {\n            switch(self) {\n            case .equal:\n                return .equal\n            case .lessThanOrEqual:\n                return .lessThanOrEqual\n            case .greaterThanOrEqual:\n                return .greaterThanOrEqual\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintView+Extensions.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\n\npublic extension ConstraintView {\n    \n    @available(*, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    public var snp_left: ConstraintItem { return self.snp.left }\n    \n    @available(*, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    public var snp_top: ConstraintItem { return self.snp.top }\n    \n    @available(*, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    public var snp_right: ConstraintItem { return self.snp.right }\n    \n    @available(*, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    public var snp_bottom: ConstraintItem { return self.snp.bottom }\n    \n    @available(*, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    public var snp_leading: ConstraintItem { return self.snp.leading }\n    \n    @available(*, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    public var snp_trailing: ConstraintItem { return self.snp.trailing }\n    \n    @available(*, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    public var snp_width: ConstraintItem { return self.snp.width }\n    \n    @available(*, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    public var snp_height: ConstraintItem { return self.snp.height }\n    \n    @available(*, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    public var snp_centerX: ConstraintItem { return self.snp.centerX }\n    \n    @available(*, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    public var snp_centerY: ConstraintItem { return self.snp.centerY }\n    \n    @available(*, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    public var snp_baseline: ConstraintItem { return self.snp.baseline }\n    \n    @available(*, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    @available(iOS 8.0, OSX 10.11, *)\n    public var snp_lastBaseline: ConstraintItem { return self.snp.lastBaseline }\n    \n    @available(iOS, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    @available(iOS 8.0, OSX 10.11, *)\n    public var snp_firstBaseline: ConstraintItem { return self.snp.firstBaseline }\n    \n    @available(iOS, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    @available(iOS 8.0, *)\n    public var snp_leftMargin: ConstraintItem { return self.snp.leftMargin }\n    \n    @available(iOS, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    @available(iOS 8.0, *)\n    public var snp_topMargin: ConstraintItem { return self.snp.topMargin }\n    \n    @available(iOS, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    @available(iOS 8.0, *)\n    public var snp_rightMargin: ConstraintItem { return self.snp.rightMargin }\n    \n    @available(iOS, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    @available(iOS 8.0, *)\n    public var snp_bottomMargin: ConstraintItem { return self.snp.bottomMargin }\n    \n    @available(iOS, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    @available(iOS 8.0, *)\n    public var snp_leadingMargin: ConstraintItem { return self.snp.leadingMargin }\n    \n    @available(iOS, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    @available(iOS 8.0, *)\n    public var snp_trailingMargin: ConstraintItem { return self.snp.trailingMargin }\n    \n    @available(iOS, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    @available(iOS 8.0, *)\n    public var snp_centerXWithinMargins: ConstraintItem { return self.snp.centerXWithinMargins }\n    \n    @available(iOS, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    @available(iOS 8.0, *)\n    public var snp_centerYWithinMargins: ConstraintItem { return self.snp.centerYWithinMargins }\n    \n    @available(*, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    public var snp_edges: ConstraintItem { return self.snp.edges }\n    \n    @available(*, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    public var snp_size: ConstraintItem { return self.snp.size }\n    \n    @available(*, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    public var snp_center: ConstraintItem { return self.snp.center }\n    \n    @available(iOS, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    @available(iOS 8.0, *)\n    public var snp_margins: ConstraintItem { return self.snp.margins }\n    \n    @available(iOS, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    @available(iOS 8.0, *)\n    public var snp_centerWithinMargins: ConstraintItem { return self.snp.centerWithinMargins }\n    \n    @available(*, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    public func snp_prepareConstraints(_ closure: (_ make: ConstraintMaker) -> Void) -> [Constraint] {\n        return self.snp.prepareConstraints(closure)\n    }\n    \n    @available(*, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    public func snp_makeConstraints(_ closure: (_ make: ConstraintMaker) -> Void) {\n        self.snp.makeConstraints(closure)\n    }\n    \n    @available(*, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    public func snp_remakeConstraints(_ closure: (_ make: ConstraintMaker) -> Void) {\n        self.snp.remakeConstraints(closure)\n    }\n    \n    @available(*, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    public func snp_updateConstraints(_ closure: (_ make: ConstraintMaker) -> Void) {\n        self.snp.updateConstraints(closure)\n    }\n    \n    @available(*, deprecated:3.0, message:\"Use newer snp.* syntax.\")\n    public func snp_removeConstraints() {\n        self.snp.removeConstraints()\n    }\n    \n    public var snp: ConstraintViewDSL {\n        return ConstraintViewDSL(view: self)\n    }\n    \n}\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintView.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\n\n#if os(iOS) || os(tvOS)\n    public typealias ConstraintView = UIView\n#else\n    public typealias ConstraintView = NSView\n#endif\n"
  },
  {
    "path": "Pods/SnapKit/Source/ConstraintViewDSL.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\n\npublic struct ConstraintViewDSL: ConstraintAttributesDSL {\n    \n    @discardableResult\n    public func prepareConstraints(_ closure: (_ make: ConstraintMaker) -> Void) -> [Constraint] {\n        return ConstraintMaker.prepareConstraints(item: self.view, closure: closure)\n    }\n    \n    public func makeConstraints(_ closure: (_ make: ConstraintMaker) -> Void) {\n        ConstraintMaker.makeConstraints(item: self.view, closure: closure)\n    }\n    \n    public func remakeConstraints(_ closure: (_ make: ConstraintMaker) -> Void) {\n        ConstraintMaker.remakeConstraints(item: self.view, closure: closure)\n    }\n    \n    public func updateConstraints(_ closure: (_ make: ConstraintMaker) -> Void) {\n        ConstraintMaker.updateConstraints(item: self.view, closure: closure)\n    }\n    \n    public func removeConstraints() {\n        ConstraintMaker.removeConstraints(item: self.view)\n    }\n    \n    public var contentHuggingHorizontalPriority: Float {\n        get {\n            return self.view.contentHuggingPriority(for: .horizontal).rawValue\n        }\n        set {\n            self.view.setContentHuggingPriority(LayoutPriority(rawValue: newValue), for: .horizontal)\n        }\n    }\n    \n    public var contentHuggingVerticalPriority: Float {\n        get {\n            return self.view.contentHuggingPriority(for: .vertical).rawValue\n        }\n        set {\n            self.view.setContentHuggingPriority(LayoutPriority(rawValue: newValue), for: .vertical)\n        }\n    }\n    \n    public var contentCompressionResistanceHorizontalPriority: Float {\n        get {\n            return self.view.contentCompressionResistancePriority(for: .horizontal).rawValue\n        }\n        set {\n            self.view.setContentCompressionResistancePriority(LayoutPriority(rawValue: newValue), for: .horizontal)\n        }\n    }\n    \n    public var contentCompressionResistanceVerticalPriority: Float {\n        get {\n            return self.view.contentCompressionResistancePriority(for: .vertical).rawValue\n        }\n        set {\n            self.view.setContentCompressionResistancePriority(LayoutPriority(rawValue: newValue), for: .vertical)\n        }\n    }\n    \n    public var target: AnyObject? {\n        return self.view\n    }\n    \n    internal let view: ConstraintView\n    \n    internal init(view: ConstraintView) {\n        self.view = view\n        \n    }\n    \n}\n"
  },
  {
    "path": "Pods/SnapKit/Source/Debugging.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\npublic extension LayoutConstraint {\n    \n    override public var description: String {\n        var description = \"<\"\n        \n        description += descriptionForObject(self)\n        \n        if let firstItem = conditionalOptional(from: self.firstItem) {\n            description += \" \\(descriptionForObject(firstItem))\"\n        }\n        \n        if self.firstAttribute != .notAnAttribute {\n            description += \".\\(descriptionForAttribute(self.firstAttribute))\"\n        }\n        \n        description += \" \\(descriptionForRelation(self.relation))\"\n        \n        if let secondItem = self.secondItem {\n            description += \" \\(descriptionForObject(secondItem))\"\n        }\n        \n        if self.secondAttribute != .notAnAttribute {\n            description += \".\\(descriptionForAttribute(self.secondAttribute))\"\n        }\n        \n        if self.multiplier != 1.0 {\n            description += \" * \\(self.multiplier)\"\n        }\n        \n        if self.secondAttribute == .notAnAttribute {\n            description += \" \\(self.constant)\"\n        } else {\n            if self.constant > 0.0 {\n                description += \" + \\(self.constant)\"\n            } else if self.constant < 0.0 {\n                description += \" - \\(abs(self.constant))\"\n            }\n        }\n        \n        if self.priority.rawValue != 1000.0 {\n            description += \" ^\\(self.priority)\"\n        }\n        \n        description += \">\"\n        \n        return description\n    }\n    \n}\n\nprivate func descriptionForRelation(_ relation: LayoutRelation) -> String {\n    switch relation {\n    case .equal:                return \"==\"\n    case .greaterThanOrEqual:   return \">=\"\n    case .lessThanOrEqual:      return \"<=\"\n    }\n}\n\nprivate func descriptionForAttribute(_ attribute: LayoutAttribute) -> String {\n    #if os(iOS) || os(tvOS)\n        switch attribute {\n        case .notAnAttribute:       return \"notAnAttribute\"\n        case .top:                  return \"top\"\n        case .left:                 return \"left\"\n        case .bottom:               return \"bottom\"\n        case .right:                return \"right\"\n        case .leading:              return \"leading\"\n        case .trailing:             return \"trailing\"\n        case .width:                return \"width\"\n        case .height:               return \"height\"\n        case .centerX:              return \"centerX\"\n        case .centerY:              return \"centerY\"\n        case .lastBaseline:         return \"lastBaseline\"\n        case .firstBaseline:        return \"firstBaseline\"\n        case .topMargin:            return \"topMargin\"\n        case .leftMargin:           return \"leftMargin\"\n        case .bottomMargin:         return \"bottomMargin\"\n        case .rightMargin:          return \"rightMargin\"\n        case .leadingMargin:        return \"leadingMargin\"\n        case .trailingMargin:       return \"trailingMargin\"\n        case .centerXWithinMargins: return \"centerXWithinMargins\"\n        case .centerYWithinMargins: return \"centerYWithinMargins\"\n        }\n    #else\n        switch attribute {\n        case .notAnAttribute:       return \"notAnAttribute\"\n        case .top:                  return \"top\"\n        case .left:                 return \"left\"\n        case .bottom:               return \"bottom\"\n        case .right:                return \"right\"\n        case .leading:              return \"leading\"\n        case .trailing:             return \"trailing\"\n        case .width:                return \"width\"\n        case .height:               return \"height\"\n        case .centerX:              return \"centerX\"\n        case .centerY:              return \"centerY\"\n        case .lastBaseline:         return \"lastBaseline\"\n        case .firstBaseline:        return \"firstBaseline\"\n        }\n    #endif\n}\n\nprivate func conditionalOptional<T>(from object: Optional<T>) -> Optional<T> {\n    return object\n}\n\nprivate func conditionalOptional<T>(from object: T) -> Optional<T> {\n    return Optional.some(object)\n}\n\nprivate func descriptionForObject(_ object: AnyObject) -> String {\n    let pointerDescription = String(format: \"%p\", UInt(bitPattern: ObjectIdentifier(object)))\n    var desc = \"\"\n    \n    desc += type(of: object).description()\n    \n    if let object = object as? ConstraintView {\n        desc += \":\\(object.snp.label() ?? pointerDescription)\"\n    } else if let object = object as? LayoutConstraint {\n        desc += \":\\(object.label ?? pointerDescription)\"\n    } else {\n        desc += \":\\(pointerDescription)\"\n    }\n    \n    if let object = object as? LayoutConstraint, let file = object.constraint?.sourceLocation.0, let line = object.constraint?.sourceLocation.1 {\n        desc += \"@\\((file as NSString).lastPathComponent)#\\(line)\"\n    }\n    \n    desc += \"\"\n    return desc\n}\n"
  },
  {
    "path": "Pods/SnapKit/Source/LayoutConstraint.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\n\npublic class LayoutConstraint : NSLayoutConstraint {\n    \n    public var label: String? {\n        get {\n            return self.identifier\n        }\n        set {\n            self.identifier = newValue\n        }\n    }\n    \n    internal weak var constraint: Constraint? = nil\n    \n}\n\ninternal func ==(lhs: LayoutConstraint, rhs: LayoutConstraint) -> Bool {\n    guard lhs.firstItem === rhs.firstItem &&\n          lhs.secondItem === rhs.secondItem &&\n          lhs.firstAttribute == rhs.firstAttribute &&\n          lhs.secondAttribute == rhs.secondAttribute &&\n          lhs.relation == rhs.relation &&\n          lhs.priority == rhs.priority &&\n          lhs.multiplier == rhs.multiplier else {\n        return false\n    }\n    return true\n}\n"
  },
  {
    "path": "Pods/SnapKit/Source/LayoutConstraintItem.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#else\n    import AppKit\n#endif\n\n\npublic protocol LayoutConstraintItem: class {\n}\n\n@available(iOS 9.0, OSX 10.11, *)\nextension ConstraintLayoutGuide : LayoutConstraintItem {\n}\n\nextension ConstraintView : LayoutConstraintItem {\n}\n\n\nextension LayoutConstraintItem {\n    \n    internal func prepare() {\n        if let view = self as? ConstraintView {\n            view.translatesAutoresizingMaskIntoConstraints = false\n        }\n    }\n    \n    internal var superview: ConstraintView? {\n        if let view = self as? ConstraintView {\n            return view.superview\n        }\n        \n        if #available(iOS 9.0, OSX 10.11, *), let guide = self as? ConstraintLayoutGuide {\n            return guide.owningView\n        }\n        \n        return nil\n    }\n    internal var constraints: [Constraint] {\n        return self.constraintsSet.allObjects as! [Constraint]\n    }\n    \n    internal func add(constraints: [Constraint]) {\n        let constraintsSet = self.constraintsSet\n        for constraint in constraints {\n            constraintsSet.add(constraint)\n        }\n    }\n    \n    internal func remove(constraints: [Constraint]) {\n        let constraintsSet = self.constraintsSet\n        for constraint in constraints {\n            constraintsSet.remove(constraint)\n        }\n    }\n    \n    private var constraintsSet: NSMutableSet {\n        let constraintsSet: NSMutableSet\n        \n        if let existing = objc_getAssociatedObject(self, &constraintsKey) as? NSMutableSet {\n            constraintsSet = existing\n        } else {\n            constraintsSet = NSMutableSet()\n            objc_setAssociatedObject(self, &constraintsKey, constraintsSet, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)\n        }\n        return constraintsSet\n        \n    }\n    \n}\nprivate var constraintsKey: UInt8 = 0\n"
  },
  {
    "path": "Pods/SnapKit/Source/Typealiases.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n    typealias LayoutRelation = NSLayoutRelation\n    typealias LayoutAttribute = NSLayoutAttribute\n    typealias LayoutPriority = UILayoutPriority\n#else\n    import AppKit\n    typealias LayoutRelation = NSLayoutConstraint.Relation\n    typealias LayoutAttribute = NSLayoutConstraint.Attribute\n    typealias LayoutPriority = NSLayoutConstraint.Priority\n#endif\n\n"
  },
  {
    "path": "Pods/SnapKit/Source/UILayoutSupport+Extensions.swift",
    "content": "//\n//  SnapKit\n//\n//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\n#if os(iOS) || os(tvOS)\n    import UIKit\n#endif\n\n    \n@available(iOS 8.0, *)\npublic extension ConstraintLayoutSupport {\n    \n    public var snp: ConstraintLayoutSupportDSL {\n        return ConstraintLayoutSupportDSL(support: self)\n    }\n    \n}\n"
  },
  {
    "path": "Pods/SwiftyColor/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Suyeol Jeon (xoul.kr)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Pods/SwiftyColor/README.md",
    "content": "SwiftyColor\n===========\n\n![Swift](https://img.shields.io/badge/Swift-3.0-orange.svg)\n[![Build Status](https://travis-ci.org/devxoul/SwiftyColor.svg)](https://travis-ci.org/devxoul/SwiftyColor)\n[![CocoaPods](http://img.shields.io/cocoapods/v/SwiftyColor.svg?style=flat)](http://cocoapods.org/?q=name%3ASwiftyColor%20author%3Adevxoul)\n\nThe most sexy way to use colors in Swift. Both compatible with iOS and macOS.\n\nColor from Hex\n--------------\n\n```swift\nlet color = 0x123456.color\n```\n\nAlpha Operator\n--------------\n\nUse infix operator `~`.\n\n```swift\nlet transparent = 0x123456.color ~ 50%\nlet red = UIColor.red ~ 10%\nlet float = UIColor.blue ~ 0.5 // == 50%\n```\n\nPercent Operator\n----------------\n\n```swift\nlet view = UIView()\nview.alpha = 30% // == 0.3\n```\n\nLicense\n-------\n\nSwiftyColor is under MIT license. See LICENSE file for more information.\n"
  },
  {
    "path": "Pods/SwiftyColor/Sources/SwiftyColor.swift",
    "content": "//\n// SwiftyColor\n//\n// The MIT License (MIT)\n//\n// Copyright (c) 2015 Suyeol Jeon (xoul.kr)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#if os(iOS)\n  import UIKit\n  public typealias Color = UIColor\n#elseif os(OSX)\n  import AppKit\n  public typealias Color = NSColor\n#endif\n\nextension Int {\n  public var color: Color {\n    let red = CGFloat(self as Int >> 16 & 0xff) / 255\n    let green = CGFloat(self >> 8 & 0xff) / 255\n    let blue  = CGFloat(self & 0xff) / 255\n    return Color(red: red, green: green, blue: blue, alpha: 1)\n  }\n}\n\nprecedencegroup AlphaPrecedence {\n  associativity: left\n  higherThan: RangeFormationPrecedence\n  lowerThan: AdditionPrecedence\n}\n\ninfix operator ~ : AlphaPrecedence\n\npublic func ~ (color: Color, alpha: Int) -> Color {\n  return color ~ CGFloat(alpha)\n}\npublic func ~ (color: Color, alpha: Float) -> Color {\n  return color ~ CGFloat(alpha)\n}\npublic func ~ (color: Color, alpha: CGFloat) -> Color {\n  return color.withAlphaComponent(alpha)\n}\n\n/// e.g. `50%`\npostfix operator %\npublic postfix func % (percent: Int) -> CGFloat {\n  return CGFloat(percent)%\n}\npublic postfix func % (percent: Float) -> CGFloat {\n  return CGFloat(percent)%\n}\npublic postfix func % (percent: CGFloat) -> CGFloat {\n  return percent / 100\n}\n"
  },
  {
    "path": "Pods/SwiftyJSON/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2017 Ruoyu Fu\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "Pods/SwiftyJSON/README.md",
    "content": "# SwiftyJSON\n\n[![Travis CI](https://travis-ci.org/SwiftyJSON/SwiftyJSON.svg?branch=master)](https://travis-ci.org/SwiftyJSON/SwiftyJSON) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) ![CocoaPods](https://img.shields.io/cocoapods/v/SwiftyJSON.svg) ![Platform](https://img.shields.io/badge/platforms-iOS%208.0+%20%7C%20macOS%2010.10+%20%7C%20tvOS%209.0+%20%7C%20watchOS%202.0+-333333.svg)\n\nSwiftyJSON makes it easy to deal with JSON data in Swift.\n\n1. [Why is the typical JSON handling in Swift NOT good](#why-is-the-typical-json-handling-in-swift-not-good)\n2. [Requirements](#requirements)\n3. [Integration](#integration)\n4. [Usage](#usage)\n   - [Initialization](#initialization)\n   - [Subscript](#subscript)\n   - [Loop](#loop)\n   - [Error](#error)\n   - [Optional getter](#optional-getter)\n   - [Non-optional getter](#non-optional-getter)\n   - [Setter](#setter)\n   - [Raw object](#raw-object)\n   - [Literal convertibles](#literal-convertibles)\n   - [Merging](#merging)\n5. [Work with Alamofire](#work-with-alamofire)\n6. [Work with Moya](#work-with-moya)\n\n> For Legacy Swift support, take a look at the [swift2 branch](https://github.com/SwiftyJSON/SwiftyJSON/tree/swift2)\n\n> [中文介绍](http://tangplin.github.io/swiftyjson/)\n\n\n## Why is the typical JSON handling in Swift NOT good?\n\nSwift is very strict about types. But although explicit typing is good for saving us from mistakes, it becomes painful when dealing with JSON and other areas that are, by nature, implicit about types.\n\nTake the Twitter API for example. Say we want to retrieve a user's \"name\" value of some tweet in Swift (according to Twitter's API https://dev.twitter.com/docs/api/1.1/get/statuses/home_timeline).\n\nThe code would look like this:\n\n```swift\nif let statusesArray = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [[String: Any]],\n    let user = statusesArray[0][\"user\"] as? [String: Any],\n    let username = user[\"name\"] as? String {\n    // Finally we got the username\n}\n```\n\nIt's not good.\n\nEven if we use optional chaining, it would be messy:\n\n```swift\nif let JSONObject = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [[String: Any]],\n    let username = (JSONObject[0][\"user\"] as? [String: Any])?[\"name\"] as? String {\n        // There's our username\n}\n```\n\nAn unreadable mess--for something that should really be simple!\n\nWith SwiftyJSON all you have to do is:\n\n```swift\nlet json = JSON(data: dataFromNetworking)\nif let userName = json[0][\"user\"][\"name\"].string {\n  //Now you got your value\n}\n```\n\nAnd don't worry about the Optional Wrapping thing. It's done for you automatically.\n\n```swift\nlet json = JSON(data: dataFromNetworking)\nif let userName = json[999999][\"wrong_key\"][\"wrong_name\"].string {\n    //Calm down, take it easy, the \".string\" property still produces the correct Optional String type with safety\n} else {\n    //Print the error\n    print(json[999999][\"wrong_key\"][\"wrong_name\"])\n}\n```\n\n## Requirements\n\n- iOS 8.0+ | macOS 10.10+ | tvOS 9.0+ | watchOS 2.0+\n- Xcode 8\n\n## Integration\n\n#### CocoaPods (iOS 8+, OS X 10.9+)\n\nYou can use [CocoaPods](http://cocoapods.org/) to install `SwiftyJSON` by adding it to your `Podfile`:\n\n```ruby\nplatform :ios, '8.0'\nuse_frameworks!\n\ntarget 'MyApp' do\n\tpod 'SwiftyJSON'\nend\n```\n\nNote that this requires CocoaPods version 36, and your iOS deployment target to be at least 8.0:\n\n\n#### Carthage (iOS 8+, OS X 10.9+)\n\nYou can use [Carthage](https://github.com/Carthage/Carthage) to install `SwiftyJSON` by adding it to your `Cartfile`:\n\n```\ngithub \"SwiftyJSON/SwiftyJSON\"\n```\n\n#### Swift Package Manager\n\nYou can use [The Swift Package Manager](https://swift.org/package-manager) to install `SwiftyJSON` by adding the proper description to your `Package.swift` file:\n\n```swift\nimport PackageDescription\n\nlet package = Package(\n    name: \"YOUR_PROJECT_NAME\",\n    targets: [],\n    dependencies: [\n        .Package(url: \"https://github.com/SwiftyJSON/SwiftyJSON.git\", versions: Version(1, 0, 0)..<Version(3, .max, .max)),\n    ]\n)\n```\n\nNote that the [Swift Package Manager](https://swift.org/package-manager) is still in early design and development, for more information checkout its [GitHub Page](https://github.com/apple/swift-package-manager)\n\n#### Manually (iOS 7+, OS X 10.9+)\n\nTo use this library in your project manually you may:  \n\n1. for Projects, just drag SwiftyJSON.swift to the project tree\n2. for Workspaces, include the whole SwiftyJSON.xcodeproj\n\n## Usage\n\n#### Initialization\n\n```swift\nimport SwiftyJSON\n```\n\n```swift\nlet json = JSON(data: dataFromNetworking)\n```\nOr\n\n```swift\nlet json = JSON(jsonObject)\n```\nOr\n\n```swift\nif let dataFromString = jsonString.data(using: .utf8, allowLossyConversion: false) {\n    let json = JSON(data: dataFromString)\n}\n```\n\n#### Subscript\n\n```swift\n// Getting a double from a JSON Array\nlet name = json[0].double\n```\n\n```swift\n// Getting an array of string from a JSON Array\nlet arrayNames =  json[\"users\"].arrayValue.map({$0[\"name\"].stringValue})\n```\n\n```swift\n// Getting a string from a JSON Dictionary\nlet name = json[\"name\"].stringValue\n```\n\n```swift\n// Getting a string using a path to the element\nlet path: [JSONSubscriptType] = [1,\"list\",2,\"name\"]\nlet name = json[path].string\n// Just the same\nlet name = json[1][\"list\"][2][\"name\"].string\n// Alternatively\nlet name = json[1,\"list\",2,\"name\"].string\n```\n\n```swift\n// With a hard way\nlet name = json[].string\n```\n\n```swift\n// With a custom way\nlet keys:[SubscriptType] = [1,\"list\",2,\"name\"]\nlet name = json[keys].string\n```\n\n#### Loop\n\n```swift\n// If json is .Dictionary\nfor (key,subJson):(String, JSON) in json {\n   // Do something you want\n}\n```\n\n*The first element is always a String, even if the JSON is an Array*\n\n```swift\n// If json is .Array\n// The `index` is 0..<json.count's string value\nfor (index,subJson):(String, JSON) in json {\n    // Do something you want\n}\n```\n\n#### Error\n\n##### SwiftyJSON 4.x\n\nSwiftyJSON 4.x introduces an enum type called `SwiftyJSONError`, which includes `unsupportedType`, `indexOutOfBounds`, `elementTooDeep`, `wrongType`, `notExist` and `invalidJSON`, at the same time, `ErrorDomain` are being replaced by `SwiftyJSONError.errorDomain`.\nNote: Those old error types are deprecated in SwiftyJSON 4.x and will be removed in the future release.\n\n##### SwiftyJSON 3.x\n\nUse a subscript to get/set a value in an Array or Dictionary\n\nIf the JSON is:\n*  an array, the app may crash with \"index out-of-bounds.\"\n*  a dictionary, it will be assigned to `nil` without a reason.\n*  not an array or a dictionary, the app may crash with an \"unrecognised selector\" exception.\n\nThis will never happen in SwiftyJSON.\n\n```swift\nlet json = JSON([\"name\", \"age\"])\nif let name = json[999].string {\n    // Do something you want\n} else {\n    print(json[999].error!) // \"Array[999] is out of bounds\"\n}\n```\n\n```swift\nlet json = JSON([\"name\":\"Jack\", \"age\": 25])\nif let name = json[\"address\"].string {\n    // Do something you want\n} else {\n    print(json[\"address\"].error!) // \"Dictionary[\"address\"] does not exist\"\n}\n```\n\n```swift\nlet json = JSON(12345)\nif let age = json[0].string {\n    // Do something you want\n} else {\n    print(json[0])       // \"Array[0] failure, It is not an array\"\n    print(json[0].error!) // \"Array[0] failure, It is not an array\"\n}\n\nif let name = json[\"name\"].string {\n    // Do something you want\n} else {\n    print(json[\"name\"])       // \"Dictionary[\\\"name\"] failure, It is not an dictionary\"\n    print(json[\"name\"].error!) // \"Dictionary[\\\"name\"] failure, It is not an dictionary\"\n}\n```\n\n#### Optional getter\n\n```swift\n// NSNumber\nif let id = json[\"user\"][\"favourites_count\"].number {\n   // Do something you want\n} else {\n   // Print the error\n   print(json[\"user\"][\"favourites_count\"].error!)\n}\n```\n\n```swift\n// String\nif let id = json[\"user\"][\"name\"].string {\n   // Do something you want\n} else {\n   // Print the error\n   print(json[\"user\"][\"name\"].error!)\n}\n```\n\n```swift\n// Bool\nif let id = json[\"user\"][\"is_translator\"].bool {\n   // Do something you want\n} else {\n   // Print the error\n   print(json[\"user\"][\"is_translator\"].error!)\n}\n```\n\n```swift\n// Int\nif let id = json[\"user\"][\"id\"].int {\n   // Do something you want\n} else {\n   // Print the error\n   print(json[\"user\"][\"id\"].error!)\n}\n...\n```\n\n#### Non-optional getter\n\nNon-optional getter is named `xxxValue`\n\n```swift\n// If not a Number or nil, return 0\nlet id: Int = json[\"id\"].intValue\n```\n\n```swift\n// If not a String or nil, return \"\"\nlet name: String = json[\"name\"].stringValue\n```\n\n```swift\n// If not an Array or nil, return []\nlet list: Array<JSON> = json[\"list\"].arrayValue\n```\n\n```swift\n// If not a Dictionary or nil, return [:]\nlet user: Dictionary<String, JSON> = json[\"user\"].dictionaryValue\n```\n\n#### Setter\n\n```swift\njson[\"name\"] = JSON(\"new-name\")\njson[0] = JSON(1)\n```\n\n```swift\njson[\"id\"].int =  1234567890\njson[\"coordinate\"].double =  8766.766\njson[\"name\"].string =  \"Jack\"\njson.arrayObject = [1,2,3,4]\njson.dictionaryObject = [\"name\":\"Jack\", \"age\":25]\n```\n\n#### Raw object\n\n```swift\nlet rawObject: Any = json.object\n```\n\n```swift\nlet rawValue: Any = json.rawValue\n```\n\n```swift\n//convert the JSON to raw NSData\ndo {\n\tlet rawData = try json.rawData()\n  //Do something you want\n} catch {\n\tprint(\"Error \\(error)\")\n}\n```\n\n```swift\n//convert the JSON to a raw String\nif let rawString = json.rawString() {\n  //Do something you want\n} else {\n\tprint(\"json.rawString is nil\")\n}\n```\n\n#### Existence\n\n```swift\n// shows you whether value specified in JSON or not\nif json[\"name\"].exists()\n```\n\n#### Literal convertibles\n\nFor more info about literal convertibles: [Swift Literal Convertibles](http://nshipster.com/swift-literal-convertible/)\n\n```swift\n// StringLiteralConvertible\nlet json: JSON = \"I'm a json\"\n```\n\n```swift\n/ /IntegerLiteralConvertible\nlet json: JSON =  12345\n```\n\n```swift\n// BooleanLiteralConvertible\nlet json: JSON =  true\n```\n\n```swift\n// FloatLiteralConvertible\nlet json: JSON =  2.8765\n```\n\n```swift\n// DictionaryLiteralConvertible\nlet json: JSON =  [\"I\":\"am\", \"a\":\"json\"]\n```\n\n```swift\n// ArrayLiteralConvertible\nlet json: JSON =  [\"I\", \"am\", \"a\", \"json\"]\n```\n\n```swift\n// With subscript in array\nvar json: JSON =  [1,2,3]\njson[0] = 100\njson[1] = 200\njson[2] = 300\njson[999] = 300 // Don't worry, nothing will happen\n```\n\n```swift\n// With subscript in dictionary\nvar json: JSON =  [\"name\": \"Jack\", \"age\": 25]\njson[\"name\"] = \"Mike\"\njson[\"age\"] = \"25\" // It's OK to set String\njson[\"address\"] = \"L.A.\" // Add the \"address\": \"L.A.\" in json\n```\n\n```swift\n// Array & Dictionary\nvar json: JSON =  [\"name\": \"Jack\", \"age\": 25, \"list\": [\"a\", \"b\", \"c\", [\"what\": \"this\"]]]\njson[\"list\"][3][\"what\"] = \"that\"\njson[\"list\",3,\"what\"] = \"that\"\nlet path: [JSONSubscriptType] = [\"list\",3,\"what\"]\njson[path] = \"that\"\n```\n\n```swift\n// With other JSON objects\nlet user: JSON = [\"username\" : \"Steve\", \"password\": \"supersecurepassword\"]\nlet auth: JSON = [\n  \"user\": user.object, // use user.object instead of just user\n  \"apikey\": \"supersecretapitoken\"\n]\n```\n\n#### Merging\n\nIt is possible to merge one JSON into another JSON. Merging a JSON into another JSON adds all non existing values to the original JSON which are only present in the `other` JSON.\n\nIf both JSONs contain a value for the same key, _mostly_ this value gets overwritten in the original JSON, but there are two cases where it provides some special treatment:\n\n- In case of both values being a `JSON.Type.array` the values form the array found in the `other` JSON getting appended to the original JSON's array value.\n- In case of both values being a `JSON.Type.dictionary` both JSON-values are getting merged the same way the encapsulating JSON is merged.\n\nIn case, where two fields in a JSON have a different types, the value will get always overwritten.\n\nThere are two different fashions for merging: `merge` modifies the original JSON, whereas `merged` works non-destructively on a copy.\n\n```swift\nlet original: JSON = [\n    \"first_name\": \"John\",\n    \"age\": 20,\n    \"skills\": [\"Coding\", \"Reading\"],\n    \"address\": [\n        \"street\": \"Front St\",\n        \"zip\": \"12345\",\n    ]\n]\n\nlet update: JSON = [\n    \"last_name\": \"Doe\",\n    \"age\": 21,\n    \"skills\": [\"Writing\"],\n    \"address\": [\n        \"zip\": \"12342\",\n        \"city\": \"New York City\"\n    ]\n]\n\nlet updated = original.merge(with: update)\n// [\n//     \"first_name\": \"John\",\n//     \"last_name\": \"Doe\",\n//     \"age\": 21,\n//     \"skills\": [\"Coding\", \"Reading\", \"Writing\"],\n//     \"address\": [\n//         \"street\": \"Front St\",\n//         \"zip\": \"12342\",\n//         \"city\": \"New York City\"\n//     ]\n// ]\n```\n\n## String representation\nThere are two options available:\n- use the default Swift one\n- use a custom one that will handle optionals well and represent `nil` as `\"null\"`:\n```swift\nlet dict = [\"1\":2, \"2\":\"two\", \"3\": nil] as [String: Any?]\nlet json = JSON(dict)\nlet representation = json.rawString(options: [.castNilToNSNull: true])\n// representation is \"{\\\"1\\\":2,\\\"2\\\":\\\"two\\\",\\\"3\\\":null}\", which represents {\"1\":2,\"2\":\"two\",\"3\":null}\n```\n\n## Work with [Alamofire](https://github.com/Alamofire/Alamofire)\n\nSwiftyJSON nicely wraps the result of the Alamofire JSON response handler:\n\n```swift\nAlamofire.request(url, method: .get).validate().responseJSON { response in\n    switch response.result {\n    case .success(let value):\n        let json = JSON(value)\n        print(\"JSON: \\(json)\")\n    case .failure(let error):\n        print(error)\n    }\n}\n```\n\nWe also provide an extension of Alamofire for serializing NSData to SwiftyJSON's JSON.\n\nSee: [Alamofire-SwiftyJSON](https://github.com/SwiftyJSON/Alamofire-SwiftyJSON)\n\n\n## Work with [Moya](https://github.com/Moya/Moya)\n\nSwiftyJSON parse data to JSON:\n\n```swift\nlet provider = MoyaProvider<Backend>()\nprovider.request(.showProducts) { result in\n    switch result {\n    case let .success(moyaResponse):\n        let data = moyaResponse.data\n        let json = JSON(data: data) // convert network data to json\n        print(json)\n    case let .failure(error):\n        print(\"error: \\(error)\")\n    }\n}\n\n```\n"
  },
  {
    "path": "Pods/SwiftyJSON/Source/SwiftyJSON.swift",
    "content": "//  SwiftyJSON.swift\n//\n//  Copyright (c) 2014 - 2017 Ruoyu Fu, Pinglin Tang\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport Foundation\n\n// MARK: - Error\n// swiftlint:disable line_length\n/// Error domain\n@available(*, deprecated, message: \"ErrorDomain is deprecated. Use `SwiftyJSONError.errorDomain` instead.\", renamed: \"SwiftyJSONError.errorDomain\")\npublic let ErrorDomain: String = \"SwiftyJSONErrorDomain\"\n\n/// Error code\n@available(*, deprecated, message: \"ErrorUnsupportedType is deprecated. Use `SwiftyJSONError.unsupportedType` instead.\", renamed: \"SwiftyJSONError.unsupportedType\")\npublic let ErrorUnsupportedType: Int = 999\n@available(*, deprecated, message: \"ErrorIndexOutOfBounds is deprecated. Use `SwiftyJSONError.indexOutOfBounds` instead.\", renamed: \"SwiftyJSONError.indexOutOfBounds\")\npublic let ErrorIndexOutOfBounds: Int = 900\n@available(*, deprecated, message: \"ErrorWrongType is deprecated. Use `SwiftyJSONError.wrongType` instead.\", renamed: \"SwiftyJSONError.wrongType\")\npublic let ErrorWrongType: Int = 901\n@available(*, deprecated, message: \"ErrorNotExist is deprecated. Use `SwiftyJSONError.notExist` instead.\", renamed: \"SwiftyJSONError.notExist\")\npublic let ErrorNotExist: Int = 500\n@available(*, deprecated, message: \"ErrorInvalidJSON is deprecated. Use `SwiftyJSONError.invalidJSON` instead.\", renamed: \"SwiftyJSONError.invalidJSON\")\npublic let ErrorInvalidJSON: Int = 490\n\npublic enum SwiftyJSONError: Int, Swift.Error {\n    case unsupportedType = 999\n    case indexOutOfBounds = 900\n    case elementTooDeep = 902\n    case wrongType = 901\n    case notExist = 500\n    case invalidJSON = 490\n}\n\nextension SwiftyJSONError: CustomNSError {\n\n    /// return the error domain of SwiftyJSONError\n    public static var errorDomain: String { return \"com.swiftyjson.SwiftyJSON\" }\n\n    /// return the error code of SwiftyJSONError\n    public var errorCode: Int { return self.rawValue }\n\n    /// return the userInfo of SwiftyJSONError\n    public var errorUserInfo: [String: Any] {\n        switch self {\n        case .unsupportedType:\n            return [NSLocalizedDescriptionKey: \"It is an unsupported type.\"]\n        case .indexOutOfBounds:\n            return [NSLocalizedDescriptionKey: \"Array Index is out of bounds.\"]\n        case .wrongType:\n            return [NSLocalizedDescriptionKey: \"Couldn't merge, because the JSONs differ in type on top level.\"]\n        case .notExist:\n            return [NSLocalizedDescriptionKey: \"Dictionary key does not exist.\"]\n        case .invalidJSON:\n            return [NSLocalizedDescriptionKey: \"JSON is invalid.\"]\n        case .elementTooDeep:\n            return [NSLocalizedDescriptionKey: \"Element too deep. Increase maxObjectDepth and make sure there is no reference loop.\"]\n        }\n    }\n}\n\n// MARK: - JSON Type\n\n/**\nJSON's type definitions.\n\nSee http://www.json.org\n*/\npublic enum Type: Int {\n\tcase number\n\tcase string\n\tcase bool\n\tcase array\n\tcase dictionary\n\tcase null\n\tcase unknown\n}\n\n// MARK: - JSON Base\n\npublic struct JSON {\n\n\t/**\n\t Creates a JSON using the data.\n\t\n\t - parameter data: The NSData used to convert to json.Top level object in data is an NSArray or NSDictionary\n\t - parameter opt: The JSON serialization reading options. `[]` by default.\n\t\n\t - returns: The created JSON\n\t */\n    public init(data: Data, options opt: JSONSerialization.ReadingOptions = []) throws {\n        let object: Any = try JSONSerialization.jsonObject(with: data, options: opt)\n        self.init(jsonObject: object)\n    }\n\n    /**\n\t Creates a JSON object\n\t - note: this does not parse a `String` into JSON, instead use `init(parseJSON: String)`\n\t\n\t - parameter object: the object\n\n\t - returns: the created JSON object\n\t */\n    public init(_ object: Any) {\n        switch object {\n        case let object as Data:\n            do {\n                try self.init(data: object)\n            } catch {\n                self.init(jsonObject: NSNull())\n            }\n        default:\n            self.init(jsonObject: object)\n        }\n    }\n\n\t/**\n\t Parses the JSON string into a JSON object\n\t\n\t - parameter json: the JSON string\n\t\n\t - returns: the created JSON object\n\t*/\n\tpublic init(parseJSON jsonString: String) {\n\t\tif let data = jsonString.data(using: .utf8) {\n\t\t\tself.init(data)\n\t\t} else {\n\t\t\tself.init(NSNull())\n\t\t}\n\t}\n\n\t/**\n\t Creates a JSON from JSON string\n\t\n\t - parameter json: Normal json string like '{\"a\":\"b\"}'\n\t\n\t - returns: The created JSON\n\t */\n    @available(*, deprecated, message: \"Use instead `init(parseJSON: )`\")\n    public static func parse(_ json: String) -> JSON {\n        return json.data(using: String.Encoding.utf8)\n            .flatMap { try? JSON(data: $0) } ?? JSON(NSNull())\n    }\n\n\t/**\n\t Creates a JSON using the object.\n\t\n\t - parameter jsonObject:  The object must have the following properties: All objects are NSString/String, NSNumber/Int/Float/Double/Bool, NSArray/Array, NSDictionary/Dictionary, or NSNull; All dictionary keys are NSStrings/String; NSNumbers are not NaN or infinity.\n\t\n\t - returns: The created JSON\n\t */\n    fileprivate init(jsonObject: Any) {\n        self.object = jsonObject\n    }\n\n\t/**\n\t Merges another JSON into this JSON, whereas primitive values which are not present in this JSON are getting added,\n\t present values getting overwritten, array values getting appended and nested JSONs getting merged the same way.\n \n\t - parameter other: The JSON which gets merged into this JSON\n\t\n\t - throws `ErrorWrongType` if the other JSONs differs in type on the top level.\n\t */\n    public mutating func merge(with other: JSON) throws {\n        try self.merge(with: other, typecheck: true)\n    }\n\n\t/**\n\t Merges another JSON into this JSON and returns a new JSON, whereas primitive values which are not present in this JSON are getting added,\n\t present values getting overwritten, array values getting appended and nested JSONS getting merged the same way.\n\t\n\t - parameter other: The JSON which gets merged into this JSON\n\t\n\t - throws `ErrorWrongType` if the other JSONs differs in type on the top level.\n\t\n\t - returns: New merged JSON\n\t */\n    public func merged(with other: JSON) throws -> JSON {\n        var merged = self\n        try merged.merge(with: other, typecheck: true)\n        return merged\n    }\n\n    /**\n     Private woker function which does the actual merging\n     Typecheck is set to true for the first recursion level to prevent total override of the source JSON\n \t*/\n \tfileprivate mutating func merge(with other: JSON, typecheck: Bool) throws {\n        if self.type == other.type {\n            switch self.type {\n            case .dictionary:\n                for (key, _) in other {\n                    try self[key].merge(with: other[key], typecheck: false)\n                }\n            case .array:\n                self = JSON(self.arrayValue + other.arrayValue)\n            default:\n                self = other\n            }\n        } else {\n            if typecheck {\n                throw SwiftyJSONError.wrongType\n            } else {\n                self = other\n            }\n        }\n    }\n\n    /// Private object\n    fileprivate var rawArray: [Any] = []\n    fileprivate var rawDictionary: [String: Any] = [:]\n    fileprivate var rawString: String = \"\"\n    fileprivate var rawNumber: NSNumber = 0\n    fileprivate var rawNull: NSNull = NSNull()\n    fileprivate var rawBool: Bool = false\n\n    /// JSON type, fileprivate setter\n    public fileprivate(set) var type: Type = .null\n\n    /// Error in JSON, fileprivate setter\n    public fileprivate(set) var error: SwiftyJSONError?\n\n    /// Object in JSON\n    public var object: Any {\n        get {\n            switch self.type {\n            case .array:\n                return self.rawArray\n            case .dictionary:\n                return self.rawDictionary\n            case .string:\n                return self.rawString\n            case .number:\n                return self.rawNumber\n            case .bool:\n                return self.rawBool\n            default:\n                return self.rawNull\n            }\n        }\n        set {\n            error = nil\n            switch unwrap(newValue) {\n            case let number as NSNumber:\n                if number.isBool {\n                    type = .bool\n                    self.rawBool = number.boolValue\n                } else {\n                    type = .number\n                    self.rawNumber = number\n                }\n            case let string as String:\n                type = .string\n                self.rawString = string\n            case _ as NSNull:\n                type = .null\n            case nil:\n                type = .null\n            case let array as [Any]:\n                type = .array\n                self.rawArray = array\n            case let dictionary as [String: Any]:\n                type = .dictionary\n                self.rawDictionary = dictionary\n            default:\n                type = .unknown\n                error = SwiftyJSONError.unsupportedType\n            }\n        }\n    }\n\n    /// The static null JSON\n    @available(*, unavailable, renamed:\"null\")\n    public static var nullJSON: JSON { return null }\n    public static var null: JSON { return JSON(NSNull()) }\n}\n\n/// Private method to unwarp an object recursively\nprivate func unwrap(_ object: Any) -> Any {\n    switch object {\n    case let json as JSON:\n        return unwrap(json.object)\n    case let array as [Any]:\n        return array.map(unwrap)\n    case let dictionary as [String: Any]:\n        var unwrappedDic = dictionary\n        for (k, v) in dictionary {\n            unwrappedDic[k] = unwrap(v)\n        }\n        return unwrappedDic\n    default:\n        return object\n    }\n}\n\npublic enum Index<T: Any>: Comparable {\n    case array(Int)\n    case dictionary(DictionaryIndex<String, T>)\n    case null\n\n    static public func == (lhs: Index, rhs: Index) -> Bool {\n        switch (lhs, rhs) {\n        case (.array(let left), .array(let right)):\n            return left == right\n        case (.dictionary(let left), .dictionary(let right)):\n            return left == right\n        case (.null, .null): return true\n        default:\n            return false\n        }\n    }\n\n    static public func < (lhs: Index, rhs: Index) -> Bool {\n        switch (lhs, rhs) {\n        case (.array(let left), .array(let right)):\n            return left < right\n        case (.dictionary(let left), .dictionary(let right)):\n            return left < right\n        default:\n            return false\n        }\n    }\n}\n\npublic typealias JSONIndex = Index<JSON>\npublic typealias JSONRawIndex = Index<Any>\n\nextension JSON: Swift.Collection {\n\n    public typealias Index = JSONRawIndex\n\n    public var startIndex: Index {\n        switch type {\n        case .array:\n            return .array(rawArray.startIndex)\n        case .dictionary:\n            return .dictionary(rawDictionary.startIndex)\n        default:\n            return .null\n        }\n    }\n\n    public var endIndex: Index {\n        switch type {\n        case .array:\n            return .array(rawArray.endIndex)\n        case .dictionary:\n            return .dictionary(rawDictionary.endIndex)\n        default:\n            return .null\n        }\n    }\n\n    public func index(after i: Index) -> Index {\n        switch i {\n        case .array(let idx):\n            return .array(rawArray.index(after: idx))\n        case .dictionary(let idx):\n            return .dictionary(rawDictionary.index(after: idx))\n        default:\n            return .null\n        }\n    }\n\n    public subscript (position: Index) -> (String, JSON) {\n        switch position {\n        case .array(let idx):\n            return (String(idx), JSON(self.rawArray[idx]))\n        case .dictionary(let idx):\n            let (key, value) = self.rawDictionary[idx]\n            return (key, JSON(value))\n        default:\n            return (\"\", JSON.null)\n        }\n    }\n}\n\n// MARK: - Subscript\n\n/**\n *  To mark both String and Int can be used in subscript.\n */\npublic enum JSONKey {\n    case index(Int)\n    case key(String)\n}\n\npublic protocol JSONSubscriptType {\n    var jsonKey: JSONKey { get }\n}\n\nextension Int: JSONSubscriptType {\n    public var jsonKey: JSONKey {\n        return JSONKey.index(self)\n    }\n}\n\nextension String: JSONSubscriptType {\n    public var jsonKey: JSONKey {\n        return JSONKey.key(self)\n    }\n}\n\nextension JSON {\n\n    /// If `type` is `.array`, return json whose object is `array[index]`, otherwise return null json with error.\n    fileprivate subscript(index index: Int) -> JSON {\n        get {\n            if self.type != .array {\n                var r = JSON.null\n                r.error = self.error ?? SwiftyJSONError.wrongType\n                return r\n            } else if self.rawArray.indices.contains(index) {\n                return JSON(self.rawArray[index])\n            } else {\n                var r = JSON.null\n                r.error = SwiftyJSONError.indexOutOfBounds\n                return r\n            }\n        }\n        set {\n            if self.type == .array &&\n                self.rawArray.indices.contains(index) &&\n                newValue.error == nil {\n                self.rawArray[index] = newValue.object\n            }\n        }\n    }\n\n    /// If `type` is `.dictionary`, return json whose object is `dictionary[key]` , otherwise return null json with error.\n    fileprivate subscript(key key: String) -> JSON {\n        get {\n            var r = JSON.null\n            if self.type == .dictionary {\n                if let o = self.rawDictionary[key] {\n                    r = JSON(o)\n                } else {\n                    r.error = SwiftyJSONError.notExist\n                }\n            } else {\n                r.error = self.error ?? SwiftyJSONError.wrongType\n            }\n            return r\n        }\n        set {\n            if self.type == .dictionary && newValue.error == nil {\n                self.rawDictionary[key] = newValue.object\n            }\n        }\n    }\n\n    /// If `sub` is `Int`, return `subscript(index:)`; If `sub` is `String`,  return `subscript(key:)`.\n    fileprivate subscript(sub sub: JSONSubscriptType) -> JSON {\n        get {\n            switch sub.jsonKey {\n            case .index(let index): return self[index: index]\n            case .key(let key): return self[key: key]\n            }\n        }\n        set {\n            switch sub.jsonKey {\n            case .index(let index): self[index: index] = newValue\n            case .key(let key): self[key: key] = newValue\n            }\n        }\n    }\n\n\t/**\n\t Find a json in the complex data structures by using array of Int and/or String as path.\n\t\n\t Example:\n\t\n\t ```\n\t let json = JSON[data]\n\t let path = [9,\"list\",\"person\",\"name\"]\n\t let name = json[path]\n\t ```\n\t\n\t The same as: let name = json[9][\"list\"][\"person\"][\"name\"]\n\t\n\t - parameter path: The target json's path.\n\t\n\t - returns: Return a json found by the path or a null json with error\n\t */\n    public subscript(path: [JSONSubscriptType]) -> JSON {\n        get {\n            return path.reduce(self) { $0[sub: $1] }\n        }\n        set {\n            switch path.count {\n            case 0:\n                return\n            case 1:\n                self[sub:path[0]].object = newValue.object\n            default:\n                var aPath = path\n                aPath.remove(at: 0)\n                var nextJSON = self[sub: path[0]]\n                nextJSON[aPath] = newValue\n                self[sub: path[0]] = nextJSON\n            }\n        }\n    }\n\n    /**\n     Find a json in the complex data structures by using array of Int and/or String as path.\n\n     - parameter path: The target json's path. Example:\n\n     let name = json[9,\"list\",\"person\",\"name\"]\n\n     The same as: let name = json[9][\"list\"][\"person\"][\"name\"]\n\n     - returns: Return a json found by the path or a null json with error\n     */\n    public subscript(path: JSONSubscriptType...) -> JSON {\n        get {\n            return self[path]\n        }\n        set {\n            self[path] = newValue\n        }\n    }\n}\n\n// MARK: - LiteralConvertible\n\nextension JSON: Swift.ExpressibleByStringLiteral {\n\n    public init(stringLiteral value: StringLiteralType) {\n        self.init(value as Any)\n    }\n\n    public init(extendedGraphemeClusterLiteral value: StringLiteralType) {\n        self.init(value as Any)\n    }\n\n    public init(unicodeScalarLiteral value: StringLiteralType) {\n        self.init(value as Any)\n    }\n}\n\nextension JSON: Swift.ExpressibleByIntegerLiteral {\n\n    public init(integerLiteral value: IntegerLiteralType) {\n        self.init(value as Any)\n    }\n}\n\nextension JSON: Swift.ExpressibleByBooleanLiteral {\n\n    public init(booleanLiteral value: BooleanLiteralType) {\n        self.init(value as Any)\n    }\n}\n\nextension JSON: Swift.ExpressibleByFloatLiteral {\n\n    public init(floatLiteral value: FloatLiteralType) {\n        self.init(value as Any)\n    }\n}\n\nextension JSON: Swift.ExpressibleByDictionaryLiteral {\n    public init(dictionaryLiteral elements: (String, Any)...) {\n        var dictionary = [String: Any](minimumCapacity: elements.count)\n        for (k, v) in elements {\n            dictionary[k] = v\n        }\n        self.init(dictionary as Any)\n    }\n}\n\nextension JSON: Swift.ExpressibleByArrayLiteral {\n\n    public init(arrayLiteral elements: Any...) {\n        self.init(elements as Any)\n    }\n}\n\nextension JSON: Swift.ExpressibleByNilLiteral {\n\n    @available(*, deprecated, message: \"use JSON.null instead. Will be removed in future versions\")\n    public init(nilLiteral: ()) {\n        self.init(NSNull() as Any)\n    }\n}\n\n// MARK: - Raw\n\nextension JSON: Swift.RawRepresentable {\n\n    public init?(rawValue: Any) {\n        if JSON(rawValue).type == .unknown {\n            return nil\n        } else {\n            self.init(rawValue)\n        }\n    }\n\n    public var rawValue: Any {\n        return self.object\n    }\n\n    public func rawData(options opt: JSONSerialization.WritingOptions = JSONSerialization.WritingOptions(rawValue: 0)) throws -> Data {\n        guard JSONSerialization.isValidJSONObject(self.object) else {\n            throw SwiftyJSONError.invalidJSON\n        }\n\n        return try JSONSerialization.data(withJSONObject: self.object, options: opt)\n\t}\n\n\tpublic func rawString(_ encoding: String.Encoding = .utf8, options opt: JSONSerialization.WritingOptions = .prettyPrinted) -> String? {\n\t\tdo {\n\t\t\treturn try _rawString(encoding, options: [.jsonSerialization: opt])\n\t\t} catch {\n\t\t\tprint(\"Could not serialize object to JSON because:\", error.localizedDescription)\n\t\t\treturn nil\n\t\t}\n\t}\n\n\tpublic func rawString(_ options: [writingOptionsKeys: Any]) -> String? {\n\t\tlet encoding = options[.encoding] as? String.Encoding ?? String.Encoding.utf8\n\t\tlet maxObjectDepth = options[.maxObjextDepth] as? Int ?? 10\n\t\tdo {\n\t\t\treturn try _rawString(encoding, options: options, maxObjectDepth: maxObjectDepth)\n\t\t} catch {\n\t\t\tprint(\"Could not serialize object to JSON because:\", error.localizedDescription)\n\t\t\treturn nil\n\t\t}\n\t}\n\n\tfileprivate func _rawString(_ encoding: String.Encoding = .utf8, options: [writingOptionsKeys: Any], maxObjectDepth: Int = 10) throws -> String? {\n        guard maxObjectDepth > 0 else { throw SwiftyJSONError.invalidJSON }\n        switch self.type {\n        case .dictionary:\n\t\t\tdo {\n\t\t\t\tif !(options[.castNilToNSNull] as? Bool ?? false) {\n\t\t\t\t\tlet jsonOption = options[.jsonSerialization] as? JSONSerialization.WritingOptions ?? JSONSerialization.WritingOptions.prettyPrinted\n\t\t\t\t\tlet data = try self.rawData(options: jsonOption)\n\t\t\t\t\treturn String(data: data, encoding: encoding)\n\t\t\t\t}\n\n\t\t\t\tguard let dict = self.object as? [String: Any?] else {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tlet body = try dict.keys.map { key throws -> String in\n\t\t\t\t\tguard let value = dict[key] else {\n\t\t\t\t\t\treturn \"\\\"\\(key)\\\": null\"\n\t\t\t\t\t}\n\t\t\t\t\tguard let unwrappedValue = value else {\n\t\t\t\t\t\treturn \"\\\"\\(key)\\\": null\"\n\t\t\t\t\t}\n\n\t\t\t\t\tlet nestedValue = JSON(unwrappedValue)\n\t\t\t\t\tguard let nestedString = try nestedValue._rawString(encoding, options: options, maxObjectDepth: maxObjectDepth - 1) else {\n\t\t\t\t\t\tthrow SwiftyJSONError.elementTooDeep\n\t\t\t\t\t}\n\t\t\t\t\tif nestedValue.type == .string {\n\t\t\t\t\t\treturn \"\\\"\\(key)\\\": \\\"\\(nestedString.replacingOccurrences(of: \"\\\\\", with: \"\\\\\\\\\").replacingOccurrences(of: \"\\\"\", with: \"\\\\\\\"\"))\\\"\"\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn \"\\\"\\(key)\\\": \\(nestedString)\"\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn \"{\\(body.joined(separator: \",\"))}\"\n\t\t\t} catch _ {\n\t\t\t\treturn nil\n\t\t\t}\n        case .array:\n            do {\n\t\t\t\tif !(options[.castNilToNSNull] as? Bool ?? false) {\n\t\t\t\t\tlet jsonOption = options[.jsonSerialization] as? JSONSerialization.WritingOptions ?? JSONSerialization.WritingOptions.prettyPrinted\n\t\t\t\t\tlet data = try self.rawData(options: jsonOption)\n\t\t\t\t\treturn String(data: data, encoding: encoding)\n\t\t\t\t}\n\n                guard let array = self.object as? [Any?] else {\n                    return nil\n                }\n                let body = try array.map { value throws -> String in\n                    guard let unwrappedValue = value else {\n                        return \"null\"\n                    }\n\n                    let nestedValue = JSON(unwrappedValue)\n                    guard let nestedString = try nestedValue._rawString(encoding, options: options, maxObjectDepth: maxObjectDepth - 1) else {\n                        throw SwiftyJSONError.invalidJSON\n                    }\n                    if nestedValue.type == .string {\n                        return \"\\\"\\(nestedString.replacingOccurrences(of: \"\\\\\", with: \"\\\\\\\\\").replacingOccurrences(of: \"\\\"\", with: \"\\\\\\\"\"))\\\"\"\n                    } else {\n                        return nestedString\n                    }\n                }\n\n                return \"[\\(body.joined(separator: \",\"))]\"\n            } catch _ {\n                return nil\n            }\n        case .string:\n            return self.rawString\n        case .number:\n            return self.rawNumber.stringValue\n        case .bool:\n            return self.rawBool.description\n        case .null:\n            return \"null\"\n        default:\n            return nil\n        }\n    }\n}\n\n// MARK: - Printable, DebugPrintable\n\nextension JSON: Swift.CustomStringConvertible, Swift.CustomDebugStringConvertible {\n\n    public var description: String {\n        if let string = self.rawString(options: .prettyPrinted) {\n            return string\n        } else {\n            return \"unknown\"\n        }\n    }\n\n    public var debugDescription: String {\n        return description\n    }\n}\n\n// MARK: - Array\n\nextension JSON {\n\n    //Optional [JSON]\n    public var array: [JSON]? {\n        if self.type == .array {\n            return self.rawArray.map { JSON($0) }\n        } else {\n            return nil\n        }\n    }\n\n    //Non-optional [JSON]\n    public var arrayValue: [JSON] {\n        return self.array ?? []\n    }\n\n    //Optional [Any]\n    public var arrayObject: [Any]? {\n        get {\n            switch self.type {\n            case .array:\n                return self.rawArray\n            default:\n                return nil\n            }\n        }\n        set {\n            if let array = newValue {\n                self.object = array as Any\n            } else {\n                self.object = NSNull()\n            }\n        }\n    }\n}\n\n// MARK: - Dictionary\n\nextension JSON {\n\n    //Optional [String : JSON]\n    public var dictionary: [String: JSON]? {\n        if self.type == .dictionary {\n            var d = [String: JSON](minimumCapacity: rawDictionary.count)\n            for (key, value) in rawDictionary {\n                d[key] = JSON(value)\n            }\n            return d\n        } else {\n            return nil\n        }\n    }\n\n    //Non-optional [String : JSON]\n    public var dictionaryValue: [String: JSON] {\n        return self.dictionary ?? [:]\n    }\n\n    //Optional [String : Any]\n\n    public var dictionaryObject: [String: Any]? {\n        get {\n            switch self.type {\n            case .dictionary:\n                return self.rawDictionary\n            default:\n                return nil\n            }\n        }\n        set {\n            if let v = newValue {\n                self.object = v as Any\n            } else {\n                self.object = NSNull()\n            }\n        }\n    }\n}\n\n// MARK: - Bool\n\nextension JSON { // : Swift.Bool\n\n    //Optional bool\n    public var bool: Bool? {\n        get {\n            switch self.type {\n            case .bool:\n                return self.rawBool\n            default:\n                return nil\n            }\n        }\n        set {\n            if let newValue = newValue {\n                self.object = newValue as Bool\n            } else {\n                self.object = NSNull()\n            }\n        }\n    }\n\n    //Non-optional bool\n    public var boolValue: Bool {\n        get {\n            switch self.type {\n            case .bool:\n                return self.rawBool\n            case .number:\n                return self.rawNumber.boolValue\n            case .string:\n                return [\"true\", \"y\", \"t\", \"yes\", \"1\"].contains { self.rawString.caseInsensitiveCompare($0) == .orderedSame }\n            default:\n                return false\n            }\n        }\n        set {\n            self.object = newValue\n        }\n    }\n}\n\n// MARK: - String\n\nextension JSON {\n\n    //Optional string\n    public var string: String? {\n        get {\n            switch self.type {\n            case .string:\n                return self.object as? String\n            default:\n                return nil\n            }\n        }\n        set {\n            if let newValue = newValue {\n                self.object = NSString(string: newValue)\n            } else {\n                self.object = NSNull()\n            }\n        }\n    }\n\n    //Non-optional string\n    public var stringValue: String {\n        get {\n            switch self.type {\n            case .string:\n                return self.object as? String ?? \"\"\n            case .number:\n                return self.rawNumber.stringValue\n            case .bool:\n                return (self.object as? Bool).map { String($0) } ?? \"\"\n            default:\n                return \"\"\n            }\n        }\n        set {\n            self.object = NSString(string: newValue)\n        }\n    }\n}\n\n// MARK: - Number\n\nextension JSON {\n\n    //Optional number\n    public var number: NSNumber? {\n        get {\n            switch self.type {\n            case .number:\n                return self.rawNumber\n            case .bool:\n                return NSNumber(value: self.rawBool ? 1 : 0)\n            default:\n                return nil\n            }\n        }\n        set {\n            self.object = newValue ?? NSNull()\n        }\n    }\n\n    //Non-optional number\n    public var numberValue: NSNumber {\n        get {\n            switch self.type {\n            case .string:\n                let decimal = NSDecimalNumber(string: self.object as? String)\n                if decimal == NSDecimalNumber.notANumber {  // indicates parse error\n                    return NSDecimalNumber.zero\n                }\n                return decimal\n            case .number:\n                return self.object as? NSNumber ?? NSNumber(value: 0)\n            case .bool:\n                return NSNumber(value: self.rawBool ? 1 : 0)\n            default:\n                return NSNumber(value: 0.0)\n            }\n        }\n        set {\n            self.object = newValue\n        }\n    }\n}\n\n// MARK: - Null\n\nextension JSON {\n\n    public var null: NSNull? {\n        get {\n            switch self.type {\n            case .null:\n                return self.rawNull\n            default:\n                return nil\n            }\n        }\n        set {\n            self.object = NSNull()\n        }\n    }\n    public func exists() -> Bool {\n        if let errorValue = error, (400...1000).contains(errorValue.errorCode) {\n            return false\n        }\n        return true\n    }\n}\n\n// MARK: - URL\n\nextension JSON {\n\n    //Optional URL\n    public var url: URL? {\n        get {\n            switch self.type {\n            case .string:\n                // Check for existing percent escapes first to prevent double-escaping of % character\n                if self.rawString.range(of: \"%[0-9A-Fa-f]{2}\", options: .regularExpression, range: nil, locale: nil) != nil {\n                    return Foundation.URL(string: self.rawString)\n                } else if let encodedString_ = self.rawString.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed) {\n                    // We have to use `Foundation.URL` otherwise it conflicts with the variable name.\n                    return Foundation.URL(string: encodedString_)\n                } else {\n                    return nil\n                }\n            default:\n                return nil\n            }\n        }\n        set {\n            self.object = newValue?.absoluteString ?? NSNull()\n        }\n    }\n}\n\n// MARK: - Int, Double, Float, Int8, Int16, Int32, Int64\n\nextension JSON {\n\n    public var double: Double? {\n        get {\n            return self.number?.doubleValue\n        }\n        set {\n            if let newValue = newValue {\n                self.object = NSNumber(value: newValue)\n            } else {\n                self.object = NSNull()\n            }\n        }\n    }\n\n    public var doubleValue: Double {\n        get {\n            return self.numberValue.doubleValue\n        }\n        set {\n            self.object = NSNumber(value: newValue)\n        }\n    }\n\n    public var float: Float? {\n        get {\n            return self.number?.floatValue\n        }\n        set {\n            if let newValue = newValue {\n                self.object = NSNumber(value: newValue)\n            } else {\n                self.object = NSNull()\n            }\n        }\n    }\n\n    public var floatValue: Float {\n        get {\n            return self.numberValue.floatValue\n        }\n        set {\n            self.object = NSNumber(value: newValue)\n        }\n    }\n\n    public var int: Int? {\n        get {\n            return self.number?.intValue\n        }\n        set {\n            if let newValue = newValue {\n                self.object = NSNumber(value: newValue)\n            } else {\n                self.object = NSNull()\n            }\n        }\n    }\n\n    public var intValue: Int {\n        get {\n            return self.numberValue.intValue\n        }\n        set {\n            self.object = NSNumber(value: newValue)\n        }\n    }\n\n    public var uInt: UInt? {\n        get {\n            return self.number?.uintValue\n        }\n        set {\n            if let newValue = newValue {\n                self.object = NSNumber(value: newValue)\n            } else {\n                self.object = NSNull()\n            }\n        }\n    }\n\n    public var uIntValue: UInt {\n        get {\n            return self.numberValue.uintValue\n        }\n        set {\n            self.object = NSNumber(value: newValue)\n        }\n    }\n\n    public var int8: Int8? {\n        get {\n            return self.number?.int8Value\n        }\n        set {\n            if let newValue = newValue {\n                self.object = NSNumber(value: Int(newValue))\n            } else {\n                self.object =  NSNull()\n            }\n        }\n    }\n\n    public var int8Value: Int8 {\n        get {\n            return self.numberValue.int8Value\n        }\n        set {\n            self.object = NSNumber(value: Int(newValue))\n        }\n    }\n\n    public var uInt8: UInt8? {\n        get {\n            return self.number?.uint8Value\n        }\n        set {\n            if let newValue = newValue {\n                self.object = NSNumber(value: newValue)\n            } else {\n                self.object =  NSNull()\n            }\n        }\n    }\n\n    public var uInt8Value: UInt8 {\n        get {\n            return self.numberValue.uint8Value\n        }\n        set {\n            self.object = NSNumber(value: newValue)\n        }\n    }\n\n    public var int16: Int16? {\n        get {\n            return self.number?.int16Value\n        }\n        set {\n            if let newValue = newValue {\n                self.object = NSNumber(value: newValue)\n            } else {\n                self.object =  NSNull()\n            }\n        }\n    }\n\n    public var int16Value: Int16 {\n        get {\n            return self.numberValue.int16Value\n        }\n        set {\n            self.object = NSNumber(value: newValue)\n        }\n    }\n\n    public var uInt16: UInt16? {\n        get {\n            return self.number?.uint16Value\n        }\n        set {\n            if let newValue = newValue {\n                self.object = NSNumber(value: newValue)\n            } else {\n                self.object =  NSNull()\n            }\n        }\n    }\n\n    public var uInt16Value: UInt16 {\n        get {\n            return self.numberValue.uint16Value\n        }\n        set {\n            self.object = NSNumber(value: newValue)\n        }\n    }\n\n    public var int32: Int32? {\n        get {\n            return self.number?.int32Value\n        }\n        set {\n            if let newValue = newValue {\n                self.object = NSNumber(value: newValue)\n            } else {\n                self.object =  NSNull()\n            }\n        }\n    }\n\n    public var int32Value: Int32 {\n        get {\n            return self.numberValue.int32Value\n        }\n        set {\n            self.object = NSNumber(value: newValue)\n        }\n    }\n\n    public var uInt32: UInt32? {\n        get {\n            return self.number?.uint32Value\n        }\n        set {\n            if let newValue = newValue {\n                self.object = NSNumber(value: newValue)\n            } else {\n                self.object =  NSNull()\n            }\n        }\n    }\n\n    public var uInt32Value: UInt32 {\n        get {\n            return self.numberValue.uint32Value\n        }\n        set {\n            self.object = NSNumber(value: newValue)\n        }\n    }\n\n    public var int64: Int64? {\n        get {\n            return self.number?.int64Value\n        }\n        set {\n            if let newValue = newValue {\n                self.object = NSNumber(value: newValue)\n            } else {\n                self.object =  NSNull()\n            }\n        }\n    }\n\n    public var int64Value: Int64 {\n        get {\n            return self.numberValue.int64Value\n        }\n        set {\n            self.object = NSNumber(value: newValue)\n        }\n    }\n\n    public var uInt64: UInt64? {\n        get {\n            return self.number?.uint64Value\n        }\n        set {\n            if let newValue = newValue {\n                self.object = NSNumber(value: newValue)\n            } else {\n                self.object =  NSNull()\n            }\n        }\n    }\n\n    public var uInt64Value: UInt64 {\n        get {\n            return self.numberValue.uint64Value\n        }\n        set {\n            self.object = NSNumber(value: newValue)\n        }\n    }\n}\n\n// MARK: - Comparable\n\nextension JSON: Swift.Comparable {}\n\npublic func == (lhs: JSON, rhs: JSON) -> Bool {\n\n    switch (lhs.type, rhs.type) {\n    case (.number, .number):\n        return lhs.rawNumber == rhs.rawNumber\n    case (.string, .string):\n        return lhs.rawString == rhs.rawString\n    case (.bool, .bool):\n        return lhs.rawBool == rhs.rawBool\n    case (.array, .array):\n        return lhs.rawArray as NSArray == rhs.rawArray as NSArray\n    case (.dictionary, .dictionary):\n        return lhs.rawDictionary as NSDictionary == rhs.rawDictionary as NSDictionary\n    case (.null, .null):\n        return true\n    default:\n        return false\n    }\n}\n\npublic func <= (lhs: JSON, rhs: JSON) -> Bool {\n\n    switch (lhs.type, rhs.type) {\n    case (.number, .number):\n        return lhs.rawNumber <= rhs.rawNumber\n    case (.string, .string):\n        return lhs.rawString <= rhs.rawString\n    case (.bool, .bool):\n        return lhs.rawBool == rhs.rawBool\n    case (.array, .array):\n        return lhs.rawArray as NSArray == rhs.rawArray as NSArray\n    case (.dictionary, .dictionary):\n        return lhs.rawDictionary as NSDictionary == rhs.rawDictionary as NSDictionary\n    case (.null, .null):\n        return true\n    default:\n        return false\n    }\n}\n\npublic func >= (lhs: JSON, rhs: JSON) -> Bool {\n\n    switch (lhs.type, rhs.type) {\n    case (.number, .number):\n        return lhs.rawNumber >= rhs.rawNumber\n    case (.string, .string):\n        return lhs.rawString >= rhs.rawString\n    case (.bool, .bool):\n        return lhs.rawBool == rhs.rawBool\n    case (.array, .array):\n        return lhs.rawArray as NSArray == rhs.rawArray as NSArray\n    case (.dictionary, .dictionary):\n        return lhs.rawDictionary as NSDictionary == rhs.rawDictionary as NSDictionary\n    case (.null, .null):\n        return true\n    default:\n        return false\n    }\n}\n\npublic func > (lhs: JSON, rhs: JSON) -> Bool {\n\n    switch (lhs.type, rhs.type) {\n    case (.number, .number):\n        return lhs.rawNumber > rhs.rawNumber\n    case (.string, .string):\n        return lhs.rawString > rhs.rawString\n    default:\n        return false\n    }\n}\n\npublic func < (lhs: JSON, rhs: JSON) -> Bool {\n\n    switch (lhs.type, rhs.type) {\n    case (.number, .number):\n        return lhs.rawNumber < rhs.rawNumber\n    case (.string, .string):\n        return lhs.rawString < rhs.rawString\n    default:\n        return false\n    }\n}\n\nprivate let trueNumber = NSNumber(value: true)\nprivate let falseNumber = NSNumber(value: false)\nprivate let trueObjCType = String(cString: trueNumber.objCType)\nprivate let falseObjCType = String(cString: falseNumber.objCType)\n\n// MARK: - NSNumber: Comparable\n\nextension NSNumber {\n    fileprivate var isBool: Bool {\n        let objCType = String(cString: self.objCType)\n        if (self.compare(trueNumber) == .orderedSame && objCType == trueObjCType) || (self.compare(falseNumber) == .orderedSame && objCType == falseObjCType) {\n            return true\n        } else {\n            return false\n        }\n    }\n}\n\nfunc == (lhs: NSNumber, rhs: NSNumber) -> Bool {\n    switch (lhs.isBool, rhs.isBool) {\n    case (false, true):\n        return false\n    case (true, false):\n        return false\n    default:\n        return lhs.compare(rhs) == .orderedSame\n    }\n}\n\nfunc != (lhs: NSNumber, rhs: NSNumber) -> Bool {\n    return !(lhs == rhs)\n}\n\nfunc < (lhs: NSNumber, rhs: NSNumber) -> Bool {\n\n    switch (lhs.isBool, rhs.isBool) {\n    case (false, true):\n        return false\n    case (true, false):\n        return false\n    default:\n        return lhs.compare(rhs) == .orderedAscending\n    }\n}\n\nfunc > (lhs: NSNumber, rhs: NSNumber) -> Bool {\n\n    switch (lhs.isBool, rhs.isBool) {\n    case (false, true):\n        return false\n    case (true, false):\n        return false\n    default:\n        return lhs.compare(rhs) == ComparisonResult.orderedDescending\n    }\n}\n\nfunc <= (lhs: NSNumber, rhs: NSNumber) -> Bool {\n\n    switch (lhs.isBool, rhs.isBool) {\n    case (false, true):\n        return false\n    case (true, false):\n        return false\n    default:\n        return lhs.compare(rhs) != .orderedDescending\n    }\n}\n\nfunc >= (lhs: NSNumber, rhs: NSNumber) -> Bool {\n\n    switch (lhs.isBool, rhs.isBool) {\n    case (false, true):\n        return false\n    case (true, false):\n        return false\n    default:\n        return lhs.compare(rhs) != .orderedAscending\n    }\n}\n\npublic enum writingOptionsKeys {\n\tcase jsonSerialization\n\tcase castNilToNSNull\n\tcase maxObjextDepth\n\tcase encoding\n}\n"
  },
  {
    "path": "Pods/TTRangeSlider/LICENSE",
    "content": "Copyright (c) 2015 Tom Thorpe <code@tomthorpe.co.uk>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "Pods/TTRangeSlider/Pod/Classes/TTRangeSlider.h",
    "content": "//\n//  TTRangeSliderView.h\n//\n//  Created by Tom Thorpe\n//\n\n#import <UIKit/UIKit.h>\n#import \"TTRangeSliderDelegate.h\"\n\nIB_DESIGNABLE\n@interface TTRangeSlider : UIControl <UIGestureRecognizerDelegate>\n\n@property (nonatomic, weak) IBOutlet id<TTRangeSliderDelegate> delegate;\n\n/**\n * The minimum possible value to select in the range\n */\n@property (nonatomic, assign) IBInspectable float minValue;\n\n/**\n * The maximum possible value to select in the range\n */\n@property (nonatomic, assign) IBInspectable float maxValue;\n\n/**\n * The preselected minumum value\n * (note: This should be less than the selectedMaximum)\n */\n@property (nonatomic, assign) IBInspectable float selectedMinimum;\n\n/**\n * The preselected maximum value\n * (note: This should be greater than the selectedMinimum)\n */\n@property (nonatomic, assign) IBInspectable float selectedMaximum;\n\n/**\n * Each handle in the slider has a label above it showing the current selected value. By default, this is displayed as a decimal format.\n * You can override this default here by supplying your own NSNumberFormatter. For example, you could supply an NSNumberFormatter that has a currency style, or a prefix or suffix.\n * If this property is nil, the default decimal format will be used. Note: If you want no labels at all, please use the hideLabels flag. */\n@property (nonatomic, strong) NSNumberFormatter *numberFormatterOverride;\n\n/**\n * Hides the labels above the slider controls. YES = labels will be hidden. NO = labels will be shown. Default is NO.\n */\n@property (nonatomic, assign) IBInspectable BOOL hideLabels;\n\n/**\n * The color of the minimum value text label. If not set, the default is the tintColor.\n */\n@property (nonatomic, strong) IBInspectable UIColor *minLabelColour;\n\n/**\n * The color of the maximum value text label. If not set, the default is the tintColor.\n */\n@property (nonatomic, strong) IBInspectable UIColor *maxLabelColour;\n\n\n/**\n * The font of the minimum value text label. If not set, the default is system font size 12.\n */\n@property (nonatomic, strong) IBInspectable UIFont *minLabelFont;\n\n/**\n * The font of the maximum value text label. If not set, the default is system font size 12.\n */\n@property (nonatomic, strong) IBInspectable UIFont *maxLabelFont;\n\n/**\n * The label displayed in accessibility mode for minimum value handler\n */\n@property (nonatomic, strong) IBInspectable NSString *minLabelAccessibilityLabel;\n\n/**\n * The label displayed in accessibility mode for maximum value handler\n */\n@property (nonatomic, strong) IBInspectable NSString *maxLabelAccessibilityLabel;\n\n/**\n * The brief description displayed in accessibility mode for minimum value handler\n */\n@property (nonatomic, strong) IBInspectable NSString *minLabelAccessibilityHint;\n\n/**\n * The brief description displayed in accessibility mode for maximum value handler\n */\n@property (nonatomic, strong) IBInspectable NSString *maxLabelAccessibilityHint;\n\n/**\n * If true, the control will mimic a normal slider and have only one handle rather than a range.\n * In this case, the selectedMinValue will be not functional anymore. Use selectedMaxValue instead to determine the value the user has selected.\n */\n@property (nonatomic, assign) IBInspectable BOOL disableRange;\n\n@property (nonatomic, assign) IBInspectable float minDistance;\n\n@property (nonatomic, assign) IBInspectable float maxDistance;\n\n/**\n * If true the control will snap to point at each step between minValue and maxValue\n */\n@property (nonatomic, assign) IBInspectable BOOL enableStep;\n\n/**\n * The step value, this control the value of each step. If not set the default is 0.1.\n * (note: this is ignored if <= 0.0)\n */\n@property (nonatomic, assign) IBInspectable float step;\n\n/**\n *Set padding between label and handle (default 8.0)\n */\n@property (nonatomic, assign) IBInspectable CGFloat labelPadding;\n\n/**\n *Handle slider with custom image, you can set custom image for your handle\n */\n@property (nonatomic, strong) UIImage *handleImage;\n\n/**\n *Handle slider with custom color, you can set custom color for your handle\n */\n@property (nonatomic, strong) UIColor *handleColor;\n\n/**\n *Handle slider with custom border color, you can set custom border color for your handle\n */\n@property (nonatomic, strong) UIColor *handleBorderColor;\n\n/**\n *Handle border width (default 0.0)\n */\n@property (nonatomic, assign) CGFloat handleBorderWidth;\n\n/**\n *Handle diameter (default 16.0)\n */\n@property (nonatomic, assign) CGFloat handleDiameter;\n\n/**\n *Selected handle diameter multiplier (default 1.7)\n */\n@property (nonatomic, assign) CGFloat selectedHandleDiameterMultiplier;\n\n/**\n *Set slider line tint color between handles\n */\n@property (nonatomic, strong) UIColor *tintColorBetweenHandles;\n\n/**\n *Set the slider line height (default 1.0)\n */\n@property (nonatomic, assign) CGFloat lineHeight;\n\n@end\n"
  },
  {
    "path": "Pods/TTRangeSlider/Pod/Classes/TTRangeSlider.m",
    "content": "//\n//  TTRangeSlider.m\n//\n//  Created by Tom Thorpe\n\n#import \"TTRangeSlider.h\"\n\nconst int HANDLE_TOUCH_AREA_EXPANSION = -30; //expand the touch area of the handle by this much (negative values increase size) so that you don't have to touch right on the handle to activate it.\nconst float TEXT_HEIGHT = 14;\n\n@interface TTRangeSlider ()\n\n@property (nonatomic, strong) CALayer *sliderLine;\n@property (nonatomic, strong) CALayer *sliderLineBetweenHandles;\n\n@property (nonatomic, strong) CALayer *leftHandle;\n@property (nonatomic, assign) BOOL leftHandleSelected;\n@property (nonatomic, strong) CALayer *rightHandle;\n@property (nonatomic, assign) BOOL rightHandleSelected;\n\n@property (nonatomic, strong) CATextLayer *minLabel;\n@property (nonatomic, strong) CATextLayer *maxLabel;\n\n@property (nonatomic, assign) CGSize minLabelTextSize;\n@property (nonatomic, assign) CGSize maxLabelTextSize;\n\n@property (nonatomic, strong) NSNumberFormatter *decimalNumberFormatter; // Used to format values if formatType is YLRangeSliderFormatTypeDecimal\n\n// strong reference needed for UIAccessibilityContainer\n// see http://stackoverflow.com/questions/13462046/custom-uiview-not-showing-accessibility-on-voice-over\n@property (nonatomic, strong) NSMutableArray *accessibleElements;\n\n@end\n\nstatic const CGFloat kLabelsFontSize = 12.0f;\n\n@implementation TTRangeSlider\n\n//do all the setup in a common place, as there can be two initialisers called depending on if storyboards or code are used. The designated initialiser isn't always called :|\n- (void)initialiseControl {\n    //defaults:\n    _minValue = 0;\n    _selectedMinimum = 10;\n    _maxValue = 100;\n    _selectedMaximum  = 90;\n\n    _minDistance = -1;\n    _maxDistance = -1;\n\n    _enableStep = NO;\n    _step = 0.1f;\n\n    _hideLabels = NO;\n    \n    _handleDiameter = 16.0;\n    _selectedHandleDiameterMultiplier = 1.7;\n    \n    _lineHeight = 1.0;\n    \n    _handleBorderWidth = 0.0;\n    _handleBorderColor = self.tintColor;\n    \n    _labelPadding = 8.0;\n    \n    //draw the slider line\n    self.sliderLine = [CALayer layer];\n    self.sliderLine.backgroundColor = self.tintColor.CGColor;\n    [self.layer addSublayer:self.sliderLine];\n    \n    //draw the track distline\n    self.sliderLineBetweenHandles = [CALayer layer];\n    self.sliderLineBetweenHandles.backgroundColor = self.tintColor.CGColor;\n    [self.layer addSublayer:self.sliderLineBetweenHandles];\n\n    //draw the minimum slider handle\n    self.leftHandle = [CALayer layer];\n    self.leftHandle.cornerRadius = self.handleDiameter / 2;\n    self.leftHandle.backgroundColor = self.tintColor.CGColor;\n    self.leftHandle.borderWidth = self.handleBorderWidth;\n    self.leftHandle.borderColor = self.handleBorderColor.CGColor;\n    [self.layer addSublayer:self.leftHandle];\n\n    //draw the maximum slider handle\n    self.rightHandle = [CALayer layer];\n    self.rightHandle.cornerRadius = self.handleDiameter / 2;\n    self.rightHandle.backgroundColor = self.tintColor.CGColor;\n    self.rightHandle.borderWidth = self.handleBorderWidth;\n    self.rightHandle.borderColor = self.handleBorderColor.CGColor;\n    [self.layer addSublayer:self.rightHandle];\n\n    self.leftHandle.frame = CGRectMake(0, 0, self.handleDiameter, self.handleDiameter);\n    self.rightHandle.frame = CGRectMake(0, 0, self.handleDiameter, self.handleDiameter);\n\n    //draw the text labels\n    self.minLabel = [[CATextLayer alloc] init];\n    self.minLabel.alignmentMode = kCAAlignmentCenter;\n    self.minLabel.fontSize = kLabelsFontSize;\n    self.minLabel.frame = CGRectMake(0, 0, 75, TEXT_HEIGHT);\n    self.minLabel.contentsScale = [UIScreen mainScreen].scale;\n    self.minLabel.contentsScale = [UIScreen mainScreen].scale;\n    if (self.minLabelColour == nil){\n        self.minLabel.foregroundColor = self.tintColor.CGColor;\n    } else {\n        self.minLabel.foregroundColor = self.minLabelColour.CGColor;\n    }\n    self.minLabelFont = [UIFont systemFontOfSize:kLabelsFontSize];\n    [self.layer addSublayer:self.minLabel];\n\n    self.maxLabel = [[CATextLayer alloc] init];\n    self.maxLabel.alignmentMode = kCAAlignmentCenter;\n    self.maxLabel.fontSize = kLabelsFontSize;\n    self.maxLabel.frame = CGRectMake(0, 0, 75, TEXT_HEIGHT);\n    self.maxLabel.contentsScale = [UIScreen mainScreen].scale;\n    if (self.maxLabelColour == nil){\n        self.maxLabel.foregroundColor = self.tintColor.CGColor;\n    } else {\n        self.maxLabel.foregroundColor = self.maxLabelColour.CGColor;\n    }\n    self.maxLabelFont = [UIFont systemFontOfSize:kLabelsFontSize];\n    [self.layer addSublayer:self.maxLabel];\n\n    // TODO Create a bundle that allows localization of default accessibility labels and hints\n    if (!self.minLabelAccessibilityLabel || self.minLabelAccessibilityLabel.length == 0) {\n      self.minLabelAccessibilityLabel = @\"Left Handle\";\n    }\n  \n    if (!self.minLabelAccessibilityHint || self.minLabelAccessibilityHint.length == 0) {\n      self.minLabelAccessibilityHint = @\"Minimum value in slider\";\n    }\n  \n    if (!self.maxLabelAccessibilityLabel || self.maxLabelAccessibilityLabel.length == 0) {\n      self.maxLabelAccessibilityLabel = @\"Right Handle\";\n    }\n  \n    if (!self.maxLabelAccessibilityHint || self.maxLabelAccessibilityHint.length == 0) {\n      self.maxLabelAccessibilityHint = @\"Maximum value in slider\";\n    }\n  \n    [self refresh];\n}\n\n- (void)layoutSubviews {\n    [super layoutSubviews];\n\n    //positioning for the slider line\n    float barSidePadding = 16.0f;\n    CGRect currentFrame = self.frame;\n    float yMiddle = currentFrame.size.height/2.0;\n    CGPoint lineLeftSide = CGPointMake(barSidePadding, yMiddle);\n    CGPoint lineRightSide = CGPointMake(currentFrame.size.width-barSidePadding, yMiddle);\n    self.sliderLine.frame = CGRectMake(lineLeftSide.x, lineLeftSide.y, lineRightSide.x-lineLeftSide.x, self.lineHeight);\n    \n    self.sliderLine.cornerRadius = self.lineHeight / 2.0;\n\n    [self updateLabelValues];\n    [self updateHandlePositions];\n    [self updateLabelPositions];\n}\n\n- (id)initWithCoder:(NSCoder *)aCoder\n{\n    self = [super initWithCoder:aCoder];\n\n    if(self)\n    {\n        [self initialiseControl];\n    }\n    return self;\n}\n\n-  (id)initWithFrame:(CGRect)aRect\n{\n    self = [super initWithFrame:aRect];\n\n    if (self)\n    {\n        [self initialiseControl];\n    }\n\n    return self;\n}\n\n- (CGSize)intrinsicContentSize{\n    return CGSizeMake(UIViewNoIntrinsicMetric, 65);\n}\n\n\n- (void)tintColorDidChange {\n    CGColorRef color = self.tintColor.CGColor;\n\n    [CATransaction begin];\n    [CATransaction setAnimationDuration:0.5];\n    [CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut] ];\n    self.sliderLine.backgroundColor = color;\n    if (self.handleColor == nil) {\n        self.leftHandle.backgroundColor = color;\n        self.rightHandle.backgroundColor = color;\n    }\n\n    if (self.minLabelColour == nil){\n        self.minLabel.foregroundColor = color;\n    }\n    if (self.maxLabelColour == nil){\n        self.maxLabel.foregroundColor = color;\n    }\n    [CATransaction commit];\n}\n\n- (float)getPercentageAlongLineForValue:(float) value {\n    if (self.minValue == self.maxValue){\n        return 0; //stops divide by zero errors where maxMinDif would be zero. If the min and max are the same the percentage has no point.\n    }\n\n    //get the difference between the maximum and minimum values (e.g if max was 100, and min was 50, difference is 50)\n    float maxMinDif = self.maxValue - self.minValue;\n\n    //now subtract value from the minValue (e.g if value is 75, then 75-50 = 25)\n    float valueSubtracted = value - self.minValue;\n\n    //now divide valueSubtracted by maxMinDif to get the percentage (e.g 25/50 = 0.5)\n    return valueSubtracted / maxMinDif;\n}\n\n- (float)getXPositionAlongLineForValue:(float) value {\n    //first get the percentage along the line for the value\n    float percentage = [self getPercentageAlongLineForValue:value];\n\n    //get the difference between the maximum and minimum coordinate position x values (e.g if max was x = 310, and min was x=10, difference is 300)\n    float maxMinDif = CGRectGetMaxX(self.sliderLine.frame) - CGRectGetMinX(self.sliderLine.frame);\n\n    //now multiply the percentage by the minMaxDif to see how far along the line the point should be, and add it onto the minimum x position.\n    float offset = percentage * maxMinDif;\n\n    return CGRectGetMinX(self.sliderLine.frame) + offset;\n}\n\n- (void)updateLabelValues {\n    if (self.hideLabels || [self.numberFormatterOverride isEqual:[NSNull null]]){\n        self.minLabel.string = @\"\";\n        self.maxLabel.string = @\"\";\n        return;\n    }\n\n    NSNumberFormatter *formatter = (self.numberFormatterOverride != nil) ? self.numberFormatterOverride : self.decimalNumberFormatter;\n\n    self.minLabel.string = [formatter stringFromNumber:@(self.selectedMinimum)];\n    self.maxLabel.string = [formatter stringFromNumber:@(self.selectedMaximum)];\n    \n    self.minLabelTextSize = [self.minLabel.string sizeWithAttributes:@{NSFontAttributeName:self.minLabelFont}];\n    self.maxLabelTextSize = [self.maxLabel.string sizeWithAttributes:@{NSFontAttributeName:self.maxLabelFont}];\n}\n\n- (void)updateAccessibilityElements {\n  [_accessibleElements removeAllObjects];\n  [_accessibleElements addObject:[self leftHandleAccessibilityElement]];\n  [_accessibleElements addObject:[self rightHandleAccessbilityElement]];\n}\n\n#pragma mark - Set Positions\n- (void)updateHandlePositions {\n    CGPoint leftHandleCenter = CGPointMake([self getXPositionAlongLineForValue:self.selectedMinimum], CGRectGetMidY(self.sliderLine.frame));\n    self.leftHandle.position = leftHandleCenter;\n\n    CGPoint rightHandleCenter = CGPointMake([self getXPositionAlongLineForValue:self.selectedMaximum], CGRectGetMidY(self.sliderLine.frame));\n    self.rightHandle.position= rightHandleCenter;\n    \n    //positioning for the dist slider line\n    self.sliderLineBetweenHandles.frame = CGRectMake(self.leftHandle.position.x, self.sliderLine.frame.origin.y, self.rightHandle.position.x-self.leftHandle.position.x, self.lineHeight);\n}\n\n- (void)updateLabelPositions {\n    //the centre points for the labels are X = the same x position as the relevant handle. Y = the y position of the handle minus half the height of the text label, minus some padding.\n    float padding = self.labelPadding;\n    float minSpacingBetweenLabels = 8.0f;\n\n    CGPoint leftHandleCentre = [self getCentreOfRect:self.leftHandle.frame];\n    CGPoint newMinLabelCenter = CGPointMake(leftHandleCentre.x, self.leftHandle.frame.origin.y - (self.minLabel.frame.size.height/2) - padding);\n\n    CGPoint rightHandleCentre = [self getCentreOfRect:self.rightHandle.frame];\n    CGPoint newMaxLabelCenter = CGPointMake(rightHandleCentre.x, self.rightHandle.frame.origin.y - (self.maxLabel.frame.size.height/2) - padding);\n\n    CGSize minLabelTextSize = self.minLabelTextSize;\n    CGSize maxLabelTextSize = self.maxLabelTextSize;\n    \n    \n    self.minLabel.frame = CGRectMake(0, 0, minLabelTextSize.width, minLabelTextSize.height);\n    self.maxLabel.frame = CGRectMake(0, 0, maxLabelTextSize.width, maxLabelTextSize.height);\n\n    float newLeftMostXInMaxLabel = newMaxLabelCenter.x - maxLabelTextSize.width/2;\n    float newRightMostXInMinLabel = newMinLabelCenter.x + minLabelTextSize.width/2;\n    float newSpacingBetweenTextLabels = newLeftMostXInMaxLabel - newRightMostXInMinLabel;\n\n    if (self.disableRange == YES || newSpacingBetweenTextLabels > minSpacingBetweenLabels) {\n        self.minLabel.position = newMinLabelCenter;\n        self.maxLabel.position = newMaxLabelCenter;\n    }\n    else {\n        float increaseAmount = minSpacingBetweenLabels - newSpacingBetweenTextLabels;\n        newMinLabelCenter = CGPointMake(newMinLabelCenter.x - increaseAmount/2, newMinLabelCenter.y);\n        newMaxLabelCenter = CGPointMake(newMaxLabelCenter.x + increaseAmount/2, newMaxLabelCenter.y);\n        self.minLabel.position = newMinLabelCenter;\n        self.maxLabel.position = newMaxLabelCenter;\n\n        //Update x if they are still in the original position\n        if (self.minLabel.position.x == self.maxLabel.position.x && self.leftHandle != nil) {\n            self.minLabel.position = CGPointMake(leftHandleCentre.x, self.minLabel.position.y);\n            self.maxLabel.position = CGPointMake(leftHandleCentre.x + self.minLabel.frame.size.width/2 + minSpacingBetweenLabels + self.maxLabel.frame.size.width/2, self.maxLabel.position.y);\n        }\n    }\n}\n\n#pragma mark - Touch Tracking\n\n\n- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {\n    CGPoint gesturePressLocation = [touch locationInView:self];\n\n    if (CGRectContainsPoint(CGRectInset(self.leftHandle.frame, HANDLE_TOUCH_AREA_EXPANSION, HANDLE_TOUCH_AREA_EXPANSION), gesturePressLocation) || CGRectContainsPoint(CGRectInset(self.rightHandle.frame, HANDLE_TOUCH_AREA_EXPANSION, HANDLE_TOUCH_AREA_EXPANSION), gesturePressLocation))\n    {\n        //the touch was inside one of the handles so we're definitely going to start movign one of them. But the handles might be quite close to each other, so now we need to find out which handle the touch was closest too, and activate that one.\n        float distanceFromLeftHandle = [self distanceBetweenPoint:gesturePressLocation andPoint:[self getCentreOfRect:self.leftHandle.frame]];\n        float distanceFromRightHandle =[self distanceBetweenPoint:gesturePressLocation andPoint:[self getCentreOfRect:self.rightHandle.frame]];\n\n        if (distanceFromLeftHandle < distanceFromRightHandle && self.disableRange == NO){\n            self.leftHandleSelected = YES;\n            [self animateHandle:self.leftHandle withSelection:YES];\n        } else {\n            if (self.selectedMaximum == self.maxValue && [self getCentreOfRect:self.leftHandle.frame].x == [self getCentreOfRect:self.rightHandle.frame].x) {\n                self.leftHandleSelected = YES;\n                [self animateHandle:self.leftHandle withSelection:YES];\n            }\n            else {\n                self.rightHandleSelected = YES;\n                [self animateHandle:self.rightHandle withSelection:YES];\n            }\n        }\n\n        if ([self.delegate respondsToSelector:@selector(didStartTouchesInRangeSlider:)]){\n            [self.delegate didStartTouchesInRangeSlider:self];\n        }\n\n        return YES;\n    } else {\n        return NO;\n    }\n}\n\n- (void)refresh {\n\n    if (self.enableStep && self.step>=0.0f){\n        _selectedMinimum = roundf(self.selectedMinimum/self.step)*self.step;\n        _selectedMaximum = roundf(self.selectedMaximum/self.step)*self.step;\n    }\n\n    float diff = self.selectedMaximum - self.selectedMinimum;\n\n    if (self.minDistance != -1 && diff < self.minDistance) {\n        if(self.leftHandleSelected){\n            _selectedMinimum = self.selectedMaximum - self.minDistance;\n        }else{\n            _selectedMaximum = self.selectedMinimum + self.minDistance;\n        }\n    }else if(self.maxDistance != -1 && diff > self.maxDistance){\n\n        if(self.leftHandleSelected){\n            _selectedMinimum = self.selectedMaximum - self.maxDistance;\n        }else if(self.rightHandleSelected){\n            _selectedMaximum = self.selectedMinimum + self.maxDistance;\n        }\n    }\n\n    //ensure the minimum and maximum selected values are within range. Access the values directly so we don't cause this refresh method to be called again (otherwise changing the properties causes a refresh)\n    if (self.selectedMinimum < self.minValue){\n        _selectedMinimum = self.minValue;\n    }\n    if (self.selectedMaximum > self.maxValue){\n        _selectedMaximum = self.maxValue;\n    }\n\n    //update the frames in a transaction so that the tracking doesn't continue until the frame has moved.\n    [CATransaction begin];\n    [CATransaction setDisableActions:YES] ;\n    [self updateHandlePositions];\n    [self updateLabelPositions];\n    [CATransaction commit];\n    [self updateLabelValues];\n    [self updateAccessibilityElements];\n\n    //update the delegate\n    if (self.delegate && (self.leftHandleSelected || self.rightHandleSelected)){\n        [self.delegate rangeSlider:self didChangeSelectedMinimumValue:self.selectedMinimum andMaximumValue:self.selectedMaximum];\n    }\n}\n\n- (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {\n\n    CGPoint location = [touch locationInView:self];\n\n    //find out the percentage along the line we are in x coordinate terms (subtracting half the frames width to account for moving the middle of the handle, not the left hand side)\n    float percentage = ((location.x-CGRectGetMinX(self.sliderLine.frame)) - self.handleDiameter/2) / (CGRectGetMaxX(self.sliderLine.frame) - CGRectGetMinX(self.sliderLine.frame));\n\n    //multiply that percentage by self.maxValue to get the new selected minimum value\n    float selectedValue = percentage * (self.maxValue - self.minValue) + self.minValue;\n\n    if (self.leftHandleSelected)\n    {\n        if (selectedValue < self.selectedMaximum){\n            self.selectedMinimum = selectedValue;\n        }\n        else {\n            self.selectedMinimum = self.selectedMaximum;\n        }\n\n    }\n    else if (self.rightHandleSelected)\n    {\n        if (selectedValue > self.selectedMinimum || (self.disableRange && selectedValue >= self.minValue)){ //don't let the dots cross over, (unless range is disabled, in which case just dont let the dot fall off the end of the screen)\n            self.selectedMaximum = selectedValue;\n        }\n        else {\n            self.selectedMaximum = self.selectedMinimum;\n        }\n    }\n\n    //no need to refresh the view because it is done as a sideeffect of setting the property\n\n    return YES;\n}\n\n- (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {\n    if (self.leftHandleSelected){\n        self.leftHandleSelected = NO;\n        [self animateHandle:self.leftHandle withSelection:NO];\n    } else {\n        self.rightHandleSelected = NO;\n        [self animateHandle:self.rightHandle withSelection:NO];\n    }\n    if ([self.delegate respondsToSelector:@selector(didEndTouchesInRangeSlider:)]) {\n        [self.delegate didEndTouchesInRangeSlider:self];\n    }\n}\n\n#pragma mark - Animation\n- (void)animateHandle:(CALayer*)handle withSelection:(BOOL)selected {\n    if (selected){\n        [CATransaction begin];\n        [CATransaction setAnimationDuration:0.3];\n        [CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut] ];\n        handle.transform = CATransform3DMakeScale(self.selectedHandleDiameterMultiplier, self.selectedHandleDiameterMultiplier, 1);\n\n        //the label above the handle will need to move too if the handle changes size\n        [self updateLabelPositions];\n\n        [CATransaction setCompletionBlock:^{\n        }];\n        [CATransaction commit];\n\n    } else {\n        [CATransaction begin];\n        [CATransaction setAnimationDuration:0.3];\n        [CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut] ];\n        handle.transform = CATransform3DIdentity;\n\n        //the label above the handle will need to move too if the handle changes size\n        [self updateLabelPositions];\n\n        [CATransaction commit];\n    }\n}\n\n#pragma mark - Calculating nearest handle to point\n- (float)distanceBetweenPoint:(CGPoint)point1 andPoint:(CGPoint)point2\n{\n    CGFloat xDist = (point2.x - point1.x);\n    CGFloat yDist = (point2.y - point1.y);\n    return sqrt((xDist * xDist) + (yDist * yDist));\n}\n\n- (CGPoint)getCentreOfRect:(CGRect)rect\n{\n    return CGPointMake(CGRectGetMidX(rect), CGRectGetMidY(rect));\n}\n\n\n#pragma mark - Properties\n-(void)setTintColor:(UIColor *)tintColor{\n    [super setTintColor:tintColor];\n\n    struct CGColor *color = self.tintColor.CGColor;\n\n    [CATransaction begin];\n    [CATransaction setAnimationDuration:0.5];\n    [CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut] ];\n    self.sliderLine.backgroundColor = color;\n\n    if (self.minLabelColour == nil){\n        self.minLabel.foregroundColor = color;\n    }\n    if (self.maxLabelColour == nil){\n        self.maxLabel.foregroundColor = color;\n    }\n    [CATransaction commit];\n}\n\n- (void)setDisableRange:(BOOL)disableRange {\n    _disableRange = disableRange;\n    if (_disableRange){\n        self.leftHandle.hidden = YES;\n        self.minLabel.hidden = YES;\n    } else {\n        self.leftHandle.hidden = NO;\n    }\n}\n\n- (NSNumberFormatter *)decimalNumberFormatter {\n    if (!_decimalNumberFormatter){\n        _decimalNumberFormatter = [[NSNumberFormatter alloc] init];\n        _decimalNumberFormatter.numberStyle = NSNumberFormatterDecimalStyle;\n        _decimalNumberFormatter.maximumFractionDigits = 0;\n    }\n    return _decimalNumberFormatter;\n}\n\n- (void)setMinValue:(float)minValue {\n    _minValue = minValue;\n    [self refresh];\n}\n\n- (void)setMaxValue:(float)maxValue {\n    _maxValue = maxValue;\n    [self refresh];\n}\n\n- (void)setSelectedMinimum:(float)selectedMinimum {\n    if (selectedMinimum < self.minValue){\n        selectedMinimum = self.minValue;\n    }\n\n    _selectedMinimum = selectedMinimum;\n    [self refresh];\n}\n\n- (void)setSelectedMaximum:(float)selectedMaximum {\n    if (selectedMaximum > self.maxValue){\n        selectedMaximum = self.maxValue;\n    }\n\n    _selectedMaximum = selectedMaximum;\n    [self refresh];\n}\n\n-(void)setMinLabelColour:(UIColor *)minLabelColour{\n    _minLabelColour = minLabelColour;\n    self.minLabel.foregroundColor = _minLabelColour.CGColor;\n}\n\n-(void)setMaxLabelColour:(UIColor *)maxLabelColour{\n    _maxLabelColour = maxLabelColour;\n    self.maxLabel.foregroundColor = _maxLabelColour.CGColor;\n}\n\n-(void)setMinLabelFont:(UIFont *)minLabelFont{\n    _minLabelFont = minLabelFont;\n    self.minLabel.font = (__bridge CFTypeRef)_minLabelFont.fontName;\n    self.minLabel.fontSize = _minLabelFont.pointSize;\n}\n\n-(void)setMaxLabelFont:(UIFont *)maxLabelFont{\n    _maxLabelFont = maxLabelFont;\n    self.maxLabel.font = (__bridge CFTypeRef)_maxLabelFont.fontName;\n    self.maxLabel.fontSize = _maxLabelFont.pointSize;\n}\n\n-(void)setNumberFormatterOverride:(NSNumberFormatter *)numberFormatterOverride{\n    _numberFormatterOverride = numberFormatterOverride;\n    [self updateLabelValues];\n}\n\n-(void)setHandleImage:(UIImage *)handleImage{\n    _handleImage = handleImage;\n    \n    CGRect startFrame = CGRectMake(0.0, 0.0, 31, 32);\n    self.leftHandle.contents = (id)handleImage.CGImage;\n    self.leftHandle.frame = startFrame;\n    \n    self.rightHandle.contents = (id)handleImage.CGImage;\n    self.rightHandle.frame = startFrame;\n    \n    //Force layer background to transparant\n    self.leftHandle.backgroundColor = [[UIColor clearColor] CGColor];\n    self.rightHandle.backgroundColor = [[UIColor clearColor] CGColor];\n}\n\n-(void)setHandleColor:(UIColor *)handleColor{\n    _handleColor = handleColor;\n    self.leftHandle.backgroundColor = [handleColor CGColor];\n    self.rightHandle.backgroundColor = [handleColor CGColor];\n}\n\n-(void)setHandleBorderColor:(UIColor *)handleBorderColor{\n    _handleBorderColor = handleBorderColor;\n    self.leftHandle.borderColor = [handleBorderColor CGColor];\n    self.rightHandle.borderColor = [handleBorderColor CGColor];\n}\n\n-(void)setHandleBorderWidth:(CGFloat)handleBorderWidth{\n    _handleBorderWidth = handleBorderWidth;\n    self.leftHandle.borderWidth = handleBorderWidth;\n    self.rightHandle.borderWidth = handleBorderWidth;\n}\n\n-(void)setHandleDiameter:(CGFloat)handleDiameter{\n    _handleDiameter = handleDiameter;\n    \n    self.leftHandle.cornerRadius = self.handleDiameter / 2;\n    self.rightHandle.cornerRadius = self.handleDiameter / 2;\n    \n    self.leftHandle.frame = CGRectMake(0, 0, self.handleDiameter, self.handleDiameter);\n    self.rightHandle.frame = CGRectMake(0, 0, self.handleDiameter, self.handleDiameter);\n\n}\n\n-(void)setTintColorBetweenHandles:(UIColor *)tintColorBetweenHandles{\n    _tintColorBetweenHandles = tintColorBetweenHandles;\n    self.sliderLineBetweenHandles.backgroundColor = [tintColorBetweenHandles CGColor];\n}\n\n-(void)setLineHeight:(CGFloat)lineHeight{\n    _lineHeight = lineHeight;\n    [self setNeedsLayout];\n}\n\n-(void)setLabelPadding:(CGFloat)labelPadding {\n    _labelPadding = labelPadding;\n    [self updateLabelPositions];\n}\n\n#pragma mark - UIAccessibility\n\n- (BOOL)isAccessibilityElement\n{\n  return NO;\n}\n\n#pragma mark - UIAccessibilityContainer Protocol\n\n- (NSArray *)accessibleElements\n{\n  if(_accessibleElements != nil) {\n    return _accessibleElements;\n  }\n  \n  _accessibleElements = [[NSMutableArray alloc] init];\n  [_accessibleElements addObject:[self leftHandleAccessibilityElement]];\n  [_accessibleElements addObject:[self rightHandleAccessbilityElement]];\n  \n  return _accessibleElements;\n}\n\n- (NSInteger)accessibilityElementCount\n{\n  return [[self accessibleElements] count];\n}\n\n- (id)accessibilityElementAtIndex:(NSInteger)index\n{\n  return [[self accessibleElements] objectAtIndex:index];\n}\n\n- (NSInteger)indexOfAccessibilityElement:(id)element\n{\n  return [[self accessibleElements] indexOfObject:element];\n}\n\n- (UIAccessibilityElement *)leftHandleAccessibilityElement\n{\n  UIAccessibilityElement *element = [[UIAccessibilityElement alloc] initWithAccessibilityContainer:self];\n  element.isAccessibilityElement = YES;\n  element.accessibilityLabel = self.minLabelAccessibilityLabel;\n  element.accessibilityHint = self.minLabelAccessibilityHint;\n  element.accessibilityValue = self.minLabel.string;\n  element.accessibilityFrame = [self convertRect:self.leftHandle.frame toView:nil];\n  element.accessibilityTraits = UIAccessibilityTraitAdjustable;\n  return element;\n}\n\n- (UIAccessibilityElement *)rightHandleAccessbilityElement\n{\n  UIAccessibilityElement *element = [[UIAccessibilityElement alloc] initWithAccessibilityContainer:self];\n  element.isAccessibilityElement = YES;\n  element.accessibilityLabel = self.maxLabelAccessibilityLabel;\n  element.accessibilityHint = self.maxLabelAccessibilityHint;\n  element.accessibilityValue = self.maxLabel.string;\n  element.accessibilityFrame = [self convertRect:self.rightHandle.frame toView:nil];\n  element.accessibilityTraits = UIAccessibilityTraitAdjustable;\n  return element;\n}\n\n@end\n"
  },
  {
    "path": "Pods/TTRangeSlider/Pod/Classes/TTRangeSliderDelegate.h",
    "content": "//\n//  YLRangeSliderViewDelegate.h\n//  FantasyRealFootball\n//\n//  Created by Tom Thorpe on 16/04/2014.\n//  Copyright (c) 2014 Yahoo inc. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n@class TTRangeSlider;\n\n@protocol TTRangeSliderDelegate <NSObject>\n\n/**\n * Called when the RangeSlider values are changed\n */\n-(void)rangeSlider:(TTRangeSlider *)sender didChangeSelectedMinimumValue:(float)selectedMinimum andMaximumValue:(float)selectedMaximum;\n\n@optional\n\n/**\n * Called when the user has finished interacting with the RangeSlider\n */\n- (void)didEndTouchesInRangeSlider:(TTRangeSlider *)sender;\n\n/**\n * Called when the user has started interacting with the RangeSlider\n */\n- (void)didStartTouchesInRangeSlider:(TTRangeSlider *)sender;\n\n@end\n"
  },
  {
    "path": "Pods/TTRangeSlider/README.md",
    "content": "# TTRangeSlider\n[![Build Status](https://travis-ci.org/TomThorpe/TTRangeSlider.svg?branch=master)](https://travis-ci.org/TomThorpe/TTRangeSlider) [![Version](https://img.shields.io/cocoapods/v/TTRangeSlider.svg?style=flat)](http://cocoadocs.org/docsets/TTRangeSlider)\n[![License](https://img.shields.io/cocoapods/l/TTRangeSlider.svg?style=flat)](http://cocoadocs.org/docsets/TTRangeSlider)\n[![Platform](https://img.shields.io/cocoapods/p/TTRangeSlider.svg?style=flat)](http://cocoadocs.org/docsets/TTRangeSlider)\n\nA slider, similar in style to UISlider, but which allows you to pick a minimum and maximum range.\n\n![Screenshot](Example/TTRangeSlider.gif)\n## Installation\nTTRangeSlider is available through [CocoaPods](http://cocoapods.org). To install\nit, simply add the following line to your Podfile:\n\n```ruby\npod \"TTRangeSlider\"\n```\n\nNote that this control uses IB_DESIGNABLE, so for it to work well and not get warnings in Interface Builder, you should use the latest version of CocoaPods, and add the `use_frameworks!` line. So your podfile may look something like\n\n```ruby\nsource 'https://github.com/CocoaPods/Specs.git'\nuse_frameworks!\n\npod “TTRangeSlider”\n```\n\n## Usage\n\nAdd the TTRangeSlider like you would with any other UIControl. Either:\n* Add a view in your storyboard/class and change it’s type to `TTRangeSlider`. As long as you’re using >= XCode6 you can now use this control like any other, you can set all the properties in the Attributes Inspector and see a live preview:\n\n![Interface Builder Screenshot](Example/interfacebuilder.png)\n\nor\n* Create the `TTRangeSlider` in code using `[TTRangeSlider alloc] init]` then add it as a subview to your code and set the relevant autolayout properties or frame.\n\nThe default slider ranges from 0->100 and has 10 preselected as the minimum, and 90 as the maximum. \n\nValues that the user has selected are exposed using the `selectedMinimum` and `selectedMaximum` properties. You can also use these properties to change the selected values programatically if you wish.\n\nOther customisation of the control is done using the following properties:\n#### `tintColor`\nThe tintColor property (which you can also set in Interface Builder) sets the overall colour of the control, including the colour of the line, the two handles, and the labels.\n\nIt is safe to change the `tintColor` at any time, if the control is currently visible the colour change will be animated into the new colour.\n#### `tintColorBetweenHandles`\nThe tintColorBetweenHandles property sets the color of the line between the two handles.\n#### `minValue`\nThe minimum possible value to select in the range\n#### `maxValue`\nThe maximum possible value to select in the range\n#### `selectedMinimum`\nThe preselected minumum value (note: This should be less than the selectedMaximum)\n#### `selectedMaximum`\nThe preselected maximum value (note: This should be greater than the selectedMinimum)\n#### `numberFormatterOverride`\nEach handle in the slider has a label above it showing the current selected value. By default, this is displayed as a decimal format.\n#### `hideLabels`\nWhen set to `YES` the labesl above the slider controls will be hidden. Default is NO.\n#### `minDistance`\nThe minimum distance the two selected slider values must be apart. -1 for no minimum. Default is -1.\n#### `maxDistance`\nThe maximum distance the two selected slider values must be apart. -1 for no maximum. Default is -1.\n\nYou can override this default here by supplying your own NSNumberFormatter. For example, you could supply an NSNumberFormatter that has a currency style, or a prefix or suffix.\n\nIf this property is nil, the default decimal format will be used. Note: If you want no labels at all, set this value to be `(NSNumberFormatter *)[NSNull null]` (as opposed to nil), to specifically mark that you want no labels\n#### `minLabelColour`\nThe colour of the minimum value text label. If not set, the default is the tintColor.\n#### `maxLabelColour`\nThe colour of the maximum value text label. If not set, the default is the tintColor.\n#### `disableRange`\nIf true, the control will mimic a normal slider and have only one handle rather than a range.\n\nIn this case, the selectedMinValue will be not functional anymore. Use selectedMaxValue instead to determine the value the user has selected.\n#### `enableStep`\nIf true the control will snap to point at each `step` (property) between minValue and maxValue. Default value is disabled.\n#### `step`\nIf `enableStep` is true, this controls the value of each step. E.g. if this value is 20, the control will snap to values 20,40,60...etc. Set this is you enable the `enableStep` property.\n#### `handleImage`\nIf set the image passed will be used for the handles.\n#### `handleColor`\nIf set it will update the color of the handles. Default is `tintColor`.\n#### `handleDiameter`\nIf set it will update the size of the handles. Default is `16.0`.\n#### `selectedHandleDiameterMultiplier`\nIf set it update the scaling factor of the handle when selected. Default is `1.7`. If you don't want any scaling, set it to `1.0`.\n#### `lineHeight`\nSet the height of the line. It will automatically round the corners. If not specified, the default value will be `1.0`.\n#### `handleBorderColor`\nIf set it will update the color of the handle borders. Default is `tintColor`.\n#### `handleBorderWidth`\nIf set it will update the size of the handle borders. Default is `0.0`\n#### `labelPadding`\nIf set it will update the size of the padding between label and handle. Default is `8.0`\n\n## Author\n\nTom Thorpe\n\n## License\n\nTTRangeSlider is available under the MIT license. See the LICENSE file for more info.\n"
  },
  {
    "path": "Pods/TYCyclePagerView/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2017 yeBlueColor\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Pods/TYCyclePagerView/README.md",
    "content": "# TYCyclePagerView\na simple and usefull cycle pager view ,and auto scroll banner view ,include pageControl for iOS,support Objective-C and swift.this has been used in APP.\n\n## CocoaPods\n```\npod 'TYCyclePagerView'\n```\n\n## Requirements\n* Xcode 7 or higher\n* iOS 7.0 or higher\n* ARC\n\n### ScreenShot\n\n![image](https://github.com/12207480/TYCyclePagerView/blob/master/ScreenShot/TYCyclePagerView.gif)\n\n## API\n\n*  DataSource and Delegate \n```objc\n\n@protocol TYCyclePagerViewDataSource <NSObject>\n\n- (NSInteger)numberOfItemsInPagerView:(TYCyclePagerView *)pageView;\n\n- (__kindof UICollectionViewCell *)pagerView:(TYCyclePagerView *)pagerView cellForItemAtIndex:(NSInteger)index;\n\n/**\n return pagerView layout,and cache layout\n */\n- (TYCyclePagerViewLayout *)layoutForPagerView:(TYCyclePagerView *)pageView;\n\n@protocol TYCyclePagerViewDelegate <NSObject>\n\n@optional\n\n/**\n pagerView did scroll to new index page\n */\n- (void)pagerView:(TYCyclePagerView *)pageView didScrollFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex;\n\n/**\n pagerView did selected item cell\n */\n- (void)pagerView:(TYCyclePagerView *)pageView didSelectedItemCell:(__kindof UICollectionViewCell *)cell atIndex:(NSInteger)index;\n\n// More API see project\n```\n\n* Class\n\n```objc\n\n@interface TYCyclePagerView : UIView\n\n// will be automatically resized to track the size of the pagerView\n@property (nonatomic, strong, nullable) UIView *backgroundView; \n\n@property (nonatomic, weak, nullable) id<TYCyclePagerViewDataSource> dataSource;\n@property (nonatomic, weak, nullable) id<TYCyclePagerViewDelegate> delegate;\n\n// pager view layout is important\n@property (nonatomic, strong, readonly) TYCyclePagerViewLayout *layout;\n\n/**\n is infinite cycle pageview\n */\n@property (nonatomic, assign) BOOL isInfiniteLoop;\n\n/**\n pagerView automatic scroll time interval, default 0,disable automatic\n */\n@property (nonatomic, assign) CGFloat autoScrollInterval;\n\n\n@interface TYCyclePagerViewLayout : NSObject\n\n@property (nonatomic, assign) CGSize itemSize;\n@property (nonatomic, assign) CGFloat itemSpacing;\n@property (nonatomic, assign) UIEdgeInsets sectionInset;\n\n@property (nonatomic, assign) TYCyclePagerTransformLayoutType layoutType;\n\n@property (nonatomic, assign) CGFloat minimumScale; // sacle default 0.8\n@property (nonatomic, assign) CGFloat minimumAlpha; // alpha default 1.0\n@property (nonatomic, assign) CGFloat maximumAngle; // angle is % default 0.2\n\n\n@interface TYPageControl : UIControl\n\n@property (nonatomic, assign) NSInteger numberOfPages;          // default is 0\n@property (nonatomic, assign) NSInteger currentPage;            // default is 0. value pinned to 0..numberOfPages-1\n\n// indicatorTint color\n@property (nullable, nonatomic,strong) UIColor *pageIndicatorTintColor;\n@property (nullable, nonatomic,strong) UIColor *currentPageIndicatorTintColor;\n\n// indicator image\n@property (nullable, nonatomic,strong) UIImage *pageIndicatorImage;\n@property (nullable, nonatomic,strong) UIImage *currentPageIndicatorImage;\n```\n\n## Usage\n\n```objc\n\n- (void)addPagerView {\n    TYCyclePagerView *pagerView = [[TYCyclePagerView alloc]init];\n    pagerView.layer.borderWidth = 1;\n    pagerView.isInfiniteLoop = YES;\n    pagerView.autoScrollInterval = 3.0;\n    pagerView.dataSource = self;\n    pagerView.delegate = self;\n    // registerClass or registerNib\n    [pagerView registerClass:[TYCyclePagerViewCell class] forCellWithReuseIdentifier:@\"cellId\"];\n    [self.view addSubview:pagerView];\n    _pagerView = pagerView;\n}\n\n- (void)addPageControl {\n    TYPageControl *pageControl = [[TYPageControl alloc]init];\n    //pageControl.numberOfPages = _datas.count;\n    pageControl.currentPageIndicatorSize = CGSizeMake(8, 8);\n//    pageControl.pageIndicatorImage = [UIImage imageNamed:@\"Dot\"];\n//    pageControl.currentPageIndicatorImage = [UIImage imageNamed:@\"DotSelected\"];\n//    [pageControl addTarget:self action:@selector(pageControlValueChangeAction:) forControlEvents:UIControlEventValueChanged];\n    [_pagerView addSubview:pageControl];\n    _pageControl = pageControl;\n}\n- (void)loadData {\n    // load data to _datas\n    _pageControl.numberOfPages = _datas.count;\n    [_pagerView reloadData];\n}\n\n```\n\n### Contact\n如果你发现bug，please pull reqeust me <br>\n如果你有更好的改进，please pull reqeust me <br>\n"
  },
  {
    "path": "Pods/TYCyclePagerView/TYCyclePagerViewDemo/TYCyclePagerView/TYCyclePagerTransformLayout.h",
    "content": "//\n//  TYCyclePagerViewLayout.h\n//  TYCyclePagerViewDemo\n//\n//  Created by tany on 2017/6/19.\n//  Copyright © 2017年 tany. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\ntypedef NS_ENUM(NSUInteger, TYCyclePagerTransformLayoutType) {\n    TYCyclePagerTransformLayoutNormal,\n    TYCyclePagerTransformLayoutLinear,\n    TYCyclePagerTransformLayoutCoverflow,\n};\n\n@class TYCyclePagerTransformLayout;\n@protocol TYCyclePagerTransformLayoutDelegate <NSObject>\n\n// initialize layout attributes\n- (void)pagerViewTransformLayout:(TYCyclePagerTransformLayout *)pagerViewTransformLayout initializeTransformAttributes:(UICollectionViewLayoutAttributes *)attributes;\n\n// apply layout attributes\n- (void)pagerViewTransformLayout:(TYCyclePagerTransformLayout *)pagerViewTransformLayout applyTransformToAttributes:(UICollectionViewLayoutAttributes *)attributes;\n\n@end\n\n\n@interface TYCyclePagerViewLayout : NSObject\n\n@property (nonatomic, assign) CGSize itemSize;\n@property (nonatomic, assign) CGFloat itemSpacing;\n@property (nonatomic, assign) UIEdgeInsets sectionInset;\n\n@property (nonatomic, assign) TYCyclePagerTransformLayoutType layoutType;\n\n@property (nonatomic, assign) CGFloat minimumScale; // sacle default 0.8\n@property (nonatomic, assign) CGFloat minimumAlpha; // alpha default 1.0\n@property (nonatomic, assign) CGFloat maximumAngle; // angle is % default 0.2\n\n@property (nonatomic, assign) BOOL isInfiniteLoop;  // infinte scroll\n@property (nonatomic, assign) CGFloat rateOfChange; // scale and angle change rate\n@property (nonatomic, assign) BOOL adjustSpacingWhenScroling; \n\n/**\n pageView cell item vertical centering\n */\n@property (nonatomic, assign) BOOL itemVerticalCenter;\n\n/**\n first and last item horizontalc enter, when isInfiniteLoop is NO\n */\n@property (nonatomic, assign) BOOL itemHorizontalCenter;\n\n// sectionInset\n@property (nonatomic, assign, readonly) UIEdgeInsets onlyOneSectionInset;\n@property (nonatomic, assign, readonly) UIEdgeInsets firstSectionInset;\n@property (nonatomic, assign, readonly) UIEdgeInsets lastSectionInset;\n@property (nonatomic, assign, readonly) UIEdgeInsets middleSectionInset;\n\n@end\n\n\n@interface TYCyclePagerTransformLayout : UICollectionViewFlowLayout\n\n@property (nonatomic, strong) TYCyclePagerViewLayout *layout;\n\n@property (nonatomic, weak, nullable) id<TYCyclePagerTransformLayoutDelegate> delegate;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/TYCyclePagerView/TYCyclePagerViewDemo/TYCyclePagerView/TYCyclePagerTransformLayout.m",
    "content": "//\n//  TYCyclePagerViewLayout.m\n//  TYCyclePagerViewDemo\n//\n//  Created by tany on 2017/6/19.\n//  Copyright © 2017年 tany. All rights reserved.\n//\n\n#import \"TYCyclePagerTransformLayout.h\"\n\ntypedef NS_ENUM(NSUInteger, TYTransformLayoutItemDirection) {\n    TYTransformLayoutItemLeft,\n    TYTransformLayoutItemCenter,\n    TYTransformLayoutItemRight,\n};\n\n\n@interface TYCyclePagerTransformLayout () {\n    struct {\n        unsigned int applyTransformToAttributes   :1;\n        unsigned int initializeTransformAttributes   :1;\n    }_delegateFlags;\n}\n\n@property (nonatomic, assign) BOOL applyTransformToAttributesDelegate;\n\n@end\n\n\n@interface TYCyclePagerViewLayout ()\n\n@property (nonatomic, weak) UIView *pageView;\n\n@end\n\n\n@implementation TYCyclePagerTransformLayout\n\n- (instancetype)init {\n    if (self = [super init]) {\n        self.scrollDirection = UICollectionViewScrollDirectionHorizontal;\n    }\n    return self;\n}\n\n- (instancetype)initWithCoder:(NSCoder *)aDecoder {\n    if (self = [super initWithCoder:aDecoder]) {\n        self.scrollDirection = UICollectionViewScrollDirectionHorizontal;\n    }\n    return self;\n}\n\n#pragma mark - getter setter\n\n- (void)setDelegate:(id<TYCyclePagerTransformLayoutDelegate>)delegate {\n    _delegate = delegate;\n    _delegateFlags.initializeTransformAttributes = [delegate respondsToSelector:@selector(pagerViewTransformLayout:initializeTransformAttributes:)];\n    _delegateFlags.applyTransformToAttributes = [delegate respondsToSelector:@selector(pagerViewTransformLayout:applyTransformToAttributes:)];\n}\n\n- (void)setLayout:(TYCyclePagerViewLayout *)layout {\n    _layout = layout;\n    _layout.pageView = self.collectionView;\n    self.itemSize = _layout.itemSize;\n    self.minimumInteritemSpacing = _layout.itemSpacing;\n    self.minimumLineSpacing = _layout.itemSpacing;\n}\n\n- (CGSize)itemSize {\n    if (!_layout) {\n        return [super itemSize];\n    }\n    return _layout.itemSize;\n}\n\n- (CGFloat)minimumLineSpacing {\n    if (!_layout) {\n        return [super minimumLineSpacing];\n    }\n    return _layout.itemSpacing;\n}\n\n- (CGFloat)minimumInteritemSpacing {\n    if (!_layout) {\n        return [super minimumInteritemSpacing];\n    }\n    return _layout.itemSpacing;\n}\n\n- (TYTransformLayoutItemDirection)directionWithCenterX:(CGFloat)centerX {\n    TYTransformLayoutItemDirection direction= TYTransformLayoutItemRight;\n    CGFloat contentCenterX = self.collectionView.contentOffset.x + CGRectGetWidth(self.collectionView.frame)/2;\n    if (ABS(centerX - contentCenterX) < 0.5) {\n        direction = TYTransformLayoutItemCenter;\n    }else if (centerX - contentCenterX < 0) {\n        direction = TYTransformLayoutItemLeft;\n    }\n    return direction;\n}\n\n#pragma mark - layout\n\n-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds\n{\n    return _layout.layoutType == TYCyclePagerTransformLayoutNormal ? [super shouldInvalidateLayoutForBoundsChange:newBounds] : YES;\n}\n\n- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect {\n    if (_delegateFlags.applyTransformToAttributes || _layout.layoutType != TYCyclePagerTransformLayoutNormal) {\n        NSArray *attributesArray = [[NSArray alloc] initWithArray:[super layoutAttributesForElementsInRect:rect] copyItems:YES];\n        CGRect visibleRect = {self.collectionView.contentOffset,self.collectionView.bounds.size};\n        for (UICollectionViewLayoutAttributes *attributes in attributesArray) {\n            if (!CGRectIntersectsRect(visibleRect, attributes.frame)) {\n                continue;\n            }\n            if (_delegateFlags.applyTransformToAttributes) {\n                [_delegate pagerViewTransformLayout:self applyTransformToAttributes:attributes];\n            }else {\n                [self applyTransformToAttributes:attributes layoutType:_layout.layoutType];\n            }\n        }\n        return attributesArray;\n    }\n    return [super layoutAttributesForElementsInRect:rect];\n}\n\n- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath {\n    UICollectionViewLayoutAttributes *attributes = [super layoutAttributesForItemAtIndexPath:indexPath];\n    if (_delegateFlags.initializeTransformAttributes) {\n        [_delegate pagerViewTransformLayout:self initializeTransformAttributes:attributes];\n    }else if(_layout.layoutType != TYCyclePagerTransformLayoutNormal){\n        [self initializeTransformAttributes:attributes layoutType:_layout.layoutType];\n    }\n    return attributes;\n}\n\n#pragma mark - transform\n\n- (void)initializeTransformAttributes:(UICollectionViewLayoutAttributes *)attributes layoutType:(TYCyclePagerTransformLayoutType)layoutType {\n    switch (layoutType) {\n        case TYCyclePagerTransformLayoutLinear:\n            [self applyLinearTransformToAttributes:attributes scale:_layout.minimumScale alpha:_layout.minimumAlpha];\n            break;\n        case TYCyclePagerTransformLayoutCoverflow:\n        {\n            [self applyCoverflowTransformToAttributes:attributes angle:_layout.maximumAngle alpha:_layout.minimumAlpha];\n            break;\n        }\n        default:\n            break;\n    }\n}\n\n- (void)applyTransformToAttributes:(UICollectionViewLayoutAttributes *)attributes layoutType:(TYCyclePagerTransformLayoutType)layoutType {\n    switch (layoutType) {\n        case TYCyclePagerTransformLayoutLinear:\n            [self applyLinearTransformToAttributes:attributes];\n            break;\n        case TYCyclePagerTransformLayoutCoverflow:\n            [self applyCoverflowTransformToAttributes:attributes];\n            break;\n        default:\n            break;\n    }\n}\n\n#pragma mark - LinearTransform\n\n- (void)applyLinearTransformToAttributes:(UICollectionViewLayoutAttributes *)attributes {\n    CGFloat collectionViewWidth = self.collectionView.frame.size.width;\n    if (collectionViewWidth <= 0) {\n        return;\n    }\n    CGFloat centetX = self.collectionView.contentOffset.x + collectionViewWidth/2;\n    CGFloat delta = ABS(attributes.center.x - centetX);\n    CGFloat scale = MAX(1 - delta/collectionViewWidth*_layout.rateOfChange, _layout.minimumScale);\n    CGFloat alpha = MAX(1 - delta/collectionViewWidth, _layout.minimumAlpha);\n    [self applyLinearTransformToAttributes:attributes scale:scale alpha:alpha];\n}\n\n- (void)applyLinearTransformToAttributes:(UICollectionViewLayoutAttributes *)attributes scale:(CGFloat)scale alpha:(CGFloat)alpha {\n    CGAffineTransform transform = CGAffineTransformMakeScale(scale, scale);\n    if (_layout.adjustSpacingWhenScroling) {\n        TYTransformLayoutItemDirection direction = [self directionWithCenterX:attributes.center.x];\n        CGFloat translate = 0;\n        switch (direction) {\n            case TYTransformLayoutItemLeft:\n                translate = 1.15 * attributes.size.width*(1-scale)/2;\n                break;\n            case TYTransformLayoutItemRight:\n                translate = -1.15 * attributes.size.width*(1-scale)/2;\n                break;\n            default:\n                // center\n                scale = 1.0;\n                alpha = 1.0;\n                break;\n        }\n        transform = CGAffineTransformTranslate(transform,translate, 0);\n    }\n    attributes.transform = transform;\n    attributes.alpha = alpha;\n}\n\n#pragma mark - CoverflowTransform\n\n- (void)applyCoverflowTransformToAttributes:(UICollectionViewLayoutAttributes *)attributes{\n    CGFloat collectionViewWidth = self.collectionView.frame.size.width;\n    if (collectionViewWidth <= 0) {\n        return;\n    }\n    CGFloat centetX = self.collectionView.contentOffset.x + collectionViewWidth/2;\n    CGFloat delta = ABS(attributes.center.x - centetX);\n    CGFloat angle = MIN(delta/collectionViewWidth*(1-_layout.rateOfChange), _layout.maximumAngle);\n    CGFloat alpha = MAX(1 - delta/collectionViewWidth, _layout.minimumAlpha);\n    [self applyCoverflowTransformToAttributes:attributes angle:angle alpha:alpha];\n}\n\n- (void)applyCoverflowTransformToAttributes:(UICollectionViewLayoutAttributes *)attributes angle:(CGFloat)angle alpha:(CGFloat)alpha {\n    TYTransformLayoutItemDirection direction = [self directionWithCenterX:attributes.center.x];\n    CATransform3D transform3D = CATransform3DIdentity;\n    transform3D.m34 = -0.002;\n    CGFloat translate = 0;\n    switch (direction) {\n        case TYTransformLayoutItemLeft:\n            translate = (1-cos(angle*1.2*M_PI))*attributes.size.width;\n            break;\n        case TYTransformLayoutItemRight:\n            translate = -(1-cos(angle*1.2*M_PI))*attributes.size.width;\n            angle = -angle;\n            break;\n        default:\n            // center\n            angle = 0;\n            alpha = 1;\n            break;\n    }\n\n    transform3D = CATransform3DRotate(transform3D, M_PI*angle, 0, 1, 0);\n    if (_layout.adjustSpacingWhenScroling) {\n        transform3D = CATransform3DTranslate(transform3D, translate, 0, 0);\n    }\n    attributes.transform3D = transform3D;\n    attributes.alpha = alpha;\n\n}\n@end\n\n\n@implementation TYCyclePagerViewLayout\n\n- (instancetype)init {\n    if (self = [super init]) {\n        _itemVerticalCenter = YES;\n        _minimumScale = 0.8;\n        _minimumAlpha = 1.0;\n        _maximumAngle = 0.2;\n        _rateOfChange = 0.4;\n        _adjustSpacingWhenScroling = YES;\n    }\n    return self;\n}\n\n#pragma mark - getter\n\n- (UIEdgeInsets)onlyOneSectionInset {\n    CGFloat leftSpace = _pageView && !_isInfiniteLoop && _itemHorizontalCenter ? (CGRectGetWidth(_pageView.frame) - _itemSize.width)/2 : _sectionInset.left;\n    CGFloat rightSpace = _pageView && !_isInfiniteLoop && _itemHorizontalCenter ? (CGRectGetWidth(_pageView.frame) - _itemSize.width)/2 : _sectionInset.right;\n    if (_itemVerticalCenter) {\n        CGFloat verticalSpace = (CGRectGetHeight(_pageView.frame) - _itemSize.height)/2;\n        return UIEdgeInsetsMake(verticalSpace, leftSpace, verticalSpace, rightSpace);\n    }\n    return UIEdgeInsetsMake(_sectionInset.top, leftSpace, _sectionInset.bottom, rightSpace);\n}\n\n- (UIEdgeInsets)firstSectionInset {\n    if (_itemVerticalCenter) {\n        CGFloat verticalSpace = (CGRectGetHeight(_pageView.frame) - _itemSize.height)/2;\n        return UIEdgeInsetsMake(verticalSpace, _sectionInset.left, verticalSpace, _itemSpacing);\n    }\n    return UIEdgeInsetsMake(_sectionInset.top, _sectionInset.left, _sectionInset.bottom, _itemSpacing);\n}\n\n- (UIEdgeInsets)lastSectionInset {\n    if (_itemVerticalCenter) {\n        CGFloat verticalSpace = (CGRectGetHeight(_pageView.frame) - _itemSize.height)/2;\n        return UIEdgeInsetsMake(verticalSpace, 0, verticalSpace, _sectionInset.right);\n    }\n    return UIEdgeInsetsMake(_sectionInset.top, 0, _sectionInset.bottom, _sectionInset.right);\n}\n\n- (UIEdgeInsets)middleSectionInset {\n    if (_itemVerticalCenter) {\n        CGFloat verticalSpace = (CGRectGetHeight(_pageView.frame) - _itemSize.height)/2;\n        return UIEdgeInsetsMake(verticalSpace, 0, verticalSpace, _itemSpacing);\n    }\n    return _sectionInset;\n}\n\n@end\n"
  },
  {
    "path": "Pods/TYCyclePagerView/TYCyclePagerViewDemo/TYCyclePagerView/TYCyclePagerView.h",
    "content": "//\n//  TYCyclePagerView.h\n//  TYCyclePagerViewDemo\n//\n//  Created by tany on 2017/6/14.\n//  Copyright © 2017年 tany. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import \"TYCyclePagerTransformLayout.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n// pagerView scrolling direction\ntypedef NS_ENUM(NSUInteger, TYPagerScrollDirection) {\n    TYPagerScrollDirectionLeft,\n    TYPagerScrollDirectionRight,\n};\n\n@class TYCyclePagerView;\n@protocol TYCyclePagerViewDataSource <NSObject>\n\n- (NSInteger)numberOfItemsInPagerView:(TYCyclePagerView *)pageView;\n\n- (__kindof UICollectionViewCell *)pagerView:(TYCyclePagerView *)pagerView cellForItemAtIndex:(NSInteger)index;\n\n/**\n return pagerView layout,and cache layout\n */\n- (TYCyclePagerViewLayout *)layoutForPagerView:(TYCyclePagerView *)pageView;\n\n@end\n\n@protocol TYCyclePagerViewDelegate <NSObject>\n\n@optional\n\n/**\n pagerView did scroll to new index page\n */\n- (void)pagerView:(TYCyclePagerView *)pageView didScrollFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex;\n\n/**\n pagerView did selected item cell\n */\n- (void)pagerView:(TYCyclePagerView *)pageView didSelectedItemCell:(__kindof UICollectionViewCell *)cell atIndex:(NSInteger)index;\n\n// custom layout\n- (void)pagerView:(TYCyclePagerView *)pageView initializeTransformAttributes:(UICollectionViewLayoutAttributes *)attributes;\n\n- (void)pagerView:(TYCyclePagerView *)pageView applyTransformToAttributes:(UICollectionViewLayoutAttributes *)attributes;\n\n\n// scrollViewDelegate\n\n- (void)pagerViewDidScroll:(TYCyclePagerView *)pageView;\n\n- (void)pagerViewWillBeginDragging:(TYCyclePagerView *)pageView;\n\n- (void)pagerViewDidEndDragging:(TYCyclePagerView *)pageView willDecelerate:(BOOL)decelerate;\n\n- (void)pagerViewWillBeginDecelerating:(TYCyclePagerView *)pageView;\n\n- (void)pagerViewDidEndDecelerating:(TYCyclePagerView *)pageView;\n\n- (void)pagerViewWillBeginScrollingAnimation:(TYCyclePagerView *)pageView;\n\n- (void)pagerViewDidEndScrollingAnimation:(TYCyclePagerView *)pageView;\n\n@end\n\n\n@interface TYCyclePagerView : UIView\n\n// will be automatically resized to track the size of the pagerView\n@property (nonatomic, strong, nullable) UIView *backgroundView; \n\n@property (nonatomic, weak, nullable) id<TYCyclePagerViewDataSource> dataSource;\n@property (nonatomic, weak, nullable) id<TYCyclePagerViewDelegate> delegate;\n\n// pager view layout\n@property (nonatomic, strong, readonly) TYCyclePagerViewLayout *layout;\n\n/**\n is infinite cycle pageview\n */\n@property (nonatomic, assign) BOOL isInfiniteLoop;\n\n/**\n pagerView automatic scroll time interval, default 0,disable automatic\n */\n@property (nonatomic, assign) CGFloat autoScrollInterval;\n\n/**\n current page index\n */\n@property (nonatomic, assign, readonly) NSInteger curIndex;\n\n// scrollView property\n@property (nonatomic, assign, readonly) CGPoint contentOffset;\n@property (nonatomic, assign, readonly) BOOL tracking;\n@property (nonatomic, assign, readonly) BOOL dragging;\n@property (nonatomic, assign, readonly) BOOL decelerating;\n\n\n/**\n reload data, !!important!!: will clear layout and call delegate layoutForPagerView\n */\n- (void)reloadData;\n\n/**\n update data is reload data, but not clear layuot\n */\n- (void)updateData;\n\n/**\n if you only want update layout\n */\n- (void)setNeedUpdateLayout;\n\n/**\n will set layout nil and call delegate->layoutForPagerView\n */\n- (void)setNeedClearLayout;\n\n/**\n current index cell in pagerView\n */\n- (__kindof UICollectionViewCell * _Nullable)curIndexCell;\n\n/**\n visible cells in pageView\n */\n- (NSArray<__kindof UICollectionViewCell *> *_Nullable)visibleCells;\n\n\n/**\n visible pageView indexs, maybe repeat index\n */\n- (NSArray *)visibleIndexs;\n\n/**\n scroll to item at index\n */\n- (void)scrollToItemAtIndex:(NSInteger)index animate:(BOOL)animate;\n\n/**\n scroll to next or pre item\n */\n- (void)scrollToNearlyIndexAtDirection:(TYPagerScrollDirection)direction animate:(BOOL)animate;\n\n/**\n register pager view cell with class\n */\n- (void)registerClass:(Class)Class forCellWithReuseIdentifier:(NSString *)identifier;\n\n/**\n register pager view cell with nib\n */\n- (void)registerNib:(UINib *)nib forCellWithReuseIdentifier:(NSString *)identifier;\n\n/**\n dequeue reusable cell for pagerView\n */\n- (__kindof UICollectionViewCell *)dequeueReusableCellWithReuseIdentifier:(NSString *)identifier forIndex:(NSInteger)index;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/TYCyclePagerView/TYCyclePagerViewDemo/TYCyclePagerView/TYCyclePagerView.m",
    "content": "//\n//  TYCyclePagerView.m\n//  TYCyclePagerViewDemo\n//\n//  Created by tany on 2017/6/14.\n//  Copyright © 2017年 tany. All rights reserved.\n//\n\n#import \"TYCyclePagerView.h\"\n\ntypedef struct {\n    NSInteger index;\n    NSInteger section;\n}TYIndexSection;\n\nNS_INLINE BOOL TYEqualIndexSection(TYIndexSection indexSection1,TYIndexSection indexSection2) {\n    return indexSection1.index == indexSection2.index && indexSection1.section == indexSection2.section;\n}\n\nNS_INLINE TYIndexSection TYMakeIndexSection(NSInteger index, NSInteger section) {\n    TYIndexSection indexSection;\n    indexSection.index = index;\n    indexSection.section = section;\n    return indexSection;\n}\n\n@interface TYCyclePagerView () <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, TYCyclePagerTransformLayoutDelegate> {\n    struct {\n        unsigned int pagerViewDidScroll   :1;\n        unsigned int didScrollFromIndexToNewIndex   :1;\n        unsigned int initializeTransformAttributes   :1;\n        unsigned int applyTransformToAttributes   :1;\n    }_delegateFlags;\n    struct {\n        unsigned int cellForItemAtIndex   :1;\n        unsigned int layoutForPagerView   :1;\n    }_dataSourceFlags;\n}\n\n// UI\n@property (nonatomic, weak) UICollectionView *collectionView;\n@property (nonatomic, strong) TYCyclePagerViewLayout *layout;\n@property (nonatomic, strong) NSTimer *timer;\n\n// Data\n@property (nonatomic, assign) NSInteger numberOfItems;\n\n@property (nonatomic, assign) TYIndexSection indexSection; // current index\n@property (nonatomic, assign) NSInteger dequeueSection;\n@property (nonatomic, assign) TYIndexSection beginDragIndexSection;\n\n@property (nonatomic, assign) BOOL needClearLayout;\n@property (nonatomic, assign) BOOL didReloadData;\n@property (nonatomic, assign) BOOL didLayout;\n\n@end\n\n#define kPagerViewMaxSectionCount 200\n#define kPagerViewMinSectionCount 18\n\n@implementation TYCyclePagerView\n\n#pragma mark - life Cycle\n\n- (instancetype)initWithFrame:(CGRect)frame {\n    if (self = [super initWithFrame:frame]) {\n        [self configureProperty];\n        \n        [self addCollectionView];\n    }\n    return self;\n}\n\n- (instancetype)initWithCoder:(NSCoder *)aDecoder {\n    if (self = [super initWithCoder:aDecoder]) {\n        [self configureProperty];\n        \n        [self addCollectionView];\n    }\n    return self;\n}\n\n- (void)configureProperty {\n    _didReloadData = NO;\n    _didLayout = NO;\n    _autoScrollInterval = 0;\n    _isInfiniteLoop = YES;\n    _beginDragIndexSection.index = 0;\n    _beginDragIndexSection.section = 0;\n    _indexSection.index = -1;\n    _indexSection.section = -1;\n}\n\n- (void)addCollectionView {\n    TYCyclePagerTransformLayout *layout = [[TYCyclePagerTransformLayout alloc]init];\n    UICollectionView *collectionView = [[UICollectionView alloc]initWithFrame:CGRectZero collectionViewLayout:layout];\n    layout.delegate = _delegateFlags.applyTransformToAttributes ? self : nil;;\n    collectionView.backgroundColor = [UIColor clearColor];\n    collectionView.dataSource = self;\n    collectionView.delegate = self;\n    collectionView.pagingEnabled = NO;\n    collectionView.decelerationRate = 1-0.0076;\n    if ([collectionView respondsToSelector:@selector(setPrefetchingEnabled:)]) {\n        collectionView.prefetchingEnabled = NO;\n    }\n    collectionView.showsHorizontalScrollIndicator = NO;\n    collectionView.showsVerticalScrollIndicator = NO;\n    [self addSubview:collectionView];\n    _collectionView = collectionView;\n}\n\n- (void)willMoveToSuperview:(UIView *)newSuperview {\n    if (!newSuperview) {\n        [self removeTimer];\n    }else {\n        [self removeTimer];\n        if (_autoScrollInterval > 0) {\n            [self addTimer];\n        }\n    }\n}\n\n#pragma mark - timer\n\n- (void)addTimer {\n    if (_timer) {\n        return;\n    }\n    _timer = [NSTimer timerWithTimeInterval:_autoScrollInterval target:self selector:@selector(timerFired:) userInfo:nil repeats:YES];\n    [[NSRunLoop mainRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];\n}\n\n- (void)removeTimer {\n    if (!_timer) {\n        return;\n    }\n    [_timer invalidate];\n    _timer = nil;\n}\n\n- (void)timerFired:(NSTimer *)timer {\n    if (!self.superview || !self.window || _numberOfItems == 0 || self.tracking) {\n        return;\n    }\n    \n    [self scrollToNearlyIndexAtDirection:TYPagerScrollDirectionRight animate:YES];\n}\n\n#pragma mark - getter\n\n- (TYCyclePagerViewLayout *)layout {\n    if (!_layout) {\n        if (_dataSourceFlags.layoutForPagerView) {\n            _layout = [_dataSource layoutForPagerView:self];\n            _layout.isInfiniteLoop = _isInfiniteLoop;\n        }\n        if (_layout.itemSize.width <= 0 || _layout.itemSize.height <= 0) {\n            _layout = nil;\n        }\n    }\n    return _layout;\n}\n\n- (NSInteger)curIndex {\n    return _indexSection.index;\n}\n\n- (CGPoint)contentOffset {\n    return _collectionView.contentOffset;\n}\n\n- (BOOL)tracking {\n    return _collectionView.tracking;\n}\n\n- (BOOL)dragging {\n    return _collectionView.dragging;\n}\n\n- (BOOL)decelerating {\n    return _collectionView.decelerating;\n}\n\n- (UIView *)backgroundView {\n    return _collectionView.backgroundView;\n}\n\n- (__kindof UICollectionViewCell *)curIndexCell {\n    return [_collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:_indexSection.index inSection:_indexSection.section]];\n}\n\n- (NSArray<__kindof UICollectionViewCell *> *)visibleCells {\n    return _collectionView.visibleCells;\n}\n\n- (NSArray *)visibleIndexs {\n    NSMutableArray *indexs = [NSMutableArray array];\n    for (NSIndexPath *indexPath in _collectionView.indexPathsForVisibleItems) {\n        [indexs addObject:@(indexPath.item)];\n    }\n    return [indexs copy];\n}\n\n#pragma mark - setter\n\n- (void)setBackgroundView:(UIView *)backgroundView {\n    [_collectionView setBackgroundView:backgroundView];\n}\n\n- (void)setAutoScrollInterval:(CGFloat)autoScrollInterval {\n    _autoScrollInterval = autoScrollInterval;\n    [self removeTimer];\n    if (autoScrollInterval > 0 && self.superview) {\n        [self addTimer];\n    }\n}\n\n- (void)setDelegate:(id<TYCyclePagerViewDelegate>)delegate {\n    _delegate = delegate;\n    _delegateFlags.pagerViewDidScroll = [delegate respondsToSelector:@selector(scrollViewDidScroll:)];\n    _delegateFlags.didScrollFromIndexToNewIndex = [delegate respondsToSelector:@selector(pagerView:didScrollFromIndex:toIndex:)];\n    _delegateFlags.initializeTransformAttributes = [delegate respondsToSelector:@selector(pagerView:initializeTransformAttributes:)];\n    _delegateFlags.applyTransformToAttributes = [delegate respondsToSelector:@selector(pagerView:applyTransformToAttributes:)];\n    if (self.collectionView && self.collectionView.collectionViewLayout) {\n        ((TYCyclePagerTransformLayout *)self.collectionView.collectionViewLayout).delegate = _delegateFlags.applyTransformToAttributes ? self : nil;\n    }\n}\n\n- (void)setDataSource:(id<TYCyclePagerViewDataSource>)dataSource {\n    _dataSource = dataSource;\n    _dataSourceFlags.cellForItemAtIndex = [dataSource respondsToSelector:@selector(pagerView:cellForItemAtIndex:)];\n    _dataSourceFlags.layoutForPagerView = [dataSource respondsToSelector:@selector(layoutForPagerView:)];\n}\n\n#pragma mark - public\n\n- (void)reloadData {\n    _didReloadData = YES;\n    [self setNeedClearLayout];\n    [self clearLayout];\n    [self updateData];\n}\n\n// not clear layout\n- (void)updateData {\n    [self updateLayout];\n    _numberOfItems = [_dataSource numberOfItemsInPagerView:self];\n    [_collectionView reloadData];\n    [self resetPagerViewAtIndex:_indexSection.index < 0 && !CGRectIsEmpty(self.frame) ? 0 :_indexSection.index];\n}\n\n- (void)scrollToNearlyIndexAtDirection:(TYPagerScrollDirection)direction animate:(BOOL)animate {\n    TYIndexSection indexSection = [self nearlyIndexPathAtDirection:direction];\n    [self scrollToItemAtIndexSection:indexSection animate:animate];\n}\n\n- (void)scrollToItemAtIndex:(NSInteger)index animate:(BOOL)animate {\n    if (!_isInfiniteLoop) {\n        [self scrollToItemAtIndexSection:TYMakeIndexSection(index, 0) animate:animate];\n        return;\n    }\n\n    [self scrollToItemAtIndexSection:TYMakeIndexSection(index, index >= self.curIndex ? _indexSection.section : _indexSection.section+1) animate:YES];\n}\n\n- (void)scrollToItemAtIndexSection:(TYIndexSection)indexSection animate:(BOOL)animate {\n    if (_numberOfItems <= 0 || ![self isValidIndexSection:indexSection]) {\n        //NSLog(@\"scrollToItemAtIndex: item indexSection is invalid!\");\n        return;\n    }\n    \n    if (animate && [_delegate respondsToSelector:@selector(pagerViewWillBeginScrollingAnimation:)]) {\n        [_delegate pagerViewWillBeginScrollingAnimation:self];\n    }\n    CGFloat offset = [self caculateOffsetXAtIndexSection:indexSection];\n    [_collectionView setContentOffset:CGPointMake(offset, _collectionView.contentOffset.y) animated:animate];\n}\n\n- (void)registerClass:(Class)Class forCellWithReuseIdentifier:(NSString *)identifier {\n    [_collectionView registerClass:Class forCellWithReuseIdentifier:identifier];\n}\n\n- (void)registerNib:(UINib *)nib forCellWithReuseIdentifier:(NSString *)identifier {\n    [_collectionView registerNib:nib forCellWithReuseIdentifier:identifier];\n}\n\n- (__kindof UICollectionViewCell *)dequeueReusableCellWithReuseIdentifier:(NSString *)identifier forIndex:(NSInteger)index {\n    UICollectionViewCell *cell = [_collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:[NSIndexPath indexPathForItem:index inSection:_dequeueSection]];\n    return cell;\n}\n\n#pragma mark - configure layout\n\n- (void)updateLayout {\n    if (!self.layout) {\n        return;\n    }\n    self.layout.isInfiniteLoop = _isInfiniteLoop;\n    ((TYCyclePagerTransformLayout *)_collectionView.collectionViewLayout).layout = self.layout;\n}\n\n- (void)clearLayout {\n    if (_needClearLayout) {\n        _layout = nil;\n        _needClearLayout = NO;\n    }\n}\n\n- (void)setNeedClearLayout {\n    _needClearLayout = YES;\n}\n\n- (void)setNeedUpdateLayout {\n    if (!self.layout) {\n        return;\n    }\n    [self clearLayout];\n    [self updateLayout];\n    [_collectionView.collectionViewLayout invalidateLayout];\n    [self resetPagerViewAtIndex:_indexSection.index < 0 ? 0 :_indexSection.index];\n}\n\n#pragma mark - pager index\n\n- (BOOL)isValidIndexSection:(TYIndexSection)indexSection {\n    return indexSection.index >= 0 && indexSection.index < _numberOfItems && indexSection.section >= 0 && indexSection.section < kPagerViewMaxSectionCount;\n}\n\n- (TYIndexSection)nearlyIndexPathAtDirection:(TYPagerScrollDirection)direction{\n    return [self nearlyIndexPathForIndexSection:_indexSection direction:direction];\n}\n\n- (TYIndexSection)nearlyIndexPathForIndexSection:(TYIndexSection)indexSection direction:(TYPagerScrollDirection)direction {\n    if (indexSection.index < 0 || indexSection.index >= _numberOfItems) {\n        return indexSection;\n    }\n    \n    if (!_isInfiniteLoop) {\n        if (direction == TYPagerScrollDirectionRight && indexSection.index == _numberOfItems - 1) {\n            return _autoScrollInterval > 0 ? TYMakeIndexSection(0, 0) : indexSection;\n        } else if (direction == TYPagerScrollDirectionRight) {\n            return TYMakeIndexSection(indexSection.index+1, 0);\n        }\n        \n        if (indexSection.index == 0) {\n            return _autoScrollInterval > 0 ? TYMakeIndexSection(_numberOfItems - 1, 0) : indexSection;\n        }\n        return TYMakeIndexSection(indexSection.index-1, 0);\n    }\n    \n    if (direction == TYPagerScrollDirectionRight) {\n        if (indexSection.index < _numberOfItems-1) {\n            return TYMakeIndexSection(indexSection.index+1, indexSection.section);\n        }\n        if (indexSection.section >= kPagerViewMaxSectionCount-1) {\n            return TYMakeIndexSection(indexSection.index, kPagerViewMaxSectionCount-1);\n        }\n        return TYMakeIndexSection(0, indexSection.section+1);\n    }\n    \n    if (indexSection.index > 0) {\n        return TYMakeIndexSection(indexSection.index-1, indexSection.section);\n    }\n    if (indexSection.section <= 0) {\n        return TYMakeIndexSection(indexSection.index, 0);\n    }\n    return TYMakeIndexSection(_numberOfItems-1, indexSection.section-1);\n}\n\n- (TYIndexSection)caculateIndexSectionWithOffsetX:(CGFloat)offsetX {\n    if (_numberOfItems <= 0) {\n        return TYMakeIndexSection(0, 0);\n    }\n     UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)_collectionView.collectionViewLayout;\n    CGFloat leftEdge = _isInfiniteLoop ? _layout.sectionInset.left : _layout.onlyOneSectionInset.left;\n    CGFloat width = CGRectGetWidth(_collectionView.frame);\n    CGFloat middleOffset = offsetX + width/2;\n    CGFloat itemWidth = layout.itemSize.width + layout.minimumInteritemSpacing;\n    NSInteger curIndex = 0;\n    NSInteger curSection = 0;\n    if (middleOffset - leftEdge >= 0) {\n        NSInteger itemIndex = (middleOffset - leftEdge+layout.minimumInteritemSpacing/2)/itemWidth;\n        if (itemIndex < 0) {\n            itemIndex = 0;\n        }else if (itemIndex >= _numberOfItems*kPagerViewMaxSectionCount) {\n            itemIndex = _numberOfItems*kPagerViewMaxSectionCount-1;\n        }\n        curIndex = itemIndex%_numberOfItems;\n        curSection = itemIndex/_numberOfItems;\n    }\n    return TYMakeIndexSection(curIndex, curSection);\n}\n\n- (CGFloat)caculateOffsetXAtIndexSection:(TYIndexSection)indexSection{\n    if (_numberOfItems == 0) {\n        return 0;\n    }\n    UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)_collectionView.collectionViewLayout;\n    CGFloat leftEdge = _isInfiniteLoop ? _layout.sectionInset.left : _layout.onlyOneSectionInset.left;\n    CGFloat width = CGRectGetWidth(_collectionView.frame);\n    CGFloat itemWidth = layout.itemSize.width + layout.minimumInteritemSpacing;\n    CGFloat offsetX = leftEdge + itemWidth*(indexSection.index + indexSection.section*_numberOfItems) - layout.minimumInteritemSpacing/2 - (width - itemWidth)/2;\n    return MAX(offsetX, 0);\n}\n\n- (void)resetPagerViewAtIndex:(NSInteger)index {\n    if (index < 0) {\n        return;\n    }\n    if (index >= _numberOfItems) {\n        index = 0;\n    }\n    [self scrollToItemAtIndexSection:TYMakeIndexSection(index, _isInfiniteLoop ? kPagerViewMaxSectionCount/3 : 0) animate:NO];\n    if (!_isInfiniteLoop && _indexSection.index < 0) {\n        [self scrollViewDidScroll:_collectionView];\n    }\n}\n\n- (void)recyclePagerViewIfNeed {\n    if (!_isInfiniteLoop) {\n        return;\n    }\n    if (_indexSection.section > kPagerViewMaxSectionCount - kPagerViewMinSectionCount || _indexSection.section < kPagerViewMinSectionCount) {\n        [self resetPagerViewAtIndex:_indexSection.index];\n    }\n}\n\n#pragma mark - UICollectionViewDataSource\n\n- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {\n    return _isInfiniteLoop ? kPagerViewMaxSectionCount : 1;\n}\n\n- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {\n    _numberOfItems = [_dataSource numberOfItemsInPagerView:self];\n    return _numberOfItems;\n}\n\n- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {\n    _dequeueSection = indexPath.section;\n    if (_dataSourceFlags.cellForItemAtIndex) {\n       return [_dataSource pagerView:self cellForItemAtIndex:indexPath.row];\n    }\n    NSAssert(NO, @\"pagerView cellForItemAtIndex: is nil!\");\n    return nil;\n}\n\n#pragma mark - UICollectionViewDelegateFlowLayout\n\n- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {\n    if (!_isInfiniteLoop) {\n        return _layout.onlyOneSectionInset;\n    }\n    if (section == 0 ) {\n        return _layout.firstSectionInset;\n    }else if (section == kPagerViewMaxSectionCount -1) {\n        return _layout.lastSectionInset;\n    }\n    return _layout.middleSectionInset;\n}\n\n- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {\n    UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];\n    if ([_delegate respondsToSelector:@selector(pagerView:didSelectedItemCell:atIndex:)]) {\n        [_delegate pagerView:self didSelectedItemCell:cell atIndex:indexPath.item];\n    }\n}\n\n#pragma mark - UIScrollViewDelegate\n\n- (void)scrollViewDidScroll:(UIScrollView *)scrollView {\n    if (!_didLayout) {\n        return;\n    }\n    TYIndexSection newIndexSection =  [self caculateIndexSectionWithOffsetX:scrollView.contentOffset.x];\n    if (_numberOfItems <= 0 || ![self isValidIndexSection:newIndexSection]) {\n        NSLog(@\"inVlaidIndexSection:(%ld,%ld)!\",(long)newIndexSection.index,(long)newIndexSection.section);\n        return;\n    }\n    TYIndexSection indexSection = _indexSection;\n    _indexSection = newIndexSection;\n    \n    if (_delegateFlags.pagerViewDidScroll) {\n        [_delegate pagerViewDidScroll:self];\n    }\n    \n    if (_delegateFlags.didScrollFromIndexToNewIndex && !TYEqualIndexSection(_indexSection, indexSection)) {\n        //NSLog(@\"curIndex %ld\",(long)_indexSection.index);\n        [_delegate pagerView:self didScrollFromIndex:MAX(indexSection.index, 0) toIndex:_indexSection.index];\n    }\n}\n\n- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {\n    if (_autoScrollInterval > 0) {\n        [self removeTimer];\n    }\n    _beginDragIndexSection = [self caculateIndexSectionWithOffsetX:scrollView.contentOffset.x];\n    if ([_delegate respondsToSelector:@selector(pagerViewWillBeginDragging:)]) {\n        [_delegate pagerViewWillBeginDragging:self];\n    }\n}\n\n- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {\n    if (fabs(velocity.x) < 0.35 || !TYEqualIndexSection(_beginDragIndexSection, _indexSection)) {\n        targetContentOffset->x = [self caculateOffsetXAtIndexSection:_indexSection];\n        return;\n    }\n    TYPagerScrollDirection direction = TYPagerScrollDirectionRight;\n    if ((scrollView.contentOffset.x < 0 && targetContentOffset->x <= 0) || (targetContentOffset->x < scrollView.contentOffset.x && scrollView.contentOffset.x < scrollView.contentSize.width - scrollView.frame.size.width)) {\n        direction = TYPagerScrollDirectionLeft;\n    }\n    TYIndexSection indexSection = [self nearlyIndexPathForIndexSection:_indexSection direction:direction];\n    targetContentOffset->x = [self caculateOffsetXAtIndexSection:indexSection];\n}\n\n- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {\n    if (_autoScrollInterval > 0) {\n        [self addTimer];\n    }\n    if ([_delegate respondsToSelector:@selector(pagerViewDidEndDragging:willDecelerate:)]) {\n        [_delegate pagerViewDidEndDragging:self willDecelerate:decelerate];\n    }\n}\n\n- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {\n    if ([_delegate respondsToSelector:@selector(pagerViewWillBeginDecelerating:)]) {\n        [_delegate pagerViewWillBeginDecelerating:self];\n    }\n}\n\n- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {\n    [self recyclePagerViewIfNeed];\n    if ([_delegate respondsToSelector:@selector(pagerViewDidEndDecelerating:)]) {\n        [_delegate pagerViewDidEndDecelerating:self];\n    }\n}\n\n- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {\n    [self recyclePagerViewIfNeed];\n    if ([_delegate respondsToSelector:@selector(pagerViewDidEndScrollingAnimation:)]) {\n        [_delegate pagerViewDidEndScrollingAnimation:self];\n    }\n}\n\n#pragma mark - TYCyclePagerTransformLayoutDelegate\n\n- (void)pagerViewTransformLayout:(TYCyclePagerTransformLayout *)pagerViewTransformLayout initializeTransformAttributes:(UICollectionViewLayoutAttributes *)attributes {\n    if (_delegateFlags.initializeTransformAttributes) {\n        [_delegate pagerView:self initializeTransformAttributes:attributes];\n    }\n}\n\n- (void)pagerViewTransformLayout:(TYCyclePagerTransformLayout *)pagerViewTransformLayout applyTransformToAttributes:(UICollectionViewLayoutAttributes *)attributes {\n    if (_delegateFlags.applyTransformToAttributes) {\n        [_delegate pagerView:self applyTransformToAttributes:attributes];\n    }\n}\n\n- (void)layoutSubviews {\n    [super layoutSubviews];\n    BOOL needUpdateLayout = !CGRectEqualToRect(_collectionView.frame, self.bounds);\n    _collectionView.frame = self.bounds;\n    if ((_indexSection.section < 0 || needUpdateLayout) && (_numberOfItems > 0 || _didReloadData)) {\n        _didLayout = YES;\n        [self setNeedUpdateLayout];\n    }\n}\n\n- (void)dealloc {\n    ((TYCyclePagerTransformLayout *)_collectionView.collectionViewLayout).delegate = nil;\n    _collectionView.delegate = nil;\n    _collectionView.dataSource = nil;\n}\n\n@end\n\n\n"
  },
  {
    "path": "Pods/TYCyclePagerView/TYCyclePagerViewDemo/TYCyclePagerView/TYPageControl.h",
    "content": "//\n//  TYPageControl.h\n//  TYCyclePagerViewDemo\n//\n//  Created by tany on 2017/6/20.\n//  Copyright © 2017年 tany. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface TYPageControl : UIControl\n\n@property (nonatomic, assign) NSInteger numberOfPages;          // default is 0\n@property (nonatomic, assign) NSInteger currentPage;            // default is 0. value pinned to 0..numberOfPages-1\n\n@property (nonatomic, assign) BOOL hidesForSinglePage;          // hide the the indicator if there is only one page. default is NO\n\n@property (nonatomic, assign) CGFloat pageIndicatorSpaing;\n@property (nonatomic, assign) UIEdgeInsets contentInset; // center will ignore this\n@property (nonatomic, assign ,readonly) CGSize contentSize; // real content size\n\n// override super \n//@property (nonatomic, assign) UIControlContentVerticalAlignment contentVerticalAlignment;     // how to position content vertically inside control. default is center\n//@property (nonatomic, assign) UIControlContentHorizontalAlignment contentHorizontalAlignment; // how to position content hozontally inside control. default is center\n\n// indicatorTint color\n@property (nullable, nonatomic,strong) UIColor *pageIndicatorTintColor;\n@property (nullable, nonatomic,strong) UIColor *currentPageIndicatorTintColor;\n\n// indicator image\n@property (nullable, nonatomic,strong) UIImage *pageIndicatorImage;\n@property (nullable, nonatomic,strong) UIImage *currentPageIndicatorImage;\n\n@property (nonatomic, assign) UIViewContentMode indicatorImageContentMode; // default is UIViewContentModeCenter\n\n@property (nonatomic, assign) CGSize pageIndicatorSize; // indicator size\n@property (nonatomic, assign) CGSize currentPageIndicatorSize; // default pageIndicatorSize\n\n@property (nonatomic, assign) CGFloat animateDuring; // default 0.3\n\n- (void)setCurrentPage:(NSInteger)currentPage animate:(BOOL)animate;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/TYCyclePagerView/TYCyclePagerViewDemo/TYCyclePagerView/TYPageControl.m",
    "content": "//\n//  TYPageControl.m\n//  TYCyclePagerViewDemo\n//\n//  Created by tany on 2017/6/20.\n//  Copyright © 2017年 tany. All rights reserved.\n//\n\n#import \"TYPageControl.h\"\n\n@interface TYPageControl ()\n// UI\n@property (nonatomic, strong) NSArray<UIImageView *> *indicatorViews;\n\n// Data\n@property (nonatomic, assign) BOOL forceUpdate;\n\n@end\n\n@implementation TYPageControl\n\n#pragma mark - life cycle\n\n- (instancetype)initWithFrame:(CGRect)frame {\n    if (self = [super initWithFrame:frame]) {\n        [self configurePropertys];\n    }\n    return self;\n}\n\n- (instancetype)initWithCoder:(NSCoder *)aDecoder {\n    if (self = [super initWithCoder:aDecoder]) {\n        [self configurePropertys];\n    }\n    return self;\n}\n\n- (void)configurePropertys {\n    self.userInteractionEnabled = NO;\n    _forceUpdate = NO;\n    _animateDuring = 0.3;\n    _pageIndicatorSpaing = 10;\n    _indicatorImageContentMode = UIViewContentModeCenter;\n    _pageIndicatorSize = CGSizeMake(6,6);\n    _currentPageIndicatorSize = _pageIndicatorSize;\n    _pageIndicatorTintColor = [UIColor colorWithRed:128/255. green:128/255. blue:128/255. alpha:1];\n    _currentPageIndicatorTintColor = [UIColor whiteColor];\n}\n\n- (void)willMoveToSuperview:(UIView *)newSuperview {\n    [super willMoveToSuperview:newSuperview];\n    if (newSuperview) {\n        _forceUpdate = YES;\n        [self updateIndicatorViews];\n        _forceUpdate = NO;\n    }\n}\n\n#pragma mark - getter setter\n\n- (CGSize)contentSize {\n    CGFloat width = (_indicatorViews.count - 1) * (_pageIndicatorSize.width + _pageIndicatorSpaing) + _pageIndicatorSize.width + _contentInset.left +_contentInset.right;\n    CGFloat height = _currentPageIndicatorSize.height + _contentInset.top + _contentInset.bottom;\n    return CGSizeMake(width, height);\n}\n\n- (void)setNumberOfPages:(NSInteger)numberOfPages {\n    if (numberOfPages == _numberOfPages) {\n        return;\n    }\n    _numberOfPages = numberOfPages;\n    if (_currentPage >= numberOfPages) {\n        _currentPage = 0;\n    }\n    [self updateIndicatorViews];\n    if (_indicatorViews.count > 0) {\n        [self setNeedsLayout];\n    }\n}\n\n- (void)setCurrentPage:(NSInteger)currentPage {\n    if (_currentPage == currentPage || _indicatorViews.count <= currentPage) {\n        return;\n    }\n    _currentPage = currentPage;\n    if (!CGSizeEqualToSize(_currentPageIndicatorSize, _pageIndicatorSize)) {\n        [self setNeedsLayout];\n    }\n    [self updateIndicatorViewsBehavior];\n    if (self.userInteractionEnabled) {\n        [self sendActionsForControlEvents:UIControlEventValueChanged];\n    }\n}\n\n- (void)setCurrentPage:(NSInteger)currentPage animate:(BOOL)animate {\n    if (animate) {\n        [UIView animateWithDuration:_animateDuring animations:^{\n            [self setCurrentPage:currentPage];\n        }];\n    }else {\n        [self setCurrentPage:currentPage];\n    }\n}\n\n- (void)setPageIndicatorImage:(UIImage *)pageIndicatorImage {\n    _pageIndicatorImage = pageIndicatorImage;\n    [self updateIndicatorViewsBehavior];\n}\n\n- (void)setCurrentPageIndicatorImage:(UIImage *)currentPageIndicatorImage {\n    _currentPageIndicatorImage = currentPageIndicatorImage;\n    [self updateIndicatorViewsBehavior];\n}\n\n- (void)setPageIndicatorTintColor:(UIColor *)pageIndicatorTintColor {\n    _pageIndicatorTintColor = pageIndicatorTintColor;\n    [self updateIndicatorViewsBehavior];\n}\n\n- (void)setCurrentPageIndicatorTintColor:(UIColor *)currentPageIndicatorTintColor {\n    _currentPageIndicatorTintColor = currentPageIndicatorTintColor;\n    [self updateIndicatorViewsBehavior];\n}\n\n- (void)setPageIndicatorSize:(CGSize)pageIndicatorSize {\n    if (CGSizeEqualToSize(_pageIndicatorSize, pageIndicatorSize)) {\n        return;\n    }\n    _pageIndicatorSize = pageIndicatorSize;\n    if (CGSizeEqualToSize(_currentPageIndicatorSize, CGSizeZero) || (_currentPageIndicatorSize.width < pageIndicatorSize.width && _currentPageIndicatorSize.height < pageIndicatorSize.height)) {\n        _currentPageIndicatorSize = pageIndicatorSize;\n    }\n    if (_indicatorViews.count > 0) {\n        [self setNeedsLayout];\n    }\n}\n\n- (void)setPageIndicatorSpaing:(CGFloat)pageIndicatorSpaing {\n    _pageIndicatorSpaing = pageIndicatorSpaing;\n    if (_indicatorViews.count > 0) {\n        [self setNeedsLayout];\n    }\n}\n\n- (void)setCurrentPageIndicatorSize:(CGSize)currentPageIndicatorSize {\n    if (CGSizeEqualToSize(_currentPageIndicatorSize, currentPageIndicatorSize)) {\n        return;\n    }\n    _currentPageIndicatorSize = currentPageIndicatorSize;\n    if (_indicatorViews.count > 0) {\n        [self setNeedsLayout];\n    }\n}\n\n- (void)setContentHorizontalAlignment:(UIControlContentHorizontalAlignment)contentHorizontalAlignment {\n    [super setContentHorizontalAlignment:contentHorizontalAlignment];\n    if (_indicatorViews.count > 0) {\n        [self setNeedsLayout];\n    }\n}\n\n- (void)setContentVerticalAlignment:(UIControlContentVerticalAlignment)contentVerticalAlignment {\n    [super setContentVerticalAlignment:contentVerticalAlignment];\n    if (_indicatorViews.count > 0) {\n        [self setNeedsLayout];\n    }\n}\n\n#pragma mark - update indicator\n\n- (void)updateIndicatorViews {\n    if (!self.superview && !_forceUpdate) {\n        return;\n    }\n    if (_indicatorViews.count == _numberOfPages) {\n        [self updateIndicatorViewsBehavior];\n        return;\n    }\n    NSMutableArray *indicatorViews = _indicatorViews ? [_indicatorViews mutableCopy] :[NSMutableArray array];\n    if (indicatorViews.count < _numberOfPages) {\n        for (NSInteger idx = indicatorViews.count; idx < _numberOfPages; ++idx) {\n            UIImageView *indicatorView = [[UIImageView alloc]init];\n            indicatorView.contentMode = _indicatorImageContentMode;\n            [self addSubview:indicatorView];\n            [indicatorViews addObject:indicatorView];\n        }\n    }else if (indicatorViews.count > _numberOfPages) {\n        for (NSInteger idx = indicatorViews.count - 1; idx >= _numberOfPages; --idx) {\n            UIImageView *indicatorView = indicatorViews[idx];\n            [indicatorView removeFromSuperview];\n            [indicatorViews removeObjectAtIndex:idx];\n        }\n    }\n    _indicatorViews = [indicatorViews copy];\n    [self updateIndicatorViewsBehavior];\n}\n\n- (void)updateIndicatorViewsBehavior {\n    if (_indicatorViews.count == 0 || (!self.superview && !_forceUpdate)) {\n        return;\n    }\n    if (_hidesForSinglePage && _indicatorViews.count == 1) {\n        UIImageView *indicatorView = _indicatorViews.lastObject;\n        indicatorView.hidden = YES;\n    }\n    NSInteger index = 0;\n    for (UIImageView *indicatorView in _indicatorViews) {\n        if (_pageIndicatorImage) {\n            indicatorView.contentMode = _indicatorImageContentMode;\n            indicatorView.image = _currentPage == index ? _currentPageIndicatorImage : _pageIndicatorImage;\n        }else {\n            indicatorView.image = nil;\n            indicatorView.backgroundColor = _currentPage == index ? _currentPageIndicatorTintColor : _pageIndicatorTintColor;\n        }\n        indicatorView.hidden = NO;\n        ++index;\n    }\n}\n\n#pragma mark - layout\n\n- (void)layoutIndicatorViews {\n    if (_indicatorViews.count == 0) {\n        return;\n    }\n    CGFloat orignX = 0;\n    CGFloat centerY = 0;\n    CGFloat pageIndicatorSpaing = _pageIndicatorSpaing;\n    switch (self.contentHorizontalAlignment) {\n        case UIControlContentHorizontalAlignmentCenter:\n            // ignore contentInset\n            orignX = (CGRectGetWidth(self.frame) - (_indicatorViews.count - 1) * (_pageIndicatorSize.width + _pageIndicatorSpaing) - _pageIndicatorSize.width)/2;\n            break;\n        case UIControlContentHorizontalAlignmentLeft:\n            orignX = _contentInset.left;\n            break;\n        case UIControlContentHorizontalAlignmentRight:\n            orignX = CGRectGetWidth(self.frame) - ((_indicatorViews.count - 1) * (_pageIndicatorSize.width + _pageIndicatorSpaing) - _pageIndicatorSize.width) - _contentInset.right;\n            break;\n        case UIControlContentHorizontalAlignmentFill:\n            orignX = _contentInset.left;\n            if (_indicatorViews.count > 1) {\n                pageIndicatorSpaing = (CGRectGetWidth(self.frame) - _contentInset.left - _contentInset.right - _pageIndicatorSize.width - (_indicatorViews.count - 1) * _pageIndicatorSize.width)/(_indicatorViews.count - 1);\n            }\n            break;\n        default:\n            break;\n    }\n    switch (self.contentVerticalAlignment) {\n        case UIControlContentVerticalAlignmentCenter:\n            centerY = CGRectGetHeight(self.frame)/2;\n            break;\n        case UIControlContentVerticalAlignmentTop:\n            centerY = _contentInset.top + _currentPageIndicatorSize.height/2;\n            break;\n        case UIControlContentVerticalAlignmentBottom:\n            centerY = CGRectGetHeight(self.frame) - _currentPageIndicatorSize.height/2 - _contentInset.bottom;\n            break;\n        case UIControlContentVerticalAlignmentFill:\n            centerY = (CGRectGetHeight(self.frame) - _contentInset.top - _contentInset.bottom)/2 + _contentInset.top;\n            break;\n        default:\n            break;\n    }\n    NSInteger index = 0;\n    for (UIImageView *indicatorView in _indicatorViews) {\n        if (_pageIndicatorImage) {\n            indicatorView.layer.cornerRadius = 0;\n        }else {\n            indicatorView.layer.cornerRadius = _currentPage == index ? _currentPageIndicatorSize.width/2 : _pageIndicatorSize.width/2;\n        }\n        CGSize size = index == _currentPage ? _currentPageIndicatorSize : _pageIndicatorSize;\n        indicatorView.frame = CGRectMake(orignX - (size.width - _pageIndicatorSize.width)/2, centerY - size.height/2, size.width, size.height);\n        orignX += _pageIndicatorSize.width + pageIndicatorSpaing;\n        ++index;\n    }\n}\n\n- (void)layoutSubviews {\n    [super layoutSubviews];\n    [self layoutIndicatorViews];\n}\n\n@end\n"
  },
  {
    "path": "Pods/TYPagerController/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 tany\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "Pods/TYPagerController/README.md",
    "content": "# TYPagerController v2.0\nTYPagerController 简单，强大，高度定制，页面控制器,水平滚动内容和标题栏,包含多种barStyle。<br>\nTYPagerController v2.0 重构优化代码，分离出TYPagerViewLayout布局类,添加更多功能，更加强大。<br>\n如果还想使用以前的版本可以查看分支v1.0.6 和 pod 'TYPagerController', '~> 1.0.6' <br>\n\n* TYPagerViewLayout 水平滚动页面的layout类，只需要initWithScrollView:即可实现水平滚动页面.\n* TYPagerView 包含TYPagerViewLayout的水平滚动页面View\n* TYPagerController 包含TYPagerViewLayout的水平滚动页面Controller。\n* TYTabPagerBar Pager的标题 tabBar\n* TYTabPagerView 包含TabBar的TYPagerView\n* TYTabPagerController 包含TabBar的TYPagerController\n\n更详细的使用请看[LovePlayNews](https://github.com/12207480/LovePlayNews)项目\n\n## CocoaPods\n```\npod 'TYPagerController'\n```\n\n## Requirements\n* Xcode 7 or higher\n* iOS 7.0 or higher\n* ARC\n\n## ScreenShot\n### TYPagerBarStyle\n\nNew TYPagerBarStyleProgressElasticView<br>\n![image](https://github.com/12207480/TYPagerController/blob/master/ScreenShot/TYPagerController6.gif)\n\n1 TYPagerBarStyleProgressBounceView<br>\n![image](https://raw.githubusercontent.com/12207480/TYPagerController/master/ScreenShot/TYPagerController1.gif)\n\n2 TYPagerBarStyleProgressView<br>\n![image](https://raw.githubusercontent.com/12207480/TYPagerController/master/ScreenShot/TYPagerController2.gif)\n\n3 TYPagerBarStyleCoverView<br>\n![image](https://raw.githubusercontent.com/12207480/TYPagerController/master/ScreenShot/TYPagerController3.gif)\n![image](https://raw.githubusercontent.com/12207480/TYPagerController/master/ScreenShot/TYPagerController7.gif)\n\n4 TYPagerBarStyleNoneView<br>\n![image](https://raw.githubusercontent.com/12207480/TYPagerController/master/ScreenShot/TYPagerController4.gif)\n\n## API\n\n### Class\n* TYPagerViewLayout\n```objc\n@interface TYPagerViewLayout<__covariant ItemType> : NSObject\n\n@property (nonatomic, weak, nullable) id<TYPagerViewLayoutDataSource> dataSource;\n@property (nonatomic, weak, nullable) id<TYPagerViewLayoutDelegate> delegate;\n\n// strong,will control the delegate,don't set delegate on other place.\n@property (nonatomic, strong, readonly) UIScrollView *scrollView;\n// if viewcontroller's automaticallyAdjustsScrollViewInsets YES ,will cause frame problems, you can set YES, default YES\n@property (nonatomic, assign) BOOL adjustScrollViewInset;\n\n@property (nonatomic, assign, readonly) NSInteger countOfPagerItems;\n@property (nonatomic, assign, readonly) NSInteger curIndex;// default -1\n\n@property (nonatomic, strong, readonly) NSCache<NSNumber *,ItemType> *memoryCache;; // will cache pagerView,you can set countLimit\n@property (nonatomic, assign) BOOL autoMemoryCache; // default YES\n\n@property (nonatomic, assign) NSInteger prefetchItemCount;// preload left and right item's count , default 0\n\n@property (nonatomic, assign, readonly) NSRange prefetchRange;\n@property (nonatomic, assign, readonly) NSRange visibleRange;\n\n@property (nonatomic, strong, nullable, readonly) NSArray<NSNumber *> * visibleIndexs;\n@property (nonatomic, strong, nullable, readonly) NSArray<ItemType> * visibleItems;\n\n// default YES, if NO,will not call delegate transitionFromIndex:toIndex:progress:,but will call transitionFromIndex:toIndex:\n@property (nonatomic, assign) BOOL progressAnimateEnabel;\n\n// default NO, when scroll visible range change will add item.If YES add item only when scroll animate end, suggest set prefetchItemCount 1 or more\n@property (nonatomic, assign) BOOL addVisibleItemOnlyWhenScrollAnimatedEnd;\n\n// default 0.5,when scroll progress percent will change index, only progressAnimateEnabel is NO or don't implement delegate transitionFromIndex: toIndex: progress:\n@property (nonatomic, assign) CGFloat changeIndexWhenScrollProgress;\n```\n* TYPagerView\n```objc\n@interface TYPagerView : UIView\n\n@property (nonatomic, weak, nullable) id<TYPagerViewDataSource> dataSource;\n@property (nonatomic, weak, nullable) id<TYPagerViewDelegate> delegate;\n// pagerView's layout,don't set layout's dataSource to other\n@property (nonatomic, strong, readonly) TYPagerViewLayout<UIView *> *layout;\n@property (nonatomic, strong, readonly) UIScrollView *scrollView;\n\n@property (nonatomic, assign, readonly) NSInteger countOfPagerViews;\n@property (nonatomic, assign, readonly) NSInteger curIndex;// default -1\n\n@property (nonatomic, assign, nullable, readonly) NSArray<UIView *> *visibleViews;\n\n@property (nonatomic, assign) UIEdgeInsets contentInset;\n\n//if not visible, prefecth, cache view at index, return nil\n- (UIView *_Nullable)viewForIndex:(NSInteger)index;\n\n// register && dequeue's usage like tableView\n- (void)registerClass:(Class)Class forViewWithReuseIdentifier:(NSString *)identifier;\n- (void)registerNib:(UINib *)nib forViewWithReuseIdentifier:(NSString *)identifier;\n- (UIView *)dequeueReusableViewWithReuseIdentifier:(NSString *)identifier forIndex:(NSInteger)index;\n\n// scroll to index\n- (void)scrollToViewAtIndex:(NSInteger)index animate:(BOOL)animate;\n\n// update data and layout,but don't reset propertys(curIndex,visibleDatas,prefechDatas)\n- (void)updateData;\n\n// reload data and reset propertys\n- (void)reloadData;\n```\n```objc\n@protocol TYTabPagerControllerDelegate <TYPagerControllerDelegate>\n\n// configre collectionview cell\n- (void)pagerController:(TYTabPagerController *)pagerController configreCell:(UICollectionViewCell *)cell forItemTitle:(NSString *)title atIndexPath:(NSIndexPath *)indexPath;\n\n// transition frome cell to cell with animated\n- (void)pagerController:(TYTabPagerController *)pagerController transitionFromeCell:(UICollectionViewCell *)fromCell toCell:(UICollectionViewCell *)toCell animated:(BOOL)animated;\n\n// transition frome cell to cell with progress\n- (void)pagerController:(TYTabPagerController *)pagerController transitionFromeCell:(UICollectionViewCell *)fromCell toCell:(UICollectionViewCell *)toCell progress:(CGFloat)progress;\n\n@end\n```\n* TYPagerController\n```objc\n@interface TYPagerController : UIViewController\n\n@property (nonatomic, weak, nullable) id<TYPagerControllerDataSource> dataSource;\n@property (nonatomic, weak, nullable) id<TYPagerControllerDelegate>   delegate;\n// pagerController's layout,don't set layout's dataSource to other\n@property (nonatomic, strong, readonly) TYPagerViewLayout<UIViewController *> *layout;\n@property (nonatomic, weak, readonly) UIScrollView *scrollView;\n\n@property (nonatomic, assign, readonly) NSInteger countOfControllers;\n@property (nonatomic, assign, readonly) NSInteger curIndex;// default -1\n\n@property (nonatomic, strong, nullable, readonly) NSArray<UIViewController *> *visibleControllers;\n\n@property (nonatomic, assign) UIEdgeInsets contentInset;\n\n//if not visible, prefecth, cache view at index, return nil\n- (UIViewController *_Nullable)controllerForIndex:(NSInteger)index;\n\n// register && dequeue's usage like tableView\n- (void)registerClass:(Class)Class forControllerWithReuseIdentifier:(NSString *)identifier;\n- (void)registerNib:(UINib *)nib forControllerWithReuseIdentifier:(NSString *)identifier;\n- (UIViewController *)dequeueReusableControllerWithReuseIdentifier:(NSString *)identifier forIndex:(NSInteger)index;\n\n// scroll to index\n- (void)scrollToControllerAtIndex:(NSInteger)index animate:(BOOL)animate;\n\n//  update data and layout,but don't reset propertys(curIndex,visibleDatas,prefechDatas)\n- (void)updateData;\n\n// reload data and reset propertys\n- (void)reloadData;\n```\n\n##Usage Demo\n* TYTabPagerView\n```objc\n- (void)addTabPagerView {\n    TYTabPagerView *pagerView = [[TYTabPagerView alloc]init];\n    pagerView.tabBar.layout.barStyle = TYPagerBarStyleCoverView;\n    pagerView.tabBar.progressView.backgroundColor = [UIColor lightGrayColor];\n    pagerView.dataSource = self;\n    pagerView.delegate = self;\n    [self.view addSubview:pagerView];\n    _pagerView = pagerView;\n}\n\n#pragma mark - TYTabPagerViewDataSource\n\n- (NSInteger)numberOfViewsInTabPagerView {\n    return _datas.count;\n}\n\n- (UIView *)tabPagerView:(TYTabPagerView *)tabPagerView viewForIndex:(NSInteger)index prefetching:(BOOL)prefetching {\n    UIView *view = [[UIView alloc]initWithFrame:[tabPagerView.layout frameForItemAtIndex:index]];\n    view.backgroundColor = [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 blue:arc4random()%255/255.0 alpha:arc4random()%255/255.0];\n    //NSLog(@\"viewForIndex:%ld prefetching:%d\",index,prefetching);\n    return view;\n}\n\n- (NSString *)tabPagerView:(TYTabPagerView *)tabPagerView titleForIndex:(NSInteger)index {\n    NSString *title = _datas[index];\n    return title;\n}\n```\n\n* TYTabPagerController\n```objc\n@interface TabPagerControllerDemoController : TYTabPagerController\n\n- (void)viewDidLoad {\n    [super viewDidLoad];\n    // Do any additional setup after loading the view.\n    self.title = @\"TabPagerControllerDemoController\";\n    self.tabBar.layout.barStyle = TYPagerBarStyleProgressView;\n    self.dataSource = self;\n    self.delegate = self;\n    \n    [self loadData];\n}\n\n#pragma mark - TYTabPagerControllerDataSource\n\n- (NSInteger)numberOfControllersInTabPagerController {\n    return _datas.count;\n}\n\n- (UIViewController *)tabPagerController:(TYTabPagerController *)tabPagerController controllerForIndex:(NSInteger)index prefetching:(BOOL)prefetching {\n    if (index%3 == 0) {\n        CustomViewController *VC = [[CustomViewController alloc]init];\n        VC.text = [@(index) stringValue];\n        return VC;\n    }else if (index%3 == 1) {\n        ListViewController *VC = [[ListViewController alloc]init];\n        VC.text = [@(index) stringValue];\n        return VC;\n    }else {\n        CollectionViewController *VC = [[CollectionViewController alloc]init];\n        VC.text = [@(index) stringValue];\n        return VC;\n    }\n}\n\n- (NSString *)tabPagerController:(TYTabPagerController *)tabPagerController titleForIndex:(NSInteger)index {\n    NSString *title = _datas[index];\n    return title;\n}\n```\n\n\n更多的使用方法 请查看 demo。\n\n### Contact\n如果你发现bug，please pull reqeust me <br>\n如果你有更好的改进，please pull reqeust me <br>\n"
  },
  {
    "path": "Pods/TYPagerController/TYPagerControllerDemo/TYPagerController/TYPagerController.h",
    "content": "//\n//  TYPagerController.h\n//  TYPagerControllerDemo\n//\n//  Created by tanyang on 16/4/13.\n//  Copyright © 2016年 tanyang. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import \"TYPagerViewLayout.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n@class TYPagerController;\n@protocol TYPagerControllerDataSource <NSObject>\n\n// viewController's count in pagerController\n- (NSInteger)numberOfControllersInPagerController;\n\n/* 1.viewController at index in pagerController\n   2.if prefetching is YES,the controller is preload,not display.\n   3.if controller will display,will call viewWillAppear.\n   4.you can register && dequeue controller, usage like tableView\n */\n- (UIViewController *)pagerController:(TYPagerController *)pagerController controllerForIndex:(NSInteger)index prefetching:(BOOL)prefetching;\n\n@end\n\n@protocol TYPagerControllerDelegate <NSObject>\n\n@optional\n\n// Display customization\n// the same to viewWillAppear, also can use viewController's viewWillAppear\n- (void)pagerController:(TYPagerController *)pagerController viewWillAppear:(UIViewController *)viewController forIndex:(NSInteger)index;\n- (void)pagerController:(TYPagerController *)pagerController viewDidAppear:(UIViewController *)viewController forIndex:(NSInteger)index;\n\n// Disappear customization\n// the same to viewWillDisappear, also can use viewController's viewWillDisappear\n- (void)pagerController:(TYPagerController *)pagerController viewWillDisappear:(UIViewController *)viewController forIndex:(NSInteger)index;\n- (void)pagerController:(TYPagerController *)pagerController viewDidDisappear:(UIViewController *)viewController forIndex:(NSInteger)index;\n\n// Transition animation customization\n\n- (void)pagerController:(TYPagerController *)pagerController transitionFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex animated:(BOOL)animated;\n\n- (void)pagerController:(TYPagerController *)pagerController transitionFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex progress:(CGFloat)progress;\n\n\n// ScrollViewDelegate\n\n- (void)pagerControllerDidScroll:(TYPagerController *)pagerController;\n- (void)pagerControllerWillBeginScrolling:(TYPagerController *)pagerController animate:(BOOL)animate;\n- (void)pagerControllerDidEndScrolling:(TYPagerController *)pagerController animate:(BOOL)animate;\n\n@end\n\n@interface TYPagerController : UIViewController\n\n@property (nonatomic, weak, nullable) id<TYPagerControllerDataSource> dataSource;\n@property (nonatomic, weak, nullable) id<TYPagerControllerDelegate>   delegate;\n// pagerController's layout,don't set layout's dataSource to other\n@property (nonatomic, strong, readonly) TYPagerViewLayout<UIViewController *> *layout;\n@property (nonatomic, weak, readonly) UIScrollView *scrollView;\n\n@property (nonatomic, assign, readonly) NSInteger countOfControllers;\n@property (nonatomic, assign, readonly) NSInteger curIndex;// default -1\n\n@property (nonatomic, strong, nullable, readonly) NSArray<UIViewController *> *visibleControllers;\n\n@property (nonatomic, assign) BOOL automaticallySystemManagerViewAppearanceMethods;// default YES.if YES system auto call view Appearance Methods(eg. viewWillAppear...)\n\n@property (nonatomic, assign) UIEdgeInsets contentInset;\n\n//if not visible, prefecth, cache view at index, return nil\n- (UIViewController *_Nullable)controllerForIndex:(NSInteger)index;\n\n// register && dequeue's usage like tableView\n- (void)registerClass:(Class)Class forControllerWithReuseIdentifier:(NSString *)identifier;\n- (void)registerNib:(UINib *)nib forControllerWithReuseIdentifier:(NSString *)identifier;\n- (UIViewController *)dequeueReusableControllerWithReuseIdentifier:(NSString *)identifier forIndex:(NSInteger)index;\n\n// scroll to index\n- (void)scrollToControllerAtIndex:(NSInteger)index animate:(BOOL)animate;\n\n//  update data and layout,but don't reset propertys(curIndex,visibleDatas,prefechDatas)\n- (void)updateData;\n\n// reload data and reset propertys\n- (void)reloadData;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/TYPagerController/TYPagerControllerDemo/TYPagerController/TYPagerController.m",
    "content": "//\n//  TYPagerController.m\n//  TYPagerControllerDemo\n//\n//  Created by tanyang on 16/4/13.\n//  Copyright © 2016年 tanyang. All rights reserved.\n//\n\n#import \"TYPagerController.h\"\n\n@interface TYPagerController ()<TYPagerViewLayoutDataSource, TYPagerViewLayoutDelegate> {\n    // private\n    struct {\n        unsigned int viewWillAppearForIndex :1;\n        unsigned int viewDidAppearForIndex :1;\n        unsigned int viewWillDisappearForIndex :1;\n        unsigned int viewDidDisappearForIndex :1;\n        \n        unsigned int transitionFromIndexToIndex :1;\n        unsigned int transitionFromIndexToIndexProgress :1;\n        unsigned int viewDidScroll: 1;\n        unsigned int viewWillBeginScrolling: 1;\n        unsigned int viewDidEndScrolling: 1;\n    }_delegateFlags;\n}\n\n// Data\n@property (nonatomic, strong) TYPagerViewLayout<UIViewController *> *layout;\n\n@end\n\n\n@implementation TYPagerController\n\n- (TYPagerViewLayout<UIViewController *> *)layout {\n    if (!_layout) {\n        UIScrollView *scrollView = [[UIScrollView alloc]init];\n        TYPagerViewLayout<UIViewController *> *layout = [[TYPagerViewLayout alloc]initWithScrollView:scrollView];\n        layout.dataSource = self;\n        layout.delegate = self;\n        layout.adjustScrollViewInset = YES;\n        _layout = layout;\n    }\n    return _layout;\n}\n\n- (instancetype)initWithCoder:(NSCoder *)aDecoder {\n    if (self = [super initWithCoder:aDecoder]) {\n        _automaticallySystemManagerViewAppearanceMethods = YES;\n    }\n    return self;\n}\n\n- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {\n    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {\n        _automaticallySystemManagerViewAppearanceMethods = YES;\n    }\n    return self;\n}\n\n#pragma mark - life cycle\n\n- (void)viewDidLoad {\n    [super viewDidLoad];\n    // Do any additional setup after loading the view.\n    self.view.backgroundColor = [UIColor whiteColor];\n    \n    [self.view addSubview:self.layout.scrollView];\n}\n\n- (void)viewWillAppear:(BOOL)animated {\n    [super viewWillAppear:animated];\n    _layout.scrollView.frame = UIEdgeInsetsInsetRect(self.view.bounds,_contentInset);\n}\n\n- (void)viewWillLayoutSubviews\n{\n    [super viewWillLayoutSubviews];\n    _layout.scrollView.frame = UIEdgeInsetsInsetRect(self.view.bounds,_contentInset);\n}\n\n#pragma mark - getter && setter\n\n- (void)setDelegate:(id<TYPagerControllerDelegate>)delegate\n{\n    _delegate = delegate;\n    \n    _delegateFlags.viewWillAppearForIndex = [delegate respondsToSelector:@selector(pagerController:viewWillAppear:forIndex:)];\n    _delegateFlags.viewDidAppearForIndex = [delegate respondsToSelector:@selector(pagerController:viewDidAppear:forIndex:)];\n    _delegateFlags.viewWillDisappearForIndex = [delegate respondsToSelector:@selector(pagerController:viewWillDisappear:forIndex:)];\n    _delegateFlags.viewDidDisappearForIndex = [delegate respondsToSelector:@selector(pagerController:viewDidDisappear:forIndex:)];\n    \n    _delegateFlags.transitionFromIndexToIndex = [delegate respondsToSelector:@selector(pagerController:transitionFromIndex:toIndex:animated:)];\n    _delegateFlags.transitionFromIndexToIndexProgress = [delegate respondsToSelector:@selector(pagerController:transitionFromIndex:toIndex:progress:)];\n    \n    _delegateFlags.viewDidScroll = [delegate respondsToSelector:@selector(pagerControllerDidScroll:)];\n    _delegateFlags.viewWillBeginScrolling = [delegate respondsToSelector:@selector(pagerControllerWillBeginScrolling:animate:)];\n    _delegateFlags.viewDidEndScrolling = [delegate respondsToSelector:@selector(pagerControllerDidEndScrolling:animate:)];\n}\n\n- (NSInteger)curIndex {\n    return _layout.curIndex;\n}\n\n- (NSInteger)countOfControllers {\n    return _layout.countOfPagerItems;\n}\n\n- (NSArray<UIViewController *> *)visibleControllers {\n    return _layout.visibleItems;\n}\n\n- (UIScrollView *)scrollView {\n    return _layout.scrollView;\n}\n\n- (void)setContentInset:(UIEdgeInsets)contentInset {\n    _contentInset = contentInset;\n    [self.view setNeedsLayout];\n}\n\n- (BOOL)shouldAutomaticallyForwardAppearanceMethods {\n    return _automaticallySystemManagerViewAppearanceMethods;\n}\n\n- (void)childViewController:(UIViewController *)childViewController BeginAppearanceTransition:(BOOL)isAppearing animated:(BOOL)animated {\n    if (!_automaticallySystemManagerViewAppearanceMethods) {\n        [childViewController beginAppearanceTransition:isAppearing animated:YES];\n    }\n}\n\n- (void)childViewControllerEndAppearanceTransition:(UIViewController *)childViewController {\n    if (!_automaticallySystemManagerViewAppearanceMethods) {\n        [childViewController endAppearanceTransition];\n    }\n}\n\n#pragma mark - public method\n\n- (UIViewController *)controllerForIndex:(NSInteger)index {\n    return [_layout itemForIndex:index];\n}\n\n- (void)scrollToControllerAtIndex:(NSInteger)index animate:(BOOL)animate {\n    [_layout scrollToItemAtIndex:index animate:animate];\n}\n\n- (void)updateData {\n    [_layout updateData];\n}\n\n- (void)reloadData {\n    [_layout reloadData];\n}\n\n- (void)registerClass:(Class)Class forControllerWithReuseIdentifier:(NSString *)identifier {\n    [_layout registerClass:Class forItemWithReuseIdentifier:identifier];\n}\n- (void)registerNib:(UINib *)nib forControllerWithReuseIdentifier:(NSString *)identifier {\n    [_layout registerNib:nib forItemWithReuseIdentifier:identifier];\n}\n- (UIViewController *)dequeueReusableControllerWithReuseIdentifier:(NSString *)identifier forIndex:(NSInteger)index {\n    return [_layout dequeueReusableItemWithReuseIdentifier:identifier forIndex:index];\n}\n\n#pragma mark - private\n\n- (void)willBeginScrollingAnimate:(BOOL)animate {\n    if (_delegateFlags.viewWillBeginScrolling) {\n        [_delegate pagerControllerWillBeginScrolling:self animate:animate];\n    }\n}\n\n- (void)didEndScrollingAnimate:(BOOL)animate {\n    if (_delegateFlags.viewDidEndScrolling) {\n        [_delegate pagerControllerDidEndScrolling:self animate:animate];\n    }\n}\n\n#pragma mark - TYPagerViewLayoutDataSource\n\n- (NSInteger)numberOfItemsInPagerViewLayout {\n    return [_dataSource numberOfControllersInPagerController];\n}\n\n- (id)pagerViewLayout:(TYPagerViewLayout *)pagerViewLayout itemForIndex:(NSInteger)index prefetching:(BOOL)prefetching {\n    return [_dataSource pagerController:self controllerForIndex:index prefetching:prefetching];\n}\n- (id)pagerViewLayout:(TYPagerViewLayout *)pagerViewLayout viewForItem:(id)item atIndex:(NSInteger)index {\n    UIViewController *viewController = item;\n    return viewController.view;\n}\n\n- (void)pagerViewLayout:(TYPagerViewLayout *)pagerViewLayout addVisibleItem:(id)item atIndex:(NSInteger)index {\n    UIViewController *viewController = item;\n    if (_delegateFlags.viewWillAppearForIndex) {\n        [_delegate pagerController:self viewWillAppear:viewController forIndex:index];\n    }\n    // addChildViewController\n    [self addChildViewController:viewController];\n    [self childViewController:viewController BeginAppearanceTransition:YES animated:YES];\n    [pagerViewLayout.scrollView addSubview:viewController.view];\n    [self childViewControllerEndAppearanceTransition:viewController];\n    [viewController didMoveToParentViewController:self];\n    if (_delegateFlags.viewDidAppearForIndex) {\n        [_delegate pagerController:self viewDidAppear:viewController forIndex:index];\n    }\n}\n\n- (void)pagerViewLayout:(TYPagerViewLayout *)pagerViewLayout removeInVisibleItem:(id)item atIndex:(NSInteger)index {\n    UIViewController *viewController = item;\n    if (_delegateFlags.viewWillDisappearForIndex) {\n        [_delegate pagerController:self viewWillDisappear:viewController forIndex:index];\n    }\n    // removeChildViewController\n    [viewController willMoveToParentViewController:nil];\n    [self childViewController:viewController BeginAppearanceTransition:NO animated:YES];\n    [viewController.view removeFromSuperview];\n    [self childViewControllerEndAppearanceTransition:viewController];\n    [viewController removeFromParentViewController];\n    if (_delegateFlags.viewDidDisappearForIndex) {\n        [_delegate pagerController:self viewDidDisappear:viewController forIndex:index];\n    }\n}\n\n#pragma mark - TYPagerViewLayoutDelegate\n\n- (void)pagerViewLayout:(TYPagerViewLayout *)pagerViewLayout transitionFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex animated:(BOOL)animated {\n    if (_delegateFlags.transitionFromIndexToIndex) {\n        [_delegate pagerController:self transitionFromIndex:fromIndex toIndex:toIndex animated:animated];\n    }\n}\n\n- (void)pagerViewLayout:(TYPagerViewLayout *)pagerViewLayout transitionFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex progress:(CGFloat)progress {\n    if (_delegateFlags.transitionFromIndexToIndexProgress) {\n        [_delegate pagerController:self transitionFromIndex:fromIndex toIndex:toIndex progress:progress];\n    }\n}\n\n- (void)pagerViewLayoutDidScroll:(TYPagerViewLayout *)pagerViewLayout {\n    if (_delegateFlags.viewDidScroll) {\n        [_delegate pagerControllerDidScroll:self];\n    }\n}\n\n- (void)pagerViewLayoutWillBeginDragging:(TYPagerViewLayout *)pagerViewLayout {\n    [self willBeginScrollingAnimate:YES];\n}\n\n- (void)pagerViewLayoutWillBeginScrollToView:(TYPagerViewLayout *)pagerViewLayout animate:(BOOL)animate {\n    [self willBeginScrollingAnimate:animate];\n}\n\n- (void)pagerViewLayoutDidEndDecelerating:(TYPagerViewLayout *)pagerViewLayout {\n    [self didEndScrollingAnimate:YES];\n}\n\n- (void)pagerViewLayoutDidEndScrollToView:(TYPagerViewLayout *)pagerViewLayout animate:(BOOL)animate {\n    [self didEndScrollingAnimate:animate];\n}\n\n- (void)pagerViewLayoutDidEndScrollingAnimation:(TYPagerViewLayout *)pagerViewLayout {\n    [self didEndScrollingAnimate:YES];\n}\n\n- (void)dealloc\n{\n    _layout = nil;\n}\n\n@end\n"
  },
  {
    "path": "Pods/TYPagerController/TYPagerControllerDemo/TYPagerController/TYPagerView.h",
    "content": "//\n//  TYPagerView.h\n//  TYPagerControllerDemo\n//\n//  Created by tany on 2017/7/5.\n//  Copyright © 2017年 tanyang. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import \"TYPagerViewLayout.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n@class TYPagerView;\n@protocol TYPagerViewDataSource <NSObject>\n\n- (NSInteger)numberOfViewsInPagerView;\n\n/* 1.if prefetching is YES, the prefetch view not display.\n   2.if view will diaplay,will call willAppearView:forIndex:.\n   3.layout.frameForItemAtIndex can get view's frame\n   4.you can register && dequeue view, usage like tableView\n */\n- (UIView *)pagerView:(TYPagerView *)pagerView viewForIndex:(NSInteger)index prefetching:(BOOL)prefetching;\n\n@end\n\n@protocol TYPagerViewDelegate <NSObject>\n@optional\n\n// Display customization\n// if want do something in view will display,you can implement this\n- (void)pagerView:(TYPagerView *)pagerView willAppearView:(UIView *)view forIndex:(NSInteger)index;\n- (void)pagerView:(TYPagerView *)pagerView didAppearView:(UIView *)view forIndex:(NSInteger)index;\n\n// Disappear customization\n\n- (void)pagerView:(TYPagerView *)pagerView willDisappearView:(UIView *)view forIndex:(NSInteger)index;\n- (void)pagerView:(TYPagerView *)pagerView didDisappearView:(UIView *)view forIndex:(NSInteger)index;\n\n// Transition animation customization\n\n// if you implement ↓↓↓transitionFromIndex:toIndex:progress:,only tap change index will call this, you can set progressAnimateEnabel NO that not call progress method\n- (void)pagerView:(TYPagerView *)pagerView transitionFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex animated:(BOOL)animated;\n\n// if you implement the method,also you need implement ↑↑↑transitionFromIndex:toIndex:animated:,deal with tap change index animate\n- (void)pagerView:(TYPagerView *)pagerView  transitionFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex progress:(CGFloat)progress;\n\n// scrollView delegate\n\n- (void)pagerViewDidScroll:(TYPagerView *)pageView;\n- (void)pagerViewWillBeginScrolling:(TYPagerView *)pageView animate:(BOOL)animate;\n- (void)pagerViewDidEndScrolling:(TYPagerView *)pageView animate:(BOOL)animate;\n\n\n@end\n\n@interface TYPagerView : UIView\n\n@property (nonatomic, weak, nullable) id<TYPagerViewDataSource> dataSource;\n@property (nonatomic, weak, nullable) id<TYPagerViewDelegate> delegate;\n// pagerView's layout,don't set layout's dataSource to other\n@property (nonatomic, strong, readonly) TYPagerViewLayout<UIView *> *layout;\n@property (nonatomic, strong, readonly) UIScrollView *scrollView;\n\n@property (nonatomic, assign, readonly) NSInteger countOfPagerViews;\n@property (nonatomic, assign, readonly) NSInteger curIndex;// default -1\n\n@property (nonatomic, assign, nullable, readonly) NSArray<UIView *> *visibleViews;\n\n@property (nonatomic, assign) UIEdgeInsets contentInset;\n\n//if not visible, prefecth, cache view at index, return nil\n- (UIView *_Nullable)viewForIndex:(NSInteger)index;\n\n// register && dequeue's usage like tableView\n- (void)registerClass:(Class)Class forViewWithReuseIdentifier:(NSString *)identifier;\n- (void)registerNib:(UINib *)nib forViewWithReuseIdentifier:(NSString *)identifier;\n- (UIView *)dequeueReusableViewWithReuseIdentifier:(NSString *)identifier forIndex:(NSInteger)index;\n\n// scroll to index\n- (void)scrollToViewAtIndex:(NSInteger)index animate:(BOOL)animate;\n\n// update data and layout,but don't reset propertys(curIndex,visibleDatas,prefechDatas)\n- (void)updateData;\n\n// reload data and reset propertys\n- (void)reloadData;\n\n@end\n\nNS_ASSUME_NONNULL_END\n\n"
  },
  {
    "path": "Pods/TYPagerController/TYPagerControllerDemo/TYPagerController/TYPagerView.m",
    "content": "//\n//  TYPagerView.m\n//  TYPagerControllerDemo\n//\n//  Created by tany on 2017/7/5.\n//  Copyright © 2017年 tanyang. All rights reserved.\n//\n\n#import \"TYPagerView.h\"\n\n@interface TYPagerView ()<TYPagerViewLayoutDataSource, TYPagerViewLayoutDelegate> {\n    // private\n    struct {\n        unsigned int willAppearViewForIndex :1;\n        unsigned int didAppearViewForIndex :1;\n        unsigned int willDisappearViewForIndex :1;\n        unsigned int didDisappearViewForIndex :1;\n        unsigned int transitionFromIndexToIndex :1;\n        unsigned int transitionFromIndexToIndexProgress :1;\n        unsigned int viewDidScroll: 1;\n        unsigned int viewWillBeginScrolling: 1;\n        unsigned int viewDidEndScrolling: 1;\n    }_delegateFlags;\n}\n\n// Data\n@property (nonatomic, strong) TYPagerViewLayout<UIView *> *layout;\n\n@end\n\n@implementation TYPagerView\n\n#pragma mark - life cycle\n\n- (instancetype)initWithFrame:(CGRect)frame {\n    if (self = [super initWithFrame:frame]) {\n        self.backgroundColor = [UIColor clearColor];\n        // prevent sysytem automaticallyAdjustsScrollViewInsets\n        [self addFixAutoAdjustInsetScrollView];\n        [self addLayoutScrollView];\n    }\n    return self;\n}\n\n- (instancetype)initWithCoder:(NSCoder *)aDecoder {\n    if (self = [super initWithCoder:aDecoder]) {\n        self.backgroundColor = [UIColor clearColor];\n        // prevent sysytem automaticallyAdjustsScrollViewInsets\n        [self addFixAutoAdjustInsetScrollView];\n        [self addLayoutScrollView];\n    }\n    return self;\n}\n\n- (void)addFixAutoAdjustInsetScrollView {\n    UIView *view = [[UIView alloc]init];\n    [self addSubview:view];\n}\n\n- (void)addLayoutScrollView {\n    UIScrollView *contentView = [[UIScrollView alloc]init];\n    TYPagerViewLayout<UIView *> *layout = [[TYPagerViewLayout alloc]initWithScrollView:contentView];\n    layout.dataSource = self;\n    layout.delegate = self;\n    [self addSubview:contentView];\n    _layout = layout;\n    _layout.scrollView.frame = self.bounds;\n}\n\n#pragma mark - getter && setter\n\n- (NSInteger)curIndex {\n    return _layout.curIndex;\n}\n\n- (NSInteger)countOfPagerViews {\n    return _layout.countOfPagerItems;\n}\n\n- (NSArray<UIView *> *)visibleViews {\n    return _layout.visibleItems;\n}\n\n- (UIScrollView *)scrollView {\n    return _layout.scrollView;\n}\n\n- (void)setContentInset:(UIEdgeInsets)contentInset {\n    _contentInset = contentInset;\n    [self setNeedsLayout];\n}\n\n- (void)setDelegate:(id<TYPagerViewDelegate>)delegate {\n    _delegate = delegate;\n    \n    _delegateFlags.willAppearViewForIndex = [delegate respondsToSelector:@selector(pagerView:willAppearView:forIndex:)];\n    _delegateFlags.didAppearViewForIndex = [delegate respondsToSelector:@selector(pagerView:didAppearView:forIndex:)];\n    _delegateFlags.willDisappearViewForIndex = [delegate respondsToSelector:@selector(pagerView:willDisappearView:forIndex:)];\n    _delegateFlags.didDisappearViewForIndex = [delegate respondsToSelector:@selector(pagerView:didDisappearView:forIndex:)];\n    \n    _delegateFlags.transitionFromIndexToIndex = [delegate respondsToSelector:@selector(pagerView:transitionFromIndex:toIndex:animated:)];\n    _delegateFlags.transitionFromIndexToIndexProgress = [delegate respondsToSelector:@selector(pagerView:transitionFromIndex:toIndex:progress:)];\n    \n    _delegateFlags.viewDidScroll = [delegate respondsToSelector:@selector(pagerViewDidScroll:)];\n    _delegateFlags.viewWillBeginScrolling = [delegate respondsToSelector:@selector(pagerViewWillBeginScrolling:animate:)];\n    _delegateFlags.viewDidEndScrolling = [delegate respondsToSelector:@selector(pagerViewDidEndScrolling:animate:)];\n}\n\n#pragma mark - public\n\n- (void)updateData {\n    [_layout updateData];\n}\n\n- (void)reloadData {\n    [_layout reloadData];\n}\n\n- (void)scrollToViewAtIndex:(NSInteger)index animate:(BOOL)animate {\n    [_layout scrollToItemAtIndex:index animate:animate];\n}\n\n- (UIView *)viewForIndex:(NSInteger)idx {\n    return [_layout itemForIndex:idx];\n}\n\n- (void)registerClass:(Class)Class forViewWithReuseIdentifier:(NSString *)identifier {\n    [_layout registerClass:Class forItemWithReuseIdentifier:identifier];\n}\n- (void)registerNib:(UINib *)nib forViewWithReuseIdentifier:(NSString *)identifier {\n    [_layout registerNib:nib forItemWithReuseIdentifier:identifier];\n}\n- (UIView *)dequeueReusableViewWithReuseIdentifier:(NSString *)identifier forIndex:(NSInteger)index {\n    return [_layout dequeueReusableItemWithReuseIdentifier:identifier forIndex:index];\n}\n\n#pragma mark - private\n\n- (void)willBeginScrollingAnimate:(BOOL)animate {\n    if (_delegateFlags.viewWillBeginScrolling) {\n        [_delegate pagerViewWillBeginScrolling:self animate:animate];\n    }\n}\n\n- (void)didEndScrollingAnimate:(BOOL)animate {\n    if (_delegateFlags.viewDidEndScrolling) {\n        [_delegate pagerViewDidEndScrolling:self animate:animate];\n    }\n}\n\n#pragma mark - TYPagerViewLayoutDataSource\n\n- (NSInteger)numberOfItemsInPagerViewLayout {\n    return [_dataSource numberOfViewsInPagerView];\n}\n\n- (id)pagerViewLayout:(TYPagerViewLayout *)pagerViewLayout itemForIndex:(NSInteger)index prefetching:(BOOL)prefetching {\n    return [_dataSource pagerView:self viewForIndex:index prefetching:prefetching];\n}\n\n- (id)pagerViewLayout:(TYPagerViewLayout *)pagerViewLayout viewForItem:(id)item atIndex:(NSInteger)index {\n    return item;\n}\n\n- (void)pagerViewLayout:(TYPagerViewLayout *)pagerViewLayout addVisibleItem:(id)item atIndex:(NSInteger)index {\n    UIView *visibleView = item;\n    if (_delegateFlags.willAppearViewForIndex) {\n        [_delegate pagerView:self willAppearView:visibleView forIndex:index];\n    }\n    [pagerViewLayout.scrollView addSubview:visibleView];\n    if (_delegateFlags.didAppearViewForIndex) {\n        [_delegate pagerView:self didAppearView:visibleView forIndex:index];\n    }\n}\n\n- (void)pagerViewLayout:(TYPagerViewLayout *)pagerViewLayout removeInVisibleItem:(id)item atIndex:(NSInteger)index {\n    UIView *invisibleView = item;\n    if (_delegateFlags.willDisappearViewForIndex) {\n        [_delegate pagerView:self willDisappearView:invisibleView forIndex:index];\n    }\n    [invisibleView removeFromSuperview];\n    if (_delegateFlags.didDisappearViewForIndex) {\n        [_delegate pagerView:self didDisappearView:invisibleView forIndex:index];\n    }\n}\n\n#pragma mark - TYPagerViewLayoutDelegate\n\n- (void)pagerViewLayout:(TYPagerViewLayout *)pagerViewLayout transitionFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex animated:(BOOL)animated {\n    if (_delegateFlags.transitionFromIndexToIndex) {\n        [_delegate pagerView:self transitionFromIndex:fromIndex toIndex:toIndex animated:animated];\n    }\n}\n\n- (void)pagerViewLayout:(TYPagerViewLayout *)pagerViewLayout transitionFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex progress:(CGFloat)progress {\n    if (_delegateFlags.transitionFromIndexToIndexProgress) {\n        [_delegate pagerView:self transitionFromIndex:fromIndex toIndex:toIndex progress:progress];\n    }\n}\n\n- (void)pagerViewLayoutDidScroll:(TYPagerViewLayout *)pagerViewLayout {\n    if (_delegateFlags.viewDidScroll) {\n        [_delegate pagerViewDidScroll:self];\n    }\n}\n\n- (void)pagerViewLayoutWillBeginDragging:(TYPagerViewLayout *)pagerViewLayout {\n    [self willBeginScrollingAnimate:YES];\n}\n\n- (void)pagerViewLayoutWillBeginScrollToView:(TYPagerViewLayout *)pagerViewLayout animate:(BOOL)animate {\n    [self willBeginScrollingAnimate:animate];\n}\n\n- (void)pagerViewLayoutDidEndDecelerating:(TYPagerViewLayout *)pagerViewLayout {\n    [self didEndScrollingAnimate:YES];\n}\n\n- (void)pagerViewLayoutDidEndScrollToView:(TYPagerViewLayout *)pagerViewLayout animate:(BOOL)animate {\n    [self didEndScrollingAnimate:animate];\n}\n\n- (void)pagerViewLayoutDidEndScrollingAnimation:(TYPagerViewLayout *)pagerViewLayout {\n    [self didEndScrollingAnimate:YES];\n}\n\n#pragma mark - layoutSubviews\n\n- (void)layoutSubviews {\n    [super layoutSubviews];\n    _layout.scrollView.frame = UIEdgeInsetsInsetRect(self.bounds,_contentInset);\n}\n\n- (void)dealloc {\n    _layout = nil;\n}\n\n@end\n"
  },
  {
    "path": "Pods/TYPagerController/TYPagerControllerDemo/TYPagerController/TYPagerViewLayout.h",
    "content": "//\n//  TYPagerViewLayout.h\n//  TYPagerControllerDemo\n//\n//  Created by tanyang on 2017/7/9.\n//  Copyright © 2017年 tany. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface NSObject (TY_PagerReuseIdentify)\n// resueId\n@property (nonatomic, strong, readonly, nullable) NSString *ty_pagerReuseIdentify;\n\n@end\n\n@class TYPagerViewLayout<ItemType>;\n@protocol TYPagerViewLayoutDataSource <NSObject>\n\n- (NSInteger)numberOfItemsInPagerViewLayout;\n\n// if item is preload, prefetch will YES\n- (id)pagerViewLayout:(TYPagerViewLayout *)pagerViewLayout itemForIndex:(NSInteger)index prefetching:(BOOL)prefetching;\n\n// return item's view\n- (id)pagerViewLayout:(TYPagerViewLayout *)pagerViewLayout viewForItem:(id)item atIndex:(NSInteger)index;\n\n// see TYPagerView&&TYPagerController, add&&remove item ,must implement scrollView addSubView item's view\n- (void)pagerViewLayout:(TYPagerViewLayout *)pagerViewLayout addVisibleItem:(id)item atIndex:(NSInteger)index;\n- (void)pagerViewLayout:(TYPagerViewLayout *)pagerViewLayout removeInVisibleItem:(id)item atIndex:(NSInteger)index;\n\n@end\n\n@protocol TYPagerViewLayoutDelegate <NSObject>\n\n@optional\n\n// Transition animation customization\n\n// if you implement ↓↓↓transitionFromIndex:toIndex:progress:,only tap change index will call this, you can set progressAnimateEnabel NO that not call progress method\n- (void)pagerViewLayout:(TYPagerViewLayout *)pagerViewLayout transitionFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex animated:(BOOL)animated;\n\n// if you implement the method,also you need implement ↑↑↑transitionFromIndex:toIndex:animated:,deal with tap change index animate\n- (void)pagerViewLayout:(TYPagerViewLayout *)pagerViewLayout transitionFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex progress:(CGFloat)progress;\n\n// ScrollViewDelegate\n\n- (void)pagerViewLayoutDidScroll:(TYPagerViewLayout *)pagerViewLayout;\n- (void)pagerViewLayoutWillBeginScrollToView:(TYPagerViewLayout *)pagerViewLayout animate:(BOOL)animate;\n- (void)pagerViewLayoutDidEndScrollToView:(TYPagerViewLayout *)pagerViewLayout animate:(BOOL)animate;\n- (void)pagerViewLayoutWillBeginDragging:(TYPagerViewLayout *)pagerViewLayout;\n- (void)pagerViewLayoutDidEndDragging:(TYPagerViewLayout *)pagerViewLayout willDecelerate:(BOOL)decelerate;\n- (void)pagerViewLayoutWillBeginDecelerating:(TYPagerViewLayout *)pagerViewLayout;\n- (void)pagerViewLayoutDidEndDecelerating:(TYPagerViewLayout *)pagerViewLayout;\n- (void)pagerViewLayoutDidEndScrollingAnimation:(TYPagerViewLayout *)pagerViewLayout;\n\n@end\n\n@interface TYPagerViewLayout<__covariant ItemType> : NSObject\n\n@property (nonatomic, weak, nullable) id<TYPagerViewLayoutDataSource> dataSource;\n@property (nonatomic, weak, nullable) id<TYPagerViewLayoutDelegate> delegate;\n\n// strong,will control the delegate,don't set delegate on other place.\n@property (nonatomic, strong, readonly) UIScrollView *scrollView;\n// if viewcontroller's automaticallyAdjustsScrollViewInsets YES ,will cause frame problems, you can set YES, default YES\n@property (nonatomic, assign) BOOL adjustScrollViewInset;\n\n@property (nonatomic, assign, readonly) NSInteger countOfPagerItems;\n@property (nonatomic, assign, readonly) NSInteger curIndex;// default -1\n\n@property (nonatomic, strong, readonly) NSCache<NSNumber *,ItemType> *memoryCache;; // will cache pagerView,you can set countLimit\n@property (nonatomic, assign) BOOL autoMemoryCache; // default YES\n\n@property (nonatomic, assign) NSInteger prefetchItemCount;// preload left and right item's count , default 0\n\n@property (nonatomic, assign, readonly) NSRange prefetchRange;\n@property (nonatomic, assign, readonly) NSRange visibleRange;\n\n@property (nonatomic, strong, nullable, readonly) NSArray<NSNumber *> * visibleIndexs;\n@property (nonatomic, strong, nullable, readonly) NSArray<ItemType> * visibleItems;\n\n// default YES, if NO,will not call delegate transitionFromIndex:toIndex:progress:,but will call transitionFromIndex:toIndex:\n@property (nonatomic, assign) BOOL progressAnimateEnabel;\n\n// default NO, when scroll visible range change will add item.If YES add item only when scroll animate end, suggest set prefetchItemCount 1 or more\n@property (nonatomic, assign) BOOL addVisibleItemOnlyWhenScrollAnimatedEnd;\n\n// default 0.5,when scroll progress percent will change index, only progressAnimateEnabel is NO or don't implement delegate transitionFromIndex: toIndex: progress:\n@property (nonatomic, assign) CGFloat changeIndexWhenScrollProgress;\n\n- (instancetype)init NS_UNAVAILABLE;\n+ (instancetype)new NS_UNAVAILABLE;\n\n/**\n initializer will strong scrollView,and control delegate,don't set delegate on other place.\n */\n- (instancetype)initWithScrollView:(UIScrollView *)scrollView NS_DESIGNATED_INITIALIZER; // strong scrollView\n\n- (ItemType _Nullable)itemForIndex:(NSInteger)idx;\n\n- (UIView *)viewForItem:(ItemType)item atIndex:(NSInteger)index;\n\n// view's frame at index \n- (CGRect)frameForItemAtIndex:(NSInteger)index;\n\n// register && dequeue's usage like tableView\n- (void)registerClass:(Class)Class forItemWithReuseIdentifier:(NSString *)identifier;\n- (void)registerNib:(UINib *)nib forItemWithReuseIdentifier:(NSString *)identifier;\n- (ItemType)dequeueReusableItemWithReuseIdentifier:(NSString *)identifier forIndex:(NSInteger)index;\n\n// scroll to index\n- (void)scrollToItemAtIndex:(NSInteger)index animate:(BOOL)animate;\n\n// update data and layout，the same to relaodData,but don't reset propertys(curIndex,visibleDatas,prefechDatas)\n- (void)updateData;\n\n// reload data and reset propertys\n- (void)reloadData;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/TYPagerController/TYPagerControllerDemo/TYPagerController/TYPagerViewLayout.m",
    "content": "//\n//  TYPagerViewLayout.m\n//  TYPagerControllerDemo\n//\n//  Created by tanyang on 2017/7/9.\n//  Copyright © 2017年 tany. All rights reserved.\n//\n\n#import \"TYPagerViewLayout.h\"\n#import <objc/runtime.h>\n\n@interface TYAutoPurgeCache : NSCache\n@end\n\n@implementation TYAutoPurgeCache\n\n- (nonnull instancetype)init {\n    if (self = [super init]) {\n        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(removeAllObjects) name:UIApplicationDidReceiveMemoryWarningNotification object:nil];\n    }\n    return self;\n}\n\n- (void)dealloc {\n    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidReceiveMemoryWarningNotification object:nil];\n}\n@end\n\nstatic char ty_pagerReuseIdentifyKey;\n\n@implementation NSObject (TY_PagerReuseIdentify)\n\n- (NSString *)ty_pagerReuseIdentify {\n    return objc_getAssociatedObject(self, &ty_pagerReuseIdentifyKey);\n}\n\n- (void)setTy_pagerReuseIdentify:(NSString *)ty_pagerReuseIdentify {\n    objc_setAssociatedObject(self, &ty_pagerReuseIdentifyKey, ty_pagerReuseIdentify, OBJC_ASSOCIATION_RETAIN_NONATOMIC);\n}\n\n@end\n\ntypedef NS_ENUM(NSUInteger, TYPagerScrollingDirection) {\n    TYPagerScrollingLeft,\n    TYPagerScrollingRight,\n};\n\nNS_INLINE CGRect frameForItemAtIndex(NSInteger index, CGRect frame)\n{\n    return CGRectMake(index * CGRectGetWidth(frame), 0, CGRectGetWidth(frame), CGRectGetHeight(frame));\n}\n\n// caculate visilble range in offset\nNS_INLINE NSRange visibleRangWithOffset(CGFloat offset,CGFloat width, NSInteger maxIndex)\n{\n    if (width <= 0) {\n        return NSMakeRange(0, 0);\n    }\n    NSInteger startIndex = offset/width;\n    NSInteger endIndex = ceil((offset + width)/width);\n    \n    if (startIndex < 0) {\n        startIndex = 0;\n    } else if (startIndex > maxIndex) {\n        startIndex = maxIndex;\n    }\n    \n    if (endIndex > maxIndex) {\n        endIndex = maxIndex;\n    }\n    \n    NSUInteger length = endIndex - startIndex;\n    if (length > 5) {\n        length = 5;\n    }\n    return NSMakeRange(startIndex, length);\n}\n\nNS_INLINE NSRange prefetchRangeWithVisibleRange(NSRange visibleRange,NSInteger prefetchItemCount, NSInteger  countOfPagerItems) {\n    if (prefetchItemCount <= 0) {\n        return NSMakeRange(0, 0);\n    }\n    NSInteger leftIndex = MAX((NSInteger)visibleRange.location - prefetchItemCount, 0);\n    NSInteger rightIndex = MIN(visibleRange.location+visibleRange.length+prefetchItemCount, countOfPagerItems);\n    return NSMakeRange(leftIndex, rightIndex - leftIndex);\n}\n\nstatic const NSInteger kMemoryCountLimit = 16;\n\n@interface TYPagerViewLayout<ItemType> ()<UIScrollViewDelegate> {\n    // Private\n    BOOL        _needLayoutContent;\n    BOOL        _scrollAnimated;\n    BOOL        _isTapScrollMoved;\n    CGFloat     _preOffsetX;\n    NSInteger   _firstScrollToIndex;\n    BOOL        _didLayoutSubViews;\n    \n    struct {\n        unsigned int addVisibleItem :1;\n        unsigned int removeInVisibleItem :1;\n    }_dataSourceFlags;\n    \n    struct {\n        unsigned int transitionFromIndexToIndex :1;\n        unsigned int transitionFromIndexToIndexProgress :1;\n        unsigned int pagerViewLayoutDidScroll: 1;\n    }_delegateFlags;\n\n}\n\n// UI\n\n@property (nonatomic, strong) UIScrollView *scrollView;\n\n// Data\n\n@property (nonatomic, assign) NSInteger countOfPagerItems;\n@property (nonatomic, assign) NSInteger curIndex;\n\n@property (nonatomic, strong) NSCache<NSNumber *,ItemType> *memoryCache;\n\n@property (nonatomic, assign) NSRange visibleRange;\n@property (nonatomic, assign) NSRange prefetchRange;\n\n@property (nonatomic, strong) NSDictionary<NSNumber *,ItemType> *visibleIndexItems;\n@property (nonatomic, strong) NSDictionary<NSNumber *,ItemType> *prefetchIndexItems;\n\n//reuse Class and nib\n@property (nonatomic, strong) NSMutableDictionary *reuseIdentifyClassOrNib;\n// reuse items\n@property (nonatomic, strong) NSMutableDictionary *reuseIdentifyItems;\n\n@end\n\nstatic NSString * kScrollViewFrameObserverKey = @\"scrollView.frame\";\n\n@implementation TYPagerViewLayout\n\n#pragma mark - init\n\n- (instancetype)initWithScrollView:(UIScrollView *)scrollView {\n    if (self = [super init]) {\n        NSParameterAssert(scrollView!=nil);\n        _scrollView = scrollView;\n        \n        [self configurePropertys];\n        \n        [self configureScrollView];\n        \n        [self addScrollViewObservers];\n    }\n    return self;\n}\n\n#pragma mark - configure\n\n- (void)configurePropertys {\n    _curIndex = -1;\n    _preOffsetX = 0;\n    _changeIndexWhenScrollProgress = 0.5;\n    _didLayoutSubViews = NO;\n    _firstScrollToIndex = 0;\n    _addVisibleItemOnlyWhenScrollAnimatedEnd = NO;\n    _progressAnimateEnabel = YES;\n    _adjustScrollViewInset = YES;\n    _scrollAnimated = YES;\n    _autoMemoryCache = YES;\n}\n\n- (void)configureScrollView {\n    _scrollView.showsHorizontalScrollIndicator = NO;\n    _scrollView.showsVerticalScrollIndicator = NO;\n    _scrollView.pagingEnabled = YES;\n    _scrollView.delegate = self;\n}\n\n- (void)resetPropertys {\n    [self clearMemoryCache];\n    [self removeVisibleItems];\n    _scrollAnimated = NO;\n    _curIndex = -1;\n    _preOffsetX = 0;\n}\n\n#pragma mark - getter setter\n\n- (NSArray *)visibleItems {\n    return _visibleIndexItems.allValues;\n}\n\n- (NSArray *)visibleIndexs {\n    return _visibleIndexItems.allKeys;\n}\n\n- (NSMutableDictionary *)reuseIdentifyItems {\n    if (!_reuseIdentifyItems) {\n        _reuseIdentifyItems = [NSMutableDictionary dictionary];\n    }\n    return _reuseIdentifyItems;\n}\n\n- (NSMutableDictionary *)reuseIdentifyClassOrNib {\n    if (!_reuseIdentifyClassOrNib) {\n        _reuseIdentifyClassOrNib = [NSMutableDictionary dictionary];\n    }\n    return _reuseIdentifyClassOrNib;\n}\n\n- (NSCache *)memoryCache {\n    if (!_memoryCache) {\n        _memoryCache = [[TYAutoPurgeCache alloc]init];\n        _memoryCache.countLimit = kMemoryCountLimit;\n    }\n    return _memoryCache;\n}\n\n- (void)setAutoMemoryCache:(BOOL)autoMemoryCache {\n    _autoMemoryCache = autoMemoryCache;\n    if(!_autoMemoryCache && _memoryCache){\n        [_memoryCache removeAllObjects];\n        _memoryCache = nil;\n    }\n}\n\n- (void)setPrefetchItemCount:(NSInteger)prefetchItemCount {\n    _prefetchItemCount = prefetchItemCount;\n    if (prefetchItemCount <= 0 && _prefetchIndexItems) {\n        _prefetchIndexItems = nil;\n    }\n}\n\n- (void)setDataSource:(id<TYPagerViewLayoutDataSource>)dataSource {\n    _dataSource = dataSource;\n    _dataSourceFlags.addVisibleItem = [dataSource respondsToSelector:@selector(pagerViewLayout:addVisibleItem:atIndex:)];\n    _dataSourceFlags.removeInVisibleItem = [dataSource respondsToSelector:@selector(pagerViewLayout:removeInVisibleItem:atIndex:)];\n}\n\n- (void)setDelegate:(id<TYPagerViewLayoutDelegate>)delegate {\n    _delegate = delegate;\n    _delegateFlags.transitionFromIndexToIndex = [delegate respondsToSelector:@selector(pagerViewLayout:transitionFromIndex:toIndex:animated:)];\n    _delegateFlags.transitionFromIndexToIndexProgress = [delegate respondsToSelector:@selector(pagerViewLayout:transitionFromIndex:toIndex:progress:)];\n    _delegateFlags.pagerViewLayoutDidScroll = [delegate respondsToSelector:@selector(pagerViewLayoutDidScroll:)];\n}\n\n#pragma mark - public\n\n- (void)reloadData {\n    [self resetPropertys];\n    \n    [self updateData];\n}\n\n// update don't reset propertys(curIndex)\n- (void)updateData {\n    [self clearMemoryCache];\n    _countOfPagerItems = [_dataSource numberOfItemsInPagerViewLayout];\n    [self setNeedLayout];\n}\n\n/**\n scroll to item at index\n */\n- (void)scrollToItemAtIndex:(NSInteger)index animate:(BOOL)animate {\n    if (index < 0 || index >= _countOfPagerItems) {\n        return;\n    }\n    \n    if (!_didLayoutSubViews && CGRectIsEmpty(_scrollView.frame)) {\n        _firstScrollToIndex = index;\n    }\n    \n    [self scrollViewWillScrollToView:_scrollView animate:animate];\n    [_scrollView setContentOffset:CGPointMake(index * CGRectGetWidth(_scrollView.frame),0) animated:NO];\n    [self scrollViewDidScrollToView:_scrollView animate:animate];\n}\n\n- (id)itemForIndex:(NSInteger)idx {\n    NSNumber *index = @(idx);\n    // 1.from visibleViews\n    id visibleItem = [_visibleIndexItems objectForKey:index];\n    if (!visibleItem && _prefetchItemCount > 0) {\n        // 2.from prefetch\n        visibleItem = [_prefetchIndexItems objectForKey:index];\n    }\n    if (!visibleItem) {\n        // 3.from cache\n        visibleItem = [self cacheItemForKey:index];\n    }\n    return visibleItem;\n}\n\n- (UIView *)viewForItem:(id)item atIndex:(NSInteger)index {\n    UIView *view = [_dataSource pagerViewLayout:self viewForItem:item atIndex:index];\n    return view;\n}\n\n- (CGRect)frameForItemAtIndex:(NSInteger)index {\n    CGRect frame = frameForItemAtIndex(index, _scrollView.frame);\n    if (_adjustScrollViewInset) {\n        frame.size.height -= _scrollView.contentInset.top;\n    }\n    return frame;\n}\n\n#pragma mark - register && dequeue\n\n- (void)registerClass:(Class)Class forItemWithReuseIdentifier:(NSString *)identifier {\n    [self.reuseIdentifyClassOrNib setObject:Class forKey:identifier];\n}\n\n- (void)registerNib:(UINib *)nib forItemWithReuseIdentifier:(NSString *)identifier {\n    [self.reuseIdentifyClassOrNib setObject:nib forKey:identifier];\n}\n\n- (id)dequeueReusableItemWithReuseIdentifier:(NSString *)identifier forIndex:(NSInteger)index {\n    NSAssert(_reuseIdentifyClassOrNib.count != 0, @\"you don't register any identifiers!\");\n    NSObject *item = [self.reuseIdentifyItems objectForKey:identifier];\n    if (item) {\n        [self.reuseIdentifyItems removeObjectForKey:identifier];\n        return item;\n    }\n    id itemClassOrNib = [self.reuseIdentifyClassOrNib objectForKey:identifier];\n    if (!itemClassOrNib) {\n        NSString *error = [NSString stringWithFormat:@\"you don't register this identifier->%@\",identifier];\n        NSAssert(NO, error);\n        NSLog(@\"%@\", error);\n        return nil;\n    }\n    \n    if (class_isMetaClass(object_getClass(itemClassOrNib))) {\n        // is class\n        item = [[((Class)itemClassOrNib) alloc]init];\n    }else if ([itemClassOrNib isKindOfClass:[UINib class]]) {\n        // is nib\n        item =[((UINib *)itemClassOrNib)instantiateWithOwner:nil options:nil].firstObject;\n    }\n    if (!item){\n        NSString *error = [NSString stringWithFormat:@\"you register identifier->%@ is not class or nib!\",identifier];\n        NSAssert(NO, error);\n        NSLog(@\"%@\", error);\n        return nil;\n    }\n    [item setTy_pagerReuseIdentify:identifier];\n    UIView *view = [_dataSource pagerViewLayout:self viewForItem:item atIndex:index];\n    view.frame = [self frameForItemAtIndex:index];\n    return item;\n}\n\n- (void)enqueueReusableItem:(NSObject *)reuseItem prefetchRange:(NSRange)prefetchRange atIndex:(NSInteger)index{\n    if (reuseItem.ty_pagerReuseIdentify.length == 0 || NSLocationInRange(index, prefetchRange)) {\n        return;\n    }\n    [self.reuseIdentifyItems setObject:reuseItem forKey:reuseItem.ty_pagerReuseIdentify];\n}\n\n#pragma mark - layout content\n\n- (void)setNeedLayout {\n    // 1. get count Of pager Items\n    if (_countOfPagerItems <= 0) {\n        _countOfPagerItems = [_dataSource numberOfItemsInPagerViewLayout];\n    }\n    _needLayoutContent = YES;\n    if (_curIndex >= _countOfPagerItems) {\n        _curIndex = _countOfPagerItems - 1;\n    }\n    \n    BOOL needLayoutSubViews = NO;\n    if (!_didLayoutSubViews && !CGRectIsEmpty(_scrollView.frame) && _firstScrollToIndex < _countOfPagerItems) {\n        _didLayoutSubViews = YES;\n        needLayoutSubViews = YES;\n    }\n    \n    // 2.set contentSize and offset\n    CGFloat contentWidth = CGRectGetWidth(_scrollView.frame);\n    _scrollView.contentSize = CGSizeMake(_countOfPagerItems * contentWidth, 0);\n    _scrollView.contentOffset = CGPointMake(MAX(needLayoutSubViews ? _firstScrollToIndex : _curIndex, 0)*contentWidth, _scrollView.contentOffset.y);\n    \n    // 3.layout content\n    if (_curIndex < 0 || needLayoutSubViews) {\n        [self scrollViewDidScroll:_scrollView];\n    }else {\n        [self layoutIfNeed];\n    }\n}\n\n- (void)layoutIfNeed {\n    if (CGRectIsEmpty(_scrollView.frame)) {\n        return;\n    }\n    // 1.caculate visible range\n    CGFloat offsetX = _scrollView.contentOffset.x;\n    NSRange visibleRange = visibleRangWithOffset(offsetX, CGRectGetWidth(_scrollView.frame), _countOfPagerItems);\n    if (NSEqualRanges(_visibleRange, visibleRange) && !_needLayoutContent) {\n        // visible range not change\n        return;\n    }\n    _visibleRange = visibleRange;\n    _needLayoutContent = NO;\n    \n    BOOL afterPrefetchIfNoVisibleItems = !_visibleIndexItems;\n    if (!afterPrefetchIfNoVisibleItems) {\n        // 2.prefetch left and right Items\n        [self addPrefetchItemsOutOfVisibleRange:_visibleRange];\n    }\n    // 3.remove invisible Items\n    [self removeVisibleItemsOutOfVisibleRange:_visibleRange];\n    // 4.add visiible Items\n    [self addVisibleItemsInVisibleRange:_visibleRange];\n    if (afterPrefetchIfNoVisibleItems) {\n        [self addPrefetchItemsOutOfVisibleRange:_visibleRange];\n    }\n}\n\n#pragma mark - remove && add visibleViews\n\n- (void)removeVisibleItems {\n    [_scrollView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];\n    _visibleIndexItems = nil;\n    _prefetchIndexItems = nil;\n    if (_reuseIdentifyItems) {\n        [_reuseIdentifyItems removeAllObjects];\n    }\n}\n\n- (void)removeVisibleItemsOutOfVisibleRange:(NSRange)visibleRange {\n    [_visibleIndexItems enumerateKeysAndObjectsUsingBlock:^(NSNumber *key, id item, BOOL * stop) {\n        NSInteger index = [key integerValue];\n        if (!NSLocationInRange(index, visibleRange)) {\n            // out of visible\n            [self removeInvisibleItem:item atIndex:index];\n        }\n    }];\n}\n\n- (void)removeInvisibleItem:(id)invisibleItem atIndex:(NSInteger)index{\n    UIView *invisibleView = [self viewForItem:invisibleItem atIndex:index];\n    if (!invisibleView.superview) {\n        return;\n    }\n    if (_dataSourceFlags.removeInVisibleItem) {\n        [_dataSource pagerViewLayout:self removeInVisibleItem:invisibleItem atIndex:index];\n    }else {\n        NSAssert(NO, @\"must implememt datasource pagerViewLayout:removeInVisibleItem:atIndex:!\");\n    }\n    \n    NSObject *reuseItem = invisibleItem;\n    if (_reuseIdentifyClassOrNib.count > 0 && reuseItem.ty_pagerReuseIdentify.length > 0) {\n        // reuse\n        [self enqueueReusableItem:reuseItem prefetchRange:_prefetchRange atIndex:index];\n    }else {\n        [self cacheItem:invisibleItem forKey:@(index)];\n    }\n}\n\n- (void)addVisibleItemsInVisibleRange:(NSRange)visibleRange {\n    NSMutableDictionary *visibleIndexItems = [NSMutableDictionary dictionary];\n    // add visible views\n    for (NSInteger idx = visibleRange.location ; idx < visibleRange.location + visibleRange.length; ++idx) {\n        // from visibleViews,prefetch,cache\n        id visibleItem  = [self itemForIndex:idx];\n        if (!visibleItem && (!_addVisibleItemOnlyWhenScrollAnimatedEnd || visibleRange.length == 1)) {\n            // ↑↑↑ if _addVisibleItemOnlyWhenScrollAnimatedEnd is NO ,scroll visible range change will add item from dataSource, else is YES only scroll animate end(visibleRange.length == 1) will add item from dataSource\n            visibleItem = [_dataSource pagerViewLayout:self itemForIndex:idx prefetching:NO];\n        }\n        if (visibleItem) {\n            [self addVisibleItem:visibleItem atIndex:idx];\n            visibleIndexItems[@(idx)] = visibleItem;\n        }\n    }\n    \n    if (visibleIndexItems.count > 0) {\n        _visibleIndexItems = [visibleIndexItems copy];\n    }else {\n        _visibleIndexItems = nil;\n    }\n}\n\n- (void)addVisibleItem:(id)visibleItem atIndex:(NSInteger)index{\n    if (!visibleItem) {\n        NSAssert(visibleItem != nil, @\"visibleView must not nil!\");\n        return;\n    }\n    UIView *view = [self viewForItem:visibleItem atIndex:index];\n    if (view.superview && view.superview != _scrollView) {\n        [view removeFromSuperview];\n    }\n    CGRect frame = [self frameForItemAtIndex:index];\n    if (!CGRectEqualToRect(view.frame, frame)) {\n        view.frame = frame;\n    }\n    if (view.superview) {\n        return;\n    }\n    \n    if (_dataSourceFlags.addVisibleItem) {\n        [_dataSource pagerViewLayout:self addVisibleItem:visibleItem atIndex:index];\n    }else {\n        NSAssert(NO, @\"must implement datasource pagerViewLayout:addVisibleItem:frame:atIndex:!\");\n    }\n}\n\n- (void)addPrefetchItemsOutOfVisibleRange:(NSRange)visibleRange{\n    if (_prefetchItemCount <= 0) {\n        return;\n    }\n    NSRange prefetchRange = prefetchRangeWithVisibleRange(visibleRange, _prefetchItemCount, _countOfPagerItems);\n    if (visibleRange.length == 1) {\n        // ↑↑↑mean: scroll animate end\n        NSMutableDictionary *prefetchIndexItems = [NSMutableDictionary dictionary];\n        // add prefetch items\n        for (NSInteger index = prefetchRange.location; index < NSMaxRange(prefetchRange); ++index) {\n            id prefetchItem = nil;\n            if (NSLocationInRange(index, visibleRange)) {\n                prefetchItem = [_visibleIndexItems objectForKey:@(index)];\n            }else {\n                prefetchItem = [self prefetchInvisibleItemAtIndex:index];\n            }\n            if (prefetchItem) {\n                [prefetchIndexItems setObject:prefetchItem forKey:@(index)];\n            }\n        }\n        \n        if (_reuseIdentifyClassOrNib.count > 0) {\n            // resuse item\n            [_prefetchIndexItems enumerateKeysAndObjectsUsingBlock:^(NSNumber * key, id obj, BOOL * stop) {\n                NSInteger index = [key integerValue];\n                [self enqueueReusableItem:obj prefetchRange:prefetchRange atIndex:index];\n            }];\n        }\n        if (prefetchIndexItems.count > 0) {\n            _prefetchRange = prefetchRange;\n            _prefetchIndexItems = [prefetchIndexItems copy];\n        }else {\n            _prefetchRange = NSMakeRange(0, 0);\n            _prefetchIndexItems = nil;\n        }\n    }else if (NSIntersectionRange(visibleRange, _prefetchRange).length == 0) {\n        // visible and prefetch intersection, remove all prefetchItems\n        _prefetchRange = NSMakeRange(0, 0);\n        _prefetchIndexItems = nil;\n    }\n}\n\n- (UIView *)prefetchInvisibleItemAtIndex:(NSInteger)index {\n    id prefetchItem = [_prefetchIndexItems objectForKey:@(index)];\n    if (!prefetchItem) {\n        prefetchItem = [_visibleIndexItems objectForKey:@(index)];\n    }\n    if (!prefetchItem) {\n        prefetchItem = [self cacheItemForKey:@(index)];\n    }\n    if (!prefetchItem) {\n        prefetchItem = [_dataSource pagerViewLayout:self itemForIndex:index prefetching:YES];\n        UIView *view = [self viewForItem:prefetchItem atIndex:index];\n        CGRect frame = [self frameForItemAtIndex:index];\n        if (!CGRectEqualToRect(view.frame, frame)) {\n            view.frame = frame;\n        }\n    }\n    return prefetchItem;\n}\n\n#pragma mark - caculate index\n\n- (void)caculateIndexWithOffsetX:(CGFloat)offsetX direction:(TYPagerScrollingDirection)direction{\n    if (CGRectIsEmpty(_scrollView.frame)) {\n        return;\n    }\n    if (_countOfPagerItems <= 0) {\n        _curIndex = -1;\n        return;\n    }\n    // scrollView width\n    CGFloat width = CGRectGetWidth(_scrollView.frame);\n    NSInteger index = 0;\n    // when scroll to progress(changeIndexWhenScrollProgress) will change index\n    double percentChangeIndex = _changeIndexWhenScrollProgress;\n    if (_changeIndexWhenScrollProgress >= 1.0 || [self progressCaculateEnable]) {\n        percentChangeIndex = 0.999999999;\n    }\n    \n    // caculate cur index\n    if (direction == TYPagerScrollingLeft) {\n        index = ceil(offsetX/width-percentChangeIndex);\n    }else {\n        index = floor(offsetX/width+percentChangeIndex);\n    }\n    \n    if (index < 0) {\n        index = 0;\n    }else if (index >= _countOfPagerItems) {\n        index = _countOfPagerItems-1;\n    }\n    if (index == _curIndex) {\n        // if index not same,change index\n        return;\n    }\n    \n    NSInteger fromIndex = MAX(_curIndex, 0);\n    _curIndex = index;\n    if (_delegateFlags.transitionFromIndexToIndex /*&& ![self progressCaculateEnable]*/) {\n        [_delegate pagerViewLayout:self transitionFromIndex:fromIndex toIndex:_curIndex animated:_scrollAnimated];\n    }\n    _scrollAnimated = YES;\n}\n\n- (void)caculateIndexByProgressWithOffsetX:(CGFloat)offsetX direction:(TYPagerScrollingDirection)direction{\n    if (CGRectIsEmpty(_scrollView.frame)) {\n        return;\n    }\n    if (_countOfPagerItems <= 0) {\n        _curIndex = -1;\n        return;\n    }\n    CGFloat width = CGRectGetWidth(_scrollView.frame);\n    CGFloat floadIndex = offsetX/width;\n    NSInteger floorIndex = floor(floadIndex);\n    if (floorIndex < 0 || floorIndex >= _countOfPagerItems || floadIndex > _countOfPagerItems-1) {\n        return;\n    }\n    \n    CGFloat progress = offsetX/width-floorIndex;\n    NSInteger fromIndex = 0, toIndex = 0;\n    if (direction == TYPagerScrollingLeft) {\n        fromIndex = floorIndex;\n        toIndex = MIN(_countOfPagerItems -1, fromIndex + 1);\n        if (fromIndex == toIndex && toIndex == _countOfPagerItems-1) {\n            fromIndex = _countOfPagerItems-2;\n            progress = 1.0;\n        }\n    }else {\n        toIndex = floorIndex;\n        fromIndex = MIN(_countOfPagerItems-1, toIndex +1);\n        progress = 1.0 - progress;\n    }\n    \n    if (_delegateFlags.transitionFromIndexToIndexProgress) {\n        [_delegate pagerViewLayout:self transitionFromIndex:fromIndex toIndex:toIndex progress:progress];\n    }\n}\n\n- (BOOL)progressCaculateEnable {\n    return _delegateFlags.transitionFromIndexToIndexProgress && _progressAnimateEnabel && !_isTapScrollMoved;\n}\n\n#pragma mark - memoryCache\n\n- (void)clearMemoryCache {\n    if (_autoMemoryCache && _memoryCache) {\n        [_memoryCache removeAllObjects];\n    }\n}\n\n- (void)cacheItem:(id)item forKey:(NSNumber *)key {\n    if (_autoMemoryCache && key) {\n        UIView *cacheItem = [self.memoryCache objectForKey:key];\n        if (cacheItem && cacheItem == item) {\n            return;\n        }\n        [self.memoryCache setObject:item forKey:key];\n    }\n}\n\n- (id)cacheItemForKey:(NSNumber *)key {\n    if (_autoMemoryCache && _memoryCache && key) {\n        return [_memoryCache objectForKey:key];\n    }\n    return nil;\n}\n\n#pragma mark - UIScrollViewDelegate\n\n- (void)scrollViewDidScroll:(UIScrollView *)scrollView {\n    if (!scrollView.superview) {\n        return;\n    }\n    // get scrolling direction\n    CGFloat offsetX = scrollView.contentOffset.x;\n    TYPagerScrollingDirection direction = offsetX >= _preOffsetX ? TYPagerScrollingLeft : TYPagerScrollingRight;\n    \n    // caculate index and progress\n    if ([self progressCaculateEnable]) {\n        [self caculateIndexByProgressWithOffsetX:offsetX direction:direction];\n    }\n    [self caculateIndexWithOffsetX:offsetX direction:direction];\n    \n    // layout items\n    [self layoutIfNeed];\n    _isTapScrollMoved = NO;\n    \n    if (_delegateFlags.pagerViewLayoutDidScroll) {\n        [_delegate pagerViewLayoutDidScroll:self];\n    }\n}\n\n- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView\n{\n    _preOffsetX = scrollView.contentOffset.x;\n    if ([_delegate respondsToSelector:@selector(pagerViewLayoutWillBeginDragging:)]) {\n        [_delegate pagerViewLayoutWillBeginDragging:self];\n    }\n}\n\n- (void)scrollViewWillScrollToView:(UIScrollView *)scrollView animate:(BOOL)animate {\n    _preOffsetX = scrollView.contentOffset.x;\n    _isTapScrollMoved = YES;\n    _scrollAnimated = animate;\n    if ([_delegate respondsToSelector:@selector(pagerViewLayoutWillBeginScrollToView:animate:)]) {\n        [_delegate pagerViewLayoutWillBeginScrollToView:self animate:animate];\n    }\n}\n\n- (void)scrollViewDidScrollToView:(UIScrollView *)scrollView animate:(BOOL)animate {\n    if ([_delegate respondsToSelector:@selector(pagerViewLayoutDidEndScrollToView:animate:)]) {\n        [_delegate pagerViewLayoutDidEndScrollToView:self animate:animate];\n    }\n}\n\n- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {\n    if ([_delegate respondsToSelector:@selector(pagerViewLayoutDidEndDragging:willDecelerate:)]) {\n        [_delegate pagerViewLayoutDidEndDragging:self willDecelerate:decelerate];\n    }\n}\n\n- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {\n    if ([_delegate respondsToSelector:@selector(pagerViewLayoutWillBeginDecelerating:)]) {\n        [_delegate pagerViewLayoutWillBeginDecelerating:self];\n    }\n}\n\n- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {\n    if ([_delegate respondsToSelector:@selector(pagerViewLayoutDidEndDecelerating:)]) {\n        [_delegate pagerViewLayoutDidEndDecelerating:self];\n    }\n}\n\n- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {\n    if ([_delegate respondsToSelector:@selector(pagerViewLayoutDidEndScrollingAnimation:)]) {\n        [_delegate pagerViewLayoutDidEndScrollingAnimation:self];\n    }\n}\n\n#pragma mark - Observer\n\n- (void)addScrollViewObservers {\n    [self addObserver:self forKeyPath:kScrollViewFrameObserverKey options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];\n}\n\n- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {\n    if ([keyPath isEqualToString:kScrollViewFrameObserverKey]) {\n        CGRect newFrame = [[change objectForKey:NSKeyValueChangeNewKey]CGRectValue];\n        CGRect oldFrame = [[change objectForKey:NSKeyValueChangeOldKey]CGRectValue];\n        BOOL needLayoutContent = !CGRectEqualToRect(newFrame, oldFrame);\n        if (needLayoutContent) {\n            [self setNeedLayout];\n        }\n    }\n}\n\n- (void)removeScrollViewObservers {\n    [self removeObserver:self forKeyPath:kScrollViewFrameObserverKey context:nil];\n}\n\n- (void)dealloc {\n    [self removeScrollViewObservers];\n    _scrollView.delegate = nil;\n    _scrollView = nil;\n    if (_reuseIdentifyItems) {\n        [_reuseIdentifyItems removeAllObjects];\n    }\n    if (_reuseIdentifyClassOrNib) {\n        [_reuseIdentifyClassOrNib removeAllObjects];\n    }\n    [self clearMemoryCache];\n}\n\n@end\n"
  },
  {
    "path": "Pods/TYPagerController/TYPagerControllerDemo/TYPagerController/TabPager/TYTabPagerBar.h",
    "content": "//\n//  TYTabPagerBar.h\n//  TYPagerControllerDemo\n//\n//  Created by tany on 2017/7/13.\n//  Copyright © 2017年 tany. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import \"TYTabPagerBarLayout.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n@class TYTabPagerBar;\n@protocol TYTabPagerBarDataSource <NSObject>\n\n- (NSInteger)numberOfItemsInPagerTabBar;\n\n- (UICollectionViewCell<TYTabPagerBarCellProtocol> *)pagerTabBar:(TYTabPagerBar *)pagerTabBar cellForItemAtIndex:(NSInteger)index;\n\n@end\n\n@protocol TYTabPagerBarDelegate <NSObject>\n\n@optional\n\n// configure layout\n- (void)pagerTabBar:(TYTabPagerBar *)pagerTabBar configureLayout:(TYTabPagerBarLayout *)layout;\n\n// if cell wdith is not variable,you can set layout.cellWidth. otherwise ,you can implement this return cell width. cell width not contain cell edge\n- (CGFloat)pagerTabBar:(TYTabPagerBar *)pagerTabBar widthForItemAtIndex:(NSInteger)index;\n\n// did select cell item\n- (void)pagerTabBar:(TYTabPagerBar *)pagerTabBar didSelectItemAtIndex:(NSInteger)index;\n\n// transition frome cell to cell with animated\n- (void)pagerTabBar:(TYTabPagerBar *)pagerTabBar transitionFromeCell:(UICollectionViewCell<TYTabPagerBarCellProtocol> * _Nullable)fromCell toCell:(UICollectionViewCell<TYTabPagerBarCellProtocol> * _Nullable)toCell animated:(BOOL)animated;\n\n// transition frome cell to cell with progress\n- (void)pagerTabBar:(TYTabPagerBar *)pagerTabBar transitionFromeCell:(UICollectionViewCell<TYTabPagerBarCellProtocol> * _Nullable)fromCell toCell:(UICollectionViewCell<TYTabPagerBarCellProtocol> * _Nullable)toCell progress:(CGFloat)progress;\n\n@end\n\n@interface TYTabPagerBar : UIView\n\n@property (nonatomic, weak, readonly) UICollectionView *collectionView;\n@property (nonatomic, strong) UIView *progressView;\n// automatically resized to self.bounds\n@property (nonatomic, strong) UIView *backgroundView;\n\n@property (nonatomic, weak, nullable) id<TYTabPagerBarDataSource> dataSource;\n\n@property (nonatomic, weak, nullable) id<TYTabPagerBarDelegate> delegate;\n\n@property (nonatomic, strong) TYTabPagerBarLayout *layout;\n\n@property (nonatomic, assign, readonly) NSInteger countOfItems;\n\n@property (nonatomic, assign, readonly) NSInteger curIndex;\n\n@property (nonatomic, assign) UIEdgeInsets contentInset;\n\n- (void)registerClass:(Class)Class forCellWithReuseIdentifier:(NSString *)identifier;\n- (void)registerNib:(UINib *)nib forCellWithReuseIdentifier:(NSString *)identifier;\n\n- (__kindof UICollectionViewCell<TYTabPagerBarCellProtocol> *)dequeueReusableCellWithReuseIdentifier:(NSString *)identifier forIndex:(NSInteger)index;\n\n- (void)reloadData;\n\n- (void)scrollToItemFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex animate:(BOOL)animate;\n- (void)scrollToItemFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex progress:(CGFloat)progress;\n\n- (CGFloat)cellWidthForTitle:(NSString * _Nullable)title;\n- (CGRect)cellFrameWithIndex:(NSInteger)index;\n- (nullable UICollectionViewCell<TYTabPagerBarCellProtocol> *)cellForIndex:(NSInteger)index;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/TYPagerController/TYPagerControllerDemo/TYPagerController/TabPager/TYTabPagerBar.m",
    "content": "//\n//  TYTabPagerBar.m\n//  TYPagerControllerDemo\n//\n//  Created by tany on 2017/7/13.\n//  Copyright © 2017年 tany. All rights reserved.\n//\n\n#import \"TYTabPagerBar.h\"\n\n@interface TYTabPagerBar ()<UICollectionViewDelegateFlowLayout, UICollectionViewDataSource> {\n    struct {\n        unsigned int transitionFromeCellAnimated :1;\n        unsigned int transitionFromeCellProgress :1;\n        unsigned int widthForItemAtIndex :1;\n    }_delegateFlags;\n    TYTabPagerBarLayout *_layout;\n}\n\n// UI\n@property (nonatomic, weak) UICollectionView *collectionView;\n\n// Data\n\n@property (nonatomic, assign) NSInteger countOfItems;\n\n@property (nonatomic, assign) NSInteger curIndex;\n\n@property (nonatomic, assign) BOOL isFirstLayout;\n@property (nonatomic, assign) BOOL didLayoutSubViews;\n\n@end\n\n@implementation TYTabPagerBar\n\n- (instancetype)initWithFrame:(CGRect)frame {\n    if (self = [super initWithFrame:frame]) {\n        _isFirstLayout = YES;\n        _didLayoutSubViews = NO;\n        self.backgroundColor = [UIColor clearColor];\n        [self addFixAutoAdjustInsetScrollView];\n        [self addCollectionView];\n        [self addUnderLineView];\n    }\n    return self;\n}\n\n- (instancetype)initWithCoder:(NSCoder *)aDecoder {\n    if (self = [super initWithCoder:aDecoder]) {\n        _isFirstLayout = YES;\n        _didLayoutSubViews = NO;\n        self.backgroundColor = [UIColor clearColor];\n        [self addFixAutoAdjustInsetScrollView];\n        [self addCollectionView];\n        [self addUnderLineView];\n    }\n    return self;\n}\n\n- (void)addFixAutoAdjustInsetScrollView {\n    UIView *view = [[UIView alloc]init];\n    [self addSubview:view];\n}\n\n- (void)addCollectionView {\n    UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc]init];\n    layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;\n    UICollectionView *collectionView = [[UICollectionView alloc]initWithFrame:UIEdgeInsetsInsetRect(self.bounds, _contentInset) collectionViewLayout:layout];\n    collectionView.backgroundColor = [UIColor clearColor];\n    collectionView.showsHorizontalScrollIndicator = NO;\n    collectionView.showsVerticalScrollIndicator = NO;\n    if ([collectionView respondsToSelector:@selector(setPrefetchingEnabled:)]) {\n        collectionView.prefetchingEnabled = NO;\n    }\n    collectionView.delegate = self;\n    collectionView.dataSource = self;\n    [self addSubview:collectionView];\n    _collectionView = collectionView;\n}\n\n- (void)addUnderLineView {\n     UIView *progressView = [[UIView alloc]init];\n    progressView.backgroundColor = [UIColor redColor];\n    [_collectionView addSubview:progressView];\n    _progressView = progressView;\n}\n\n#pragma mark - getter setter\n\n- (void)setProgressView:(UIView *)progressView {\n    if (_progressView == progressView) {\n        return;\n    }\n    if (_progressView) {\n        [_progressView removeFromSuperview];\n    }\n    if (_layout && _layout.barStyle == TYPagerBarStyleCoverView) {\n        progressView.layer.zPosition = -1;\n        [_collectionView insertSubview: progressView atIndex:0];\n    }else {\n        [_collectionView addSubview:progressView];\n    }\n    if (_layout && self.superview) {\n        [_layout layoutSubViews];\n    }\n}\n\n- (void)setBackgroundView:(UIView *)backgroundView {\n    if (_backgroundView) {\n        [_backgroundView removeFromSuperview];\n    }\n    _backgroundView = backgroundView;\n    backgroundView.frame = self.bounds;\n    [self insertSubview:backgroundView atIndex:0];\n}\n\n- (void)setDelegate:(id<TYTabPagerBarDelegate>)delegate {\n    _delegate = delegate;\n    _delegateFlags.transitionFromeCellAnimated = [delegate respondsToSelector:@selector(pagerTabBar:transitionFromeCell:toCell:animated:)];\n    _delegateFlags.transitionFromeCellProgress = [delegate respondsToSelector:@selector(pagerTabBar:transitionFromeCell:toCell:progress:)];\n    _delegateFlags.widthForItemAtIndex = [delegate respondsToSelector:@selector(pagerTabBar:widthForItemAtIndex:)];\n}\n\n- (void)setLayout:(TYTabPagerBarLayout *)layout {\n    BOOL updateLayout = _layout && _layout != layout;\n    _layout = layout;\n    if (updateLayout) {\n        [self reloadData];\n    }\n}\n\n- (TYTabPagerBarLayout *)layout {\n    if (!_layout) {\n        _layout = [[TYTabPagerBarLayout alloc]initWithPagerTabBar:self];\n    }\n    return _layout;\n}\n\n#pragma mark - public\n\n- (void)reloadData {\n    _countOfItems = [_dataSource numberOfItemsInPagerTabBar];\n    if (_curIndex >= _countOfItems) {\n        _curIndex = _countOfItems - 1;\n    }\n    if ([_delegate respondsToSelector:@selector(pagerTabBar:configureLayout:)]) {\n        [_delegate pagerTabBar:self configureLayout:self.layout];\n    }\n    [self.layout layoutIfNeed];\n    [_collectionView reloadData];\n    [self.layout layoutSubViews];\n}\n\n- (void)registerClass:(Class)Class forCellWithReuseIdentifier:(NSString *)identifier {\n    [_collectionView registerClass:Class forCellWithReuseIdentifier:identifier];\n}\n\n- (void)registerNib:(UINib *)nib forCellWithReuseIdentifier:(NSString *)identifier {\n    [_collectionView registerNib:nib forCellWithReuseIdentifier:identifier];\n}\n\n- (__kindof UICollectionViewCell<TYTabPagerBarCellProtocol> *)dequeueReusableCellWithReuseIdentifier:(NSString *)identifier forIndex:(NSInteger)index {\n    UICollectionViewCell<TYTabPagerBarCellProtocol> *cell = [_collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:[NSIndexPath indexPathForItem:index inSection:0]];\n    return cell;\n}\n\n- (CGRect)cellFrameWithIndex:(NSInteger)index\n{\n    if (index >= _countOfItems) {\n        return CGRectZero;\n    }\n    UICollectionViewLayoutAttributes * cellAttrs = [_collectionView layoutAttributesForItemAtIndexPath:[NSIndexPath indexPathForItem:index inSection:0]];\n    if (!cellAttrs) {\n        return CGRectZero;\n    }\n    return cellAttrs.frame;\n}\n\n- (UICollectionViewCell<TYTabPagerBarCellProtocol> *)cellForIndex:(NSInteger)index\n{\n    if (index >= _countOfItems) {\n        return nil;\n    }\n    return (UICollectionViewCell<TYTabPagerBarCellProtocol> *)[_collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:index inSection:0]];\n}\n\n- (void)scrollToItemFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex animate:(BOOL)animate {\n    if (toIndex < _countOfItems && toIndex >= 0 && fromIndex < _countOfItems && fromIndex >= 0) {\n        _curIndex = toIndex;\n        [self transitionFromIndex:fromIndex toIndex:toIndex animated:animate];\n        if (!_didLayoutSubViews) {\n            dispatch_async(dispatch_get_main_queue(), ^{\n                [_collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:toIndex inSection:0] atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:animate];\n            });\n        }else {\n            [_collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:toIndex inSection:0] atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:animate];\n        }\n    }\n}\n\n- (void)scrollToItemFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex progress:(CGFloat)progress {\n    if (toIndex < _countOfItems && toIndex >= 0 && fromIndex < _countOfItems && fromIndex >= 0) {\n        [self transitionFromIndex:fromIndex toIndex:toIndex progress:progress];\n    }\n}\n\n- (CGFloat)cellWidthForTitle:(NSString *)title {\n    if (!title) {\n        return CGSizeZero.width;\n    }\n    //iOS 7\n    CGRect frame = [title boundingRectWithSize:CGSizeMake(1000, 1000) options:NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{ NSFontAttributeName:self.layout.selectedTextFont} context:nil];\n    return CGSizeMake(ceil(frame.size.width), ceil(frame.size.height) + 1).width;\n}\n\n#pragma mark - UICollectionViewDataSource\n\n- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section\n{\n    _countOfItems = [_dataSource numberOfItemsInPagerTabBar];\n    return _countOfItems;\n}\n\n- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath\n{\n    UICollectionViewCell<TYTabPagerBarCellProtocol> *cell = [_dataSource pagerTabBar:self cellForItemAtIndex:indexPath.item];\n    [self.layout transitionFromCell:(indexPath.item == _curIndex ? nil : cell) toCell:(indexPath.item == _curIndex ? cell : nil) animate:NO];\n    return cell;\n}\n\n#pragma mark - UICollectionViewDelegateFlowLayout\n\n- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath\n{\n    if ([_delegate respondsToSelector:@selector(pagerTabBar:didSelectItemAtIndex:)]) {\n        [_delegate pagerTabBar:self didSelectItemAtIndex:indexPath.item];\n    }\n}\n\n- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath\n{\n    if (self.layout.cellWidth > 0) {\n        return CGSizeMake(self.layout.cellWidth+self.layout.cellEdging*2, CGRectGetHeight(_collectionView.frame));\n    }else if(_delegateFlags.widthForItemAtIndex){\n        CGFloat width = [_delegate pagerTabBar:self widthForItemAtIndex:indexPath.item]+self.layout.cellEdging*2;\n        return CGSizeMake(width, CGRectGetHeight(_collectionView.frame));\n    }else {\n        NSAssert(NO, @\"you must return cell width!\");\n    }\n    return CGSizeZero;\n}\n\n#pragma mark - transition cell\n\n- (void)transitionFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex animated:(BOOL)animated\n{\n    UICollectionViewCell<TYTabPagerBarCellProtocol> *fromCell = [self cellForIndex:fromIndex];\n    UICollectionViewCell<TYTabPagerBarCellProtocol> *toCell = [self cellForIndex:toIndex];\n    if (_delegateFlags.transitionFromeCellAnimated) {\n        [_delegate pagerTabBar:self transitionFromeCell:fromCell toCell:toCell animated:animated];\n    }else {\n        [self.layout transitionFromCell:fromCell toCell:toCell animate:animated];\n    }\n    [self.layout setUnderLineFrameWithIndex:toIndex animated:fromCell && animated ? animated: NO];\n}\n\n- (void)transitionFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex progress:(CGFloat)progress\n{\n    UICollectionViewCell<TYTabPagerBarCellProtocol> *fromCell = [self cellForIndex:fromIndex];\n    UICollectionViewCell<TYTabPagerBarCellProtocol> *toCell = [self cellForIndex:toIndex];\n    if (_delegateFlags.transitionFromeCellProgress) {\n        [_delegate pagerTabBar:self transitionFromeCell:fromCell toCell:toCell progress:progress];\n    }else {\n        [self.layout transitionFromCell:fromCell toCell:toCell progress:progress];\n    }\n    [self.layout setUnderLineFrameWithfromIndex:fromIndex toIndex:toIndex progress:progress];\n}\n\n-(void)layoutSubviews {\n    [super layoutSubviews];\n    _backgroundView.frame = self.bounds;\n    CGRect frame = UIEdgeInsetsInsetRect(self.bounds, _contentInset);\n    BOOL needUpdateLayout = frame.size.height > 0 && _collectionView.frame.size.height != frame.size.height;\n    _collectionView.frame = frame;\n    if (!_didLayoutSubViews && !CGRectIsEmpty(_collectionView.frame)) {\n        _didLayoutSubViews = YES;\n    }\n    if (needUpdateLayout) {\n        [_layout invalidateLayout];\n    }\n    if (frame.size.height > 0 && (_isFirstLayout || needUpdateLayout)) {\n        [_layout adjustContentCellsCenterInBar];\n    }\n    _isFirstLayout = NO;\n    [_layout layoutSubViews];\n}\n\n- (void)dealloc {\n    _collectionView.dataSource = nil;\n    _collectionView.delegate = nil;\n}\n\n@end\n"
  },
  {
    "path": "Pods/TYPagerController/TYPagerControllerDemo/TYPagerController/TabPager/TYTabPagerBarCell.h",
    "content": "//\n//  TYTabTitleViewCell.h\n//  TYPagerControllerDemo\n//\n//  Created by tany on 16/5/4.\n//  Copyright © 2016年 tanyang. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\nNS_ASSUME_NONNULL_BEGIN\n@protocol TYTabPagerBarCellProtocol <NSObject>\n\n/**\n font ,textColor will use TYTabPagerBarLayout's textFont,textColor\n */\n@property (nonatomic, strong, readonly) UILabel *titleLabel;\n\n@end\n\n@interface TYTabPagerBarCell : UICollectionViewCell<TYTabPagerBarCellProtocol>\n@property (nonatomic, weak,readonly) UILabel *titleLabel;\n\n+ (NSString *)cellIdentifier;\n@end\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/TYPagerController/TYPagerControllerDemo/TYPagerController/TabPager/TYTabPagerBarCell.m",
    "content": "//\n//  TYTabTitleViewCell.m\n//  TYPagerControllerDemo\n//\n//  Created by tany on 16/5/4.\n//  Copyright © 2016年 tanyang. All rights reserved.\n//\n\n#import \"TYTabPagerBarCell.h\"\n\n@interface TYTabPagerBarCell ()\n@property (nonatomic, weak) UILabel *titleLabel;\n@end\n\n@implementation TYTabPagerBarCell\n\n- (instancetype)initWithFrame:(CGRect)frame\n{\n    if (self = [super initWithFrame:frame]) {\n        [self addTabTitleLabel];\n    }\n    return self;\n}\n\n- (instancetype)initWithCoder:(NSCoder *)aDecoder\n{\n    if (self = [super initWithCoder:aDecoder]) {\n        [self addTabTitleLabel];\n    }\n    return self;\n}\n\n- (void)addTabTitleLabel\n{\n    UILabel *titleLabel = [[UILabel alloc]init];\n    titleLabel.font = [UIFont systemFontOfSize:15];\n    titleLabel.textColor = [UIColor darkTextColor];\n    titleLabel.textAlignment = NSTextAlignmentCenter;\n    [self.contentView addSubview:titleLabel];\n    _titleLabel = titleLabel;\n}\n\n+ (NSString *)cellIdentifier {\n    return @\"TYTabPagerBarCell\";\n}\n\n- (void)layoutSubviews\n{\n    [super layoutSubviews];\n    _titleLabel.frame = self.contentView.bounds;\n}\n\n@end\n"
  },
  {
    "path": "Pods/TYPagerController/TYPagerControllerDemo/TYPagerController/TabPager/TYTabPagerBarLayout.h",
    "content": "//\n//  TYTabPagerBarLayout.h\n//  TYPagerControllerDemo\n//\n//  Created by tanyang on 2017/7/17.\n//  Copyright © 2017年 tany. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import \"TYTabPagerBarCell.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\ntypedef NS_ENUM(NSUInteger, TYPagerBarStyle) {\n    TYPagerBarStyleNoneView,\n    TYPagerBarStyleProgressView,\n    TYPagerBarStyleProgressBounceView,\n    TYPagerBarStyleProgressElasticView,\n    TYPagerBarStyleCoverView,\n};\n\n@class TYTabPagerBar;\n@interface TYTabPagerBarLayout : NSObject\n\n@property (nonatomic, weak, readonly) TYTabPagerBar *pagerTabBar;\n@property (nonatomic, assign, readonly) CGFloat selectFontScale;\n\n// set barStyle will reset propertys, so you should first time set it,\n@property (nonatomic, assign) TYPagerBarStyle barStyle; // default TYPagerBarStyleProgressElasticView\n\n@property (nonatomic, assign) UIEdgeInsets sectionInset;\n\n// progress view\n@property (nonatomic, assign) CGFloat progressHeight;   // default 2\n@property (nonatomic, assign) CGFloat progressWidth; //if>0 progress width is equal,else progress width is cell width\n@property (nonatomic, strong, nullable) UIColor *progressColor;\n\n@property (nonatomic, assign) CGFloat progressRadius;   // height/2\n@property (nonatomic, assign) CGFloat progressBorderWidth;\n@property (nonatomic, strong, nullable) UIColor *progressBorderColor;\n\n@property (nonatomic, assign) CGFloat progressHorEdging; // default 6, if < 0 width + edge ,if >0 width - edge\n@property (nonatomic, assign) CGFloat progressVerEdging; // default 0, cover style is 3.\n\n// cell frame\n@property (nonatomic, assign) CGFloat cellWidth; // default 0, if>0 cells width is equal,else if=0 cell will caculate all titles width\n@property (nonatomic, assign) CGFloat cellSpacing; // default 2,cell space\n@property (nonatomic, assign) CGFloat cellEdging;  // default 3,cell left right edge ,when cellwidth == 0 valid\n@property (nonatomic, assign) BOOL adjustContentCellsCenter;// default NO, cells center if contentSize < bar's width ,will set sectionInset\n\n// TYTabPagerBarCellProtocol -> cell's label\n@property (nonatomic, strong) UIFont *normalTextFont;       // default 15\n@property (nonatomic, strong) UIFont *selectedTextFont;     // default 17\n@property (nonatomic, strong) UIColor *normalTextColor;     // default 51.51.51\n@property (nonatomic, strong) UIColor *selectedTextColor;   // default white\n\n@property (nonatomic, assign) BOOL textColorProgressEnable; // default YES\n\n//   animate duration\n@property (nonatomic, assign) CGFloat animateDuration;  // default 0.3\n\n- (instancetype)init NS_UNAVAILABLE;\n+ (instancetype)new NS_UNAVAILABLE;\n\n- (instancetype)initWithPagerTabBar:(TYTabPagerBar *)pagerTabBar NS_DESIGNATED_INITIALIZER;\n\n- (void)layoutIfNeed;\n\n- (void)invalidateLayout;\n\n- (void)layoutSubViews;\n\n- (void)adjustContentCellsCenterInBar;\n\n\n// override\n- (void)transitionFromCell:(UICollectionViewCell<TYTabPagerBarCellProtocol> *_Nullable)fromCell toCell:(UICollectionViewCell<TYTabPagerBarCellProtocol> *_Nullable)toCell animate:(BOOL)animate;\n\n- (void)transitionFromCell:(UICollectionViewCell<TYTabPagerBarCellProtocol> *_Nullable)fromCell toCell:(UICollectionViewCell<TYTabPagerBarCellProtocol> *_Nullable)toCell progress:(CGFloat)progress;\n\n- (void)setUnderLineFrameWithIndex:(NSInteger)index animated:(BOOL)animated;\n\n- (void)setUnderLineFrameWithfromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex progress:(CGFloat)progress;\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/TYPagerController/TYPagerControllerDemo/TYPagerController/TabPager/TYTabPagerBarLayout.m",
    "content": "//\n//  TYTabPagerBarLayout.m\n//  TYPagerControllerDemo\n//\n//  Created by tanyang on 2017/7/17.\n//  Copyright © 2017年 tany. All rights reserved.\n//\n\n#import \"TYTabPagerBarLayout.h\"\n#import \"TYTabPagerBar.h\"\n\n@interface TYTabPagerBarLayout ()\n\n@property (nonatomic, weak) TYTabPagerBar *pagerTabBar;\n\n@property (nonatomic, assign) CGFloat selectFontScale;\n\n@end\n\n#define kUnderLineViewHeight 2\n\n@implementation TYTabPagerBarLayout\n\n- (instancetype)initWithPagerTabBar:(TYTabPagerBar *)pagerTabBar {\n    if (self = [super init]) {\n        _pagerTabBar = pagerTabBar;\n        [self configurePropertys];\n        self.barStyle = TYPagerBarStyleProgressElasticView;\n    }\n    return self;\n}\n\n- (void)configurePropertys {\n    _cellSpacing = 2;\n    _cellEdging = 3;\n    _cellWidth = 0;\n    _progressHorEdging = 6;\n    _progressWidth = 0;\n    _animateDuration = 0.25;\n    \n    _normalTextFont = [UIFont systemFontOfSize:15];\n    _selectedTextFont = [UIFont systemFontOfSize:18];\n    _normalTextColor = [UIColor colorWithRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1];\n    _selectedTextColor = [UIColor redColor];\n    _textColorProgressEnable = YES;\n    //_adjustContentCellsCenter = YES;\n}\n\n#pragma mark - geter setter\n\n- (void)setProgressRadius:(CGFloat)progressRadius {\n    _progressRadius = progressRadius;\n    _pagerTabBar.progressView.layer.cornerRadius = progressRadius;\n}\n\n- (void)setProgressBorderWidth:(CGFloat)progressBorderWidth {\n    _progressBorderWidth = progressBorderWidth;\n    _pagerTabBar.progressView.layer.borderWidth = progressBorderWidth;\n}\n\n- (void)setProgressBorderColor:(UIColor *)progressBorderColor {\n    _progressBorderColor = progressBorderColor;\n    if (!_progressColor) {\n        _pagerTabBar.progressView.backgroundColor = [UIColor clearColor];\n    }\n    _pagerTabBar.progressView.layer.borderColor = progressBorderColor.CGColor;\n}\n\n- (void)setProgressColor:(UIColor *)progressColor {\n    _progressColor = progressColor;\n    _pagerTabBar.progressView.backgroundColor = progressColor;\n}\n\n- (void)setProgressHeight:(CGFloat)progressHeight {\n    _progressHeight = progressHeight;\n    CGRect frame = _pagerTabBar.progressView.frame;\n    CGFloat height = CGRectGetHeight(_pagerTabBar.collectionView.frame);\n    frame.origin.y = _barStyle == TYPagerBarStyleCoverView ? (height - _progressHeight)/2:(height - _progressHeight - _progressVerEdging);\n    frame.size.height = progressHeight;\n    _pagerTabBar.progressView.frame = frame;\n}\n\n- (UIEdgeInsets)sectionInset {\n    if (!UIEdgeInsetsEqualToEdgeInsets(_sectionInset, UIEdgeInsetsZero) || _barStyle != TYPagerBarStyleCoverView) {\n        return _sectionInset;\n    }\n    if (_barStyle == TYPagerBarStyleCoverView && _adjustContentCellsCenter) {\n        return _sectionInset;\n    }\n    CGFloat horEdging = -_progressHorEdging+_cellSpacing;\n    return UIEdgeInsetsMake(0, horEdging, 0, horEdging);\n}\n\n- (void)setBarStyle:(TYPagerBarStyle)barStyle\n{\n    if (barStyle == _barStyle) {\n        return;\n    }\n    if (_barStyle == TYPagerBarStyleCoverView) {\n        self.progressBorderWidth = 0;\n        self.progressBorderColor = nil;\n    }\n    _barStyle = barStyle;\n    switch (barStyle) {\n        case TYPagerBarStyleProgressView:\n            self.progressWidth = 0;\n            self.progressHorEdging = 6;\n            self.progressVerEdging = 0;\n            self.progressHeight = kUnderLineViewHeight;\n            break;\n        case TYPagerBarStyleProgressBounceView:\n        case TYPagerBarStyleProgressElasticView:\n            self.progressWidth = 30;\n            self.progressVerEdging = 0;\n            self.progressHorEdging = 0;\n            self.progressHeight = kUnderLineViewHeight;\n            break;\n        case TYPagerBarStyleCoverView:\n            self.progressWidth = 0;\n            self.progressHorEdging = -self.progressHeight/4;\n            self.progressVerEdging = 3;\n            break;\n        default:\n            break;\n    }\n    _pagerTabBar.progressView.hidden = barStyle == TYPagerBarStyleNoneView;\n    if (barStyle == TYPagerBarStyleCoverView) {\n        _progressRadius = 0;\n        _pagerTabBar.progressView.layer.zPosition = -1;\n        [_pagerTabBar.progressView removeFromSuperview];\n        [_pagerTabBar.collectionView insertSubview: _pagerTabBar.progressView atIndex:0];\n    }else {\n        self.progressRadius = _progressHeight/2;\n        if (_pagerTabBar.progressView.layer.zPosition == -1) {\n            _pagerTabBar.progressView.layer.zPosition = 0;\n            [_pagerTabBar.progressView removeFromSuperview];\n            [_pagerTabBar.collectionView addSubview:_pagerTabBar.progressView];\n        }\n        \n    }\n}\n\n#pragma mark - public\n\n- (void)layoutIfNeed {\n    UICollectionViewFlowLayout *collectionLayout = (UICollectionViewFlowLayout *)_pagerTabBar.collectionView.collectionViewLayout;\n    collectionLayout.minimumLineSpacing = _cellSpacing;\n    collectionLayout.minimumInteritemSpacing = _cellSpacing;\n    _selectFontScale = self.normalTextFont.pointSize/(self.selectedTextFont ? self.selectedTextFont.pointSize:self.normalTextFont.pointSize);\n    collectionLayout.sectionInset = _sectionInset;\n}\n\n- (void)invalidateLayout {\n    [_pagerTabBar.collectionView.collectionViewLayout invalidateLayout];\n}\n\n- (void)adjustContentCellsCenterInBar {\n    if (!_adjustContentCellsCenter) {\n        return;\n    }\n    UICollectionViewFlowLayout *collectionLayout = (UICollectionViewFlowLayout *)_pagerTabBar.collectionView.collectionViewLayout;\n    if (collectionLayout.collectionViewContentSize.width > CGRectGetWidth(self.pagerTabBar.frame) || CGRectIsEmpty(self.pagerTabBar.frame)) {\n        return;\n    }\n    NSArray *layoutAttribulte = [collectionLayout layoutAttributesForElementsInRect:self.pagerTabBar.bounds];\n    if (layoutAttribulte.count == 0) {\n        return;\n    }\n    UICollectionViewLayoutAttributes *firstAttribute = layoutAttribulte.firstObject;\n    UICollectionViewLayoutAttributes *lastAttribute = layoutAttribulte.lastObject;\n    CGFloat left = CGRectGetMinX(firstAttribute.frame);\n    CGFloat right = CGRectGetMaxX(lastAttribute.frame);\n    if (right > CGRectGetWidth(self.pagerTabBar.frame)) {\n        return;\n    }\n    CGFloat sapce = (CGRectGetWidth(self.pagerTabBar.frame) - (right - left))/2;\n    _sectionInset = UIEdgeInsetsMake(_sectionInset.top, sapce, _sectionInset.bottom, sapce);\n    collectionLayout.sectionInset = _sectionInset;\n}\n\n- (CGRect)cellFrameWithIndex:(NSInteger)index {\n    return [_pagerTabBar cellFrameWithIndex:index];\n}\n\n#pragma mark - cell\n\n- (void)transitionFromCell:(UICollectionViewCell<TYTabPagerBarCellProtocol> *)fromCell toCell:(UICollectionViewCell<TYTabPagerBarCellProtocol> *)toCell animate:(BOOL)animate {\n    if (_pagerTabBar.countOfItems == 0) {\n        return;\n    }\n    void (^animateBlock)() = ^{\n        if (fromCell) {\n            fromCell.titleLabel.font = _normalTextFont;\n            fromCell.titleLabel.textColor = _normalTextColor;\n            fromCell.transform = CGAffineTransformMakeScale(_selectFontScale, _selectFontScale);\n        }\n        if (toCell) {\n            toCell.titleLabel.font = _normalTextFont;\n            toCell.titleLabel.textColor = _selectedTextColor ? _selectedTextColor : _normalTextColor;\n            toCell.transform = CGAffineTransformIdentity;\n        }\n    };\n    if (animate) {\n        [UIView animateWithDuration:_animateDuration animations:^{\n            animateBlock();\n        }];\n    }else{\n        animateBlock();\n    }\n    \n}\n\n- (void)transitionFromCell:(UICollectionViewCell<TYTabPagerBarCellProtocol> *)fromCell toCell:(UICollectionViewCell<TYTabPagerBarCellProtocol> *)toCell progress:(CGFloat)progress {\n    if (_pagerTabBar.countOfItems == 0 || !_textColorProgressEnable) {\n        return;\n    }\n    CGFloat currentTransform = (1.0 - _selectFontScale)*progress;\n    fromCell.transform = CGAffineTransformMakeScale(1.0-currentTransform, 1.0-currentTransform);\n    toCell.transform = CGAffineTransformMakeScale(_selectFontScale+currentTransform, _selectFontScale+currentTransform);\n    \n    if (_normalTextColor == _selectedTextColor || !_selectedTextColor) {\n        return;\n    }\n    \n    CGFloat narR=0,narG=0,narB=0,narA=1;\n    [_normalTextColor getRed:&narR green:&narG blue:&narB alpha:&narA];\n    CGFloat selR=0,selG=0,selB=0,selA=1;\n    [_selectedTextColor getRed:&selR green:&selG blue:&selB alpha:&selA];\n    CGFloat detalR = narR - selR ,detalG = narG - selG,detalB = narB - selB,detalA = narA - selA;\n    \n    fromCell.titleLabel.textColor = [UIColor colorWithRed:selR+detalR*progress green:selG+detalG*progress blue:selB+detalB*progress alpha:selA+detalA*progress];\n    toCell.titleLabel.textColor = [UIColor colorWithRed:narR-detalR*progress green:narG-detalG*progress blue:narB-detalB*progress alpha:narA-detalA*progress];\n}\n\n#pragma mark - progress View\n\n// set up progress view frame\n- (void)setUnderLineFrameWithIndex:(NSInteger)index animated:(BOOL)animated\n{\n    UIView *progressView = _pagerTabBar.progressView;\n    if (progressView.isHidden || _pagerTabBar.countOfItems == 0) {\n        return;\n    }\n    \n    CGRect cellFrame = [self cellFrameWithIndex:index];\n    CGFloat progressHorEdging = _progressWidth > 0 ? (cellFrame.size.width - _progressWidth)/2 : _progressHorEdging;\n    CGFloat progressX = cellFrame.origin.x+progressHorEdging;\n    CGFloat progressY = _barStyle == TYPagerBarStyleCoverView ? (cellFrame.size.height - _progressHeight)/2:(cellFrame.size.height - _progressHeight - _progressVerEdging);\n    CGFloat width = cellFrame.size.width-2*progressHorEdging;\n    \n    if (animated) {\n        [UIView animateWithDuration:_animateDuration animations:^{\n            progressView.frame = CGRectMake(progressX, progressY, width, _progressHeight);\n        }];\n    }else {\n        progressView.frame = CGRectMake(progressX, progressY, width, _progressHeight);\n    }\n}\n\n- (void)setUnderLineFrameWithfromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex progress:(CGFloat)progress\n{\n    UIView *progressView = _pagerTabBar.progressView;\n    if (progressView.isHidden || _pagerTabBar.countOfItems == 0) {\n        return;\n    }\n    \n    CGRect fromCellFrame = [self cellFrameWithIndex:fromIndex];\n    CGRect toCellFrame = [self cellFrameWithIndex:toIndex];\n    \n    CGFloat progressFromEdging = _progressWidth > 0 ? (fromCellFrame.size.width - _progressWidth)/2 : _progressHorEdging;\n    CGFloat progressToEdging = _progressWidth > 0 ? (toCellFrame.size.width - _progressWidth)/2 : _progressHorEdging;\n    CGFloat progressY = _barStyle == TYPagerBarStyleCoverView ? (toCellFrame.size.height - _progressHeight)/2:(toCellFrame.size.height - _progressHeight - _progressVerEdging);\n    CGFloat progressX = 0, width = 0;\n    \n    if (_barStyle == TYPagerBarStyleProgressBounceView) {\n        if (fromCellFrame.origin.x < toCellFrame.origin.x) {\n            if (progress <= 0.5) {\n                progressX = fromCellFrame.origin.x + progressFromEdging;\n                width = (toCellFrame.size.width-progressToEdging+progressFromEdging+_cellSpacing)*2*progress + fromCellFrame.size.width-2*progressFromEdging;\n            }else {\n                progressX = fromCellFrame.origin.x + progressFromEdging + (fromCellFrame.size.width-progressFromEdging+progressToEdging+_cellSpacing)*(progress-0.5)*2;\n                width = CGRectGetMaxX(toCellFrame)-progressToEdging - progressX;\n            }\n        }else {\n            if (progress <= 0.5) {\n                progressX = fromCellFrame.origin.x + progressFromEdging - (toCellFrame.size.width-progressToEdging+progressFromEdging+_cellSpacing)*2*progress;\n                width = CGRectGetMaxX(fromCellFrame) - progressFromEdging - progressX;\n            }else {\n                progressX = toCellFrame.origin.x + progressToEdging;\n                width = (fromCellFrame.size.width-progressFromEdging+progressToEdging + _cellSpacing)*(1-progress)*2 + toCellFrame.size.width - 2*progressToEdging;\n            }\n        }\n    }else if (_barStyle == TYPagerBarStyleProgressElasticView) {\n        if (fromCellFrame.origin.x < toCellFrame.origin.x) {\n            if (progress <= 0.5) {\n                progressX = fromCellFrame.origin.x + progressFromEdging + (fromCellFrame.size.width-2*progressFromEdging)*progress;\n                width = (toCellFrame.size.width-progressToEdging+progressFromEdging+_cellSpacing)*2*progress - (toCellFrame.size.width-2*progressToEdging)*progress + fromCellFrame.size.width-2*progressFromEdging-(fromCellFrame.size.width-2*progressFromEdging)*progress;\n            }else {\n                progressX = fromCellFrame.origin.x + progressFromEdging + (fromCellFrame.size.width-2*progressFromEdging)*0.5 + (fromCellFrame.size.width-progressFromEdging - (fromCellFrame.size.width-2*progressFromEdging)*0.5 +progressToEdging+_cellSpacing)*(progress-0.5)*2;\n                width = CGRectGetMaxX(toCellFrame)-progressToEdging - progressX - (toCellFrame.size.width-2*progressToEdging)*(1-progress);\n            }\n        }else {\n            if (progress <= 0.5) {\n                progressX = fromCellFrame.origin.x + progressFromEdging - (toCellFrame.size.width-(toCellFrame.size.width-2*progressToEdging)/2-progressToEdging+progressFromEdging+_cellSpacing)*2*progress;\n                width = CGRectGetMaxX(fromCellFrame) - (fromCellFrame.size.width-2*progressFromEdging)*progress - progressFromEdging - progressX;\n            }else {\n                progressX = toCellFrame.origin.x + progressToEdging+(toCellFrame.size.width-2*progressToEdging)*(1-progress);\n                width = (fromCellFrame.size.width-progressFromEdging+progressToEdging-(fromCellFrame.size.width-2*progressFromEdging)/2 + _cellSpacing)*(1-progress)*2 + toCellFrame.size.width - 2*progressToEdging - (toCellFrame.size.width-2*progressToEdging)*(1-progress);\n            }\n        }\n    }else {\n        progressX = (toCellFrame.origin.x+progressToEdging-(fromCellFrame.origin.x+progressFromEdging))*progress+fromCellFrame.origin.x+progressFromEdging;\n        width = (toCellFrame.size.width-2*progressToEdging)*progress + (fromCellFrame.size.width-2*progressFromEdging)*(1-progress);\n    }\n    \n    progressView.frame = CGRectMake(progressX,progressY, width, _progressHeight);\n}\n\n- (void)layoutSubViews {\n    if (CGRectIsEmpty(_pagerTabBar.frame)) {\n        return;\n    }\n    if (_barStyle == TYPagerBarStyleCoverView) {\n        self.progressHeight = CGRectGetHeight(_pagerTabBar.collectionView.frame) -self.progressVerEdging*2;\n        self.progressRadius = _progressRadius > 0 ? _progressRadius : self.progressHeight/2;\n    }\n    [self setUnderLineFrameWithIndex:_pagerTabBar.curIndex animated:NO];\n}\n\n@end\n"
  },
  {
    "path": "Pods/TYPagerController/TYPagerControllerDemo/TYPagerController/TabPager/TYTabPagerController.h",
    "content": "//\n//  TYTabPagerController.h\n//  TYPagerControllerDemo\n//\n//  Created by tanyang on 2017/7/18.\n//  Copyright © 2017年 tany. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import \"TYTabPagerBar.h\"\n#import \"TYPagerController.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n@class TYTabPagerController;\n@protocol TYTabPagerControllerDataSource <NSObject>\n\n- (NSInteger)numberOfControllersInTabPagerController;\n\n- (UIViewController *)tabPagerController:(TYTabPagerController *)tabPagerController controllerForIndex:(NSInteger)index prefetching:(BOOL)prefetching;\n\n- (NSString *)tabPagerController:(TYTabPagerController *)tabPagerController titleForIndex:(NSInteger)index;\n\n@end\n\n@protocol TYTabPagerControllerDelegate <NSObject>\n@optional\n\n- (void)tabPagerController:(TYTabPagerController *)tabPagerController willDisplayCell:(UICollectionViewCell<TYTabPagerBarCellProtocol> *)cell atIndex:(NSInteger)index;\n\n- (void)tabPagerControllerWillBeginScrolling:(TYTabPagerController *)tabPagerController animate:(BOOL)animate;\n- (void)tabPagerControllerDidEndScrolling:(TYTabPagerController *)tabPagerController animate:(BOOL)animate;\n\n@end\n\n@interface TYTabPagerController : UIViewController\n\n@property (nonatomic, strong, readonly) TYTabPagerBar *tabBar;\n@property (nonatomic, strong, readonly) TYPagerController *pagerController;\n@property (nonatomic, strong, readonly) TYPagerViewLayout<UIViewController *> *layout;\n\n@property (nonatomic, weak, nullable) id<TYTabPagerControllerDataSource> dataSource;\n@property (nonatomic, weak, nullable) id<TYTabPagerControllerDelegate> delegate;\n\n// you can custom tabBar orignY and height.\n@property (nonatomic, assign) CGFloat tabBarOrignY;\n@property (nonatomic, assign) CGFloat tabBarHeight;\n\n// register tabBar cell\n- (void)registerClass:(Class)Class forTabBarCellWithReuseIdentifier:(NSString *)identifier;\n- (void)registerNib:(UINib *)nib forTabBarCellWithReuseIdentifier:(NSString *)identifier;\n\n// register && dequeue pager Cell, usage like tableView\n- (void)registerClass:(Class)Class forPagerCellWithReuseIdentifier:(NSString *)identifier;\n- (void)registerNib:(UINib *)nib forPagerCellWithReuseIdentifier:(NSString *)identifier;\n- (UIViewController *)dequeueReusablePagerCellWithReuseIdentifier:(NSString *)identifier forIndex:(NSInteger)index;\n\n\n- (void)scrollToControllerAtIndex:(NSInteger)index animate:(BOOL)animate;\n\n- (void)updateData;\n\n- (void)reloadData;\n\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/TYPagerController/TYPagerControllerDemo/TYPagerController/TabPager/TYTabPagerController.m",
    "content": "//\n//  TYTabPagerController.m\n//  TYPagerControllerDemo\n//\n//  Created by tanyang on 2017/7/18.\n//  Copyright © 2017年 tany. All rights reserved.\n//\n\n#import \"TYTabPagerController.h\"\n\n@interface TYTabPagerController ()<TYTabPagerBarDataSource,TYTabPagerBarDelegate,TYPagerControllerDataSource,TYPagerControllerDelegate>\n\n// UI\n@property (nonatomic, strong) TYTabPagerBar *tabBar;\n@property (nonatomic, strong) TYPagerController *pagerController;\n\n// Data\n@property (nonatomic, strong) NSString *identifier;\n\n@end\n\n#define kTabBarOrignY -999999\n\n@implementation TYTabPagerController\n\n- (instancetype)initWithCoder:(NSCoder *)aDecoder {\n    if (self = [super initWithCoder:aDecoder]) {\n        _tabBarHeight = 36;\n        _tabBarOrignY = kTabBarOrignY;\n    }\n    return self;\n}\n\n- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {\n    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {\n        _tabBarHeight = 36;\n        _tabBarOrignY = kTabBarOrignY;\n    }\n    return self;\n}\n\n- (void)viewDidLoad {\n    [super viewDidLoad];\n    // Do any additional setup after loading the view.\n    self.view.backgroundColor = [UIColor whiteColor];\n\n    [self addTabBar];\n    \n    [self addPagerController];\n}\n\n- (void)addTabBar {\n    self.tabBar.dataSource = self;\n    self.tabBar.delegate = self;\n    [self registerClass:[TYTabPagerBarCell class] forTabBarCellWithReuseIdentifier:[TYTabPagerBarCell cellIdentifier]];\n    [self.view addSubview:self.tabBar];;\n}\n\n- (void)addPagerController {\n    self.pagerController.dataSource = self;\n    self.pagerController.delegate = self;\n    [self addChildViewController:self.pagerController];\n    [self.view addSubview:self.pagerController.view];\n}\n\n- (void)viewWillLayoutSubviews {\n    [super viewWillLayoutSubviews];\n    CGFloat orignY = [self fixedTabBarOriginY];\n    self.tabBar.frame = CGRectMake(0, orignY, CGRectGetWidth(self.view.frame), _tabBarHeight);\n    self.pagerController.view.frame = CGRectMake(0, orignY+_tabBarHeight, CGRectGetWidth(self.view.frame), CGRectGetHeight(self.view.frame) - _tabBarHeight-orignY);\n}\n\n- (CGFloat)fixedTabBarOriginY {\n    if (_tabBarOrignY > kTabBarOrignY) {\n        return _tabBarOrignY;\n    }\n    if (!self.navigationController || self.parentViewController != self.navigationController) {\n        return 0;\n    }\n    if (self.navigationController.navigationBarHidden || !(self.edgesForExtendedLayout&UIRectEdgeTop)) {\n        return 0;\n    }\n    return CGRectGetMaxY(self.navigationController.navigationBar.frame);\n}\n\n#pragma mark - getter setter\n\n- (TYTabPagerBar *)tabBar {\n    if (!_tabBar) {\n        _tabBar = [[TYTabPagerBar alloc]init];\n    }\n    return _tabBar;\n}\n\n- (void)setTabBarOrignY:(CGFloat)tabBarOrignY {\n    BOOL isChangeValue = _tabBarOrignY != tabBarOrignY;\n    _tabBarOrignY = tabBarOrignY;\n    if (isChangeValue && _tabBar.superview) {\n        [self.view layoutIfNeeded];\n    }\n}\n\n- (void)setTabBarHeight:(CGFloat)tabBarHeight {\n    BOOL isChangeValue = _tabBarHeight != tabBarHeight;\n    _tabBarHeight = tabBarHeight;\n    if (isChangeValue && _tabBar.superview) {\n        [self.view layoutIfNeeded];\n    }\n}\n\n- (TYPagerController *)pagerController {\n    if (!_pagerController) {\n        _pagerController = [[TYPagerController alloc]init];\n        _pagerController.layout.prefetchItemCount = 1;\n    }\n    return _pagerController;\n}\n\n- (TYPagerViewLayout<UIViewController *> *)layout {\n    return self.pagerController.layout;\n}\n\n#pragma mark - public\n\n- (void)updateData {\n    [self.tabBar reloadData];\n    [self.pagerController updateData];\n}\n\n- (void)reloadData {\n    [self.tabBar reloadData];\n    [self.pagerController reloadData];\n}\n\n- (void)scrollToControllerAtIndex:(NSInteger)index animate:(BOOL)animate {\n    [self.pagerController scrollToControllerAtIndex:index animate:animate];\n}\n\n- (void)registerClass:(Class)Class forTabBarCellWithReuseIdentifier:(NSString *)identifier {\n    _identifier = identifier;\n    [self.tabBar registerClass:Class forCellWithReuseIdentifier:identifier];\n}\n- (void)registerNib:(UINib *)nib forTabBarCellWithReuseIdentifier:(NSString *)identifier {\n    _identifier = identifier;\n    [self.tabBar registerNib:nib forCellWithReuseIdentifier:identifier];\n}\n\n- (void)registerClass:(Class)Class forPagerCellWithReuseIdentifier:(NSString *)identifier {\n    [_pagerController registerClass:Class forControllerWithReuseIdentifier:identifier];\n}\n- (void)registerNib:(UINib *)nib forPagerCellWithReuseIdentifier:(NSString *)identifier {\n    [_pagerController registerNib:nib forControllerWithReuseIdentifier:identifier];\n}\n- (UIViewController *)dequeueReusablePagerCellWithReuseIdentifier:(NSString *)identifier forIndex:(NSInteger)index {\n    return [_pagerController dequeueReusableControllerWithReuseIdentifier:identifier forIndex:index];\n}\n\n#pragma mark - TYTabPagerBarDataSource\n\n- (NSInteger)numberOfItemsInPagerTabBar {\n    return [_dataSource numberOfControllersInTabPagerController];\n}\n\n- (UICollectionViewCell<TYTabPagerBarCellProtocol> *)pagerTabBar:(TYTabPagerBar *)pagerTabBar cellForItemAtIndex:(NSInteger)index {\n    UICollectionViewCell<TYTabPagerBarCellProtocol> *cell = [pagerTabBar dequeueReusableCellWithReuseIdentifier:_identifier forIndex:index];\n    cell.titleLabel.text = [_dataSource tabPagerController:self titleForIndex:index];\n    if ([_delegate respondsToSelector:@selector(tabPagerController:willDisplayCell:atIndex:)]) {\n        [_delegate tabPagerController:self willDisplayCell:cell atIndex:index];\n    }\n    return cell;\n}\n\n#pragma mark - TYTabPagerBarDelegate\n\n- (CGFloat)pagerTabBar:(TYTabPagerBar *)pagerTabBar widthForItemAtIndex:(NSInteger)index {\n    NSString *title = [_dataSource tabPagerController:self titleForIndex:index];\n    return [pagerTabBar cellWidthForTitle:title];\n}\n\n- (void)pagerTabBar:(TYTabPagerBar *)pagerTabBar didSelectItemAtIndex:(NSInteger)index {\n    [_pagerController scrollToControllerAtIndex:index animate:YES];\n}\n\n#pragma mark - TYPagerControllerDataSource\n\n- (NSInteger)numberOfControllersInPagerController {\n    return [_dataSource numberOfControllersInTabPagerController];\n}\n\n- (UIViewController *)pagerController:(TYPagerController *)pagerController controllerForIndex:(NSInteger)index prefetching:(BOOL)prefetching {\n    UIViewController *viewController = [_dataSource tabPagerController:self controllerForIndex:index prefetching:prefetching];\n    return viewController;\n}\n\n#pragma mark - TYPagerControllerDelegate\n\n- (void)pagerController:(TYPagerController *)pagerController transitionFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex animated:(BOOL)animated {\n    [self.tabBar scrollToItemFromIndex:fromIndex toIndex:toIndex animate:animated];\n}\n\n-(void)pagerController:(TYPagerController *)pagerController transitionFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex progress:(CGFloat)progress {\n    [self.tabBar scrollToItemFromIndex:fromIndex toIndex:toIndex progress:progress];\n}\n\n- (void)pagerControllerWillBeginScrolling:(TYPagerController *)pagerController animate:(BOOL)animate {\n    if ([_delegate respondsToSelector:@selector(tabPagerControllerWillBeginScrolling:animate:)]) {\n        [_delegate tabPagerControllerWillBeginScrolling:self animate:animate];\n    }\n}\n- (void)pagerControllerDidEndScrolling:(TYPagerController *)pagerController animate:(BOOL)animate {\n    if ([_delegate respondsToSelector:@selector(tabPagerControllerDidEndScrolling:animate:)]) {\n        [_delegate tabPagerControllerDidEndScrolling:self animate:animate];\n    }\n}\n\n- (void)didReceiveMemoryWarning {\n    [super didReceiveMemoryWarning];\n    // Dispose of any resources that can be recreated.\n}\n\n@end\n"
  },
  {
    "path": "Pods/TYPagerController/TYPagerControllerDemo/TYPagerController/TabPager/TYTabPagerView.h",
    "content": "//\n//  TYTabPagerView.h\n//  TYPagerControllerDemo\n//\n//  Created by tanyang on 2017/7/18.\n//  Copyright © 2017年 tany. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import \"TYPagerView.h\"\n#import \"TYTabPagerBar.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n@class TYTabPagerView;\n@protocol TYTabPagerViewDataSource <NSObject>\n\n- (NSInteger)numberOfViewsInTabPagerView;\n\n- (UIView *)tabPagerView:(TYTabPagerView *)tabPagerView viewForIndex:(NSInteger)index prefetching:(BOOL)prefetching;\n\n- (NSString *)tabPagerView:(TYTabPagerView *)tabPagerView titleForIndex:(NSInteger)index;\n\n@end\n\n@protocol TYTabPagerViewDelegate <NSObject>\n@optional\n\n- (void)tabPagerView:(TYTabPagerView *)tabPagerView willDisplayCell:(UICollectionViewCell<TYTabPagerBarCellProtocol> *)cell atIndex:(NSInteger)index;\n\n- (void)tabPagerView:(TYTabPagerView *)tabPagerView willAppearView:(UIView *)view forIndex:(NSInteger)index;\n- (void)tabPagerView:(TYTabPagerView *)tabPagerView didDisappearView:(UIView *)view forIndex:(NSInteger)index;\n\n- (void)tabPagerViewWillBeginScrolling:(TYTabPagerView *)tabPagerView animate:(BOOL)animate;\n- (void)tabPagerViewDidEndScrolling:(TYTabPagerView *)tabPagerView animate:(BOOL)animate;\n\n@end\n\n@interface TYTabPagerView : UIView\n\n@property (nonatomic, weak, readonly) TYTabPagerBar *tabBar;\n@property (nonatomic, weak, readonly) TYPagerView *pageView;\n\n@property (nonatomic, strong, readonly) TYPagerViewLayout<UIView *> *layout;\n\n@property (nonatomic, weak, nullable) id<TYTabPagerViewDataSource> dataSource;\n@property (nonatomic, weak, nullable) id<TYTabPagerViewDelegate> delegate;\n\n@property (nonatomic, assign) CGFloat tabBarHeight;\n\n// register tabBar cell\n- (void)registerClass:(Class)Class forTabBarCellWithReuseIdentifier:(NSString *)identifier;\n- (void)registerNib:(UINib *)nib forTabBarCellWithReuseIdentifier:(NSString *)identifier;\n\n// register && dequeue pager Cell, usage like tableView\n- (void)registerClass:(Class)Class forPagerCellWithReuseIdentifier:(NSString *)identifier;\n- (void)registerNib:(UINib *)nib forPagerCellWithReuseIdentifier:(NSString *)identifier;\n- (UIView *)dequeueReusablePagerCellWithReuseIdentifier:(NSString *)identifier forIndex:(NSInteger)index;\n\n\n- (void)scrollToViewAtIndex:(NSInteger)index animate:(BOOL)animate;\n\n- (void)updateData;\n\n- (void)reloadData;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Pods/TYPagerController/TYPagerControllerDemo/TYPagerController/TabPager/TYTabPagerView.m",
    "content": "//\n//  TYTabPagerView.m\n//  TYPagerControllerDemo\n//\n//  Created by tanyang on 2017/7/18.\n//  Copyright © 2017年 tany. All rights reserved.\n//\n\n#import \"TYTabPagerView.h\"\n\n@interface TYTabPagerView ()<TYTabPagerBarDataSource,TYTabPagerBarDelegate,TYPagerViewDataSource, TYPagerViewDelegate>\n\n// UI\n@property (nonatomic, weak) TYTabPagerBar *tabBar;\n@property (nonatomic, weak) TYPagerView *pageView;\n\n// Data\n@property (nonatomic, strong) NSString *identifier;\n\n@end\n\n@implementation TYTabPagerView\n\n- (instancetype)initWithFrame:(CGRect)frame {\n    if (self = [super initWithFrame:frame]) {\n        _tabBarHeight = 36;\n        self.backgroundColor = [UIColor clearColor];\n        [self addTabBar];\n        \n        [self addPagerView];\n    }\n    return self;\n}\n\n- (instancetype)initWithCoder:(NSCoder *)aDecoder {\n    if (self = [super initWithCoder:aDecoder]) {\n        _tabBarHeight = 36;\n        self.backgroundColor = [UIColor clearColor];\n        [self addTabBar];\n        \n        [self addPagerView];\n    }\n    return self;\n}\n\n- (void)addTabBar {\n    TYTabPagerBar *tabBar = [[TYTabPagerBar alloc]initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.frame), _tabBarHeight)];\n    tabBar.dataSource = self;\n    tabBar.delegate = self;\n    [self addSubview:tabBar];\n    _tabBar = tabBar;\n    [self registerClass:[TYTabPagerBarCell class] forTabBarCellWithReuseIdentifier:[TYTabPagerBarCell cellIdentifier]];\n}\n\n- (void)addPagerView {\n    TYPagerView *pageView = [[TYPagerView alloc]initWithFrame:CGRectMake(0, _tabBarHeight, CGRectGetWidth(self.frame), MAX(CGRectGetHeight(self.frame) - _tabBarHeight, 0))];\n    pageView.dataSource = self;\n    pageView.delegate = self;\n    [self addSubview:pageView];\n    _pageView = pageView;\n}\n\n#pragma mark - getter setter\n\n- (void)setTabBarHeight:(CGFloat)tabBarHeight {\n    BOOL isChangeValue = _tabBarHeight != tabBarHeight;\n    _tabBarHeight = tabBarHeight;\n    if (isChangeValue && self.superview && !CGRectEqualToRect(self.bounds, CGRectZero)) {\n        [self setNeedsLayout];\n        [self layoutIfNeeded];\n    }\n}\n\n- (TYPagerViewLayout<UIView *> *)layout {\n    return _pageView.layout;\n}\n\n#pragma mark - public\n\n- (void)updateData {\n    [_tabBar reloadData];\n    [_pageView updateData];\n}\n\n- (void)reloadData {\n    [_tabBar reloadData];\n    [_pageView reloadData];\n}\n\n// scroll to index\n- (void)scrollToViewAtIndex:(NSInteger)index animate:(BOOL)animate {\n    [_pageView scrollToViewAtIndex:index animate:animate];\n}\n\n- (void)registerClass:(Class)Class forTabBarCellWithReuseIdentifier:(NSString *)identifier {\n    _identifier = identifier;\n    [_tabBar registerClass:Class forCellWithReuseIdentifier:identifier];\n}\n- (void)registerNib:(UINib *)nib forTabBarCellWithReuseIdentifier:(NSString *)identifier {\n    _identifier = identifier;\n    [_tabBar registerNib:nib forCellWithReuseIdentifier:identifier];\n}\n\n- (void)registerClass:(Class)Class forPagerCellWithReuseIdentifier:(NSString *)identifier {\n    [_pageView registerClass:Class forViewWithReuseIdentifier:identifier];\n}\n- (void)registerNib:(UINib *)nib forPagerCellWithReuseIdentifier:(NSString *)identifier {\n    [_pageView registerNib:nib forViewWithReuseIdentifier:identifier];\n}\n- (UIView *)dequeueReusablePagerCellWithReuseIdentifier:(NSString *)identifier forIndex:(NSInteger)index {\n    return [_pageView dequeueReusableViewWithReuseIdentifier:identifier forIndex:index];\n}\n\n#pragma mark - TYTabPagerBarDataSource\n\n- (NSInteger)numberOfItemsInPagerTabBar {\n    return [_dataSource numberOfViewsInTabPagerView];\n}\n\n- (UICollectionViewCell<TYTabPagerBarCellProtocol> *)pagerTabBar:(TYTabPagerBar *)pagerTabBar cellForItemAtIndex:(NSInteger)index {\n    UICollectionViewCell<TYTabPagerBarCellProtocol> *cell = [pagerTabBar dequeueReusableCellWithReuseIdentifier:_identifier forIndex:index];\n    cell.titleLabel.text = [_dataSource tabPagerView:self titleForIndex:index];\n    if ([_delegate respondsToSelector:@selector(tabPagerView:willDisplayCell:atIndex:)]) {\n        [_delegate tabPagerView:self willDisplayCell:cell atIndex:index];\n    }\n    return cell;\n}\n\n#pragma mark - TYTabPagerBarDelegate\n\n- (CGFloat)pagerTabBar:(TYTabPagerBar *)pagerTabBar widthForItemAtIndex:(NSInteger)index {\n    NSString *title = [_dataSource tabPagerView:self titleForIndex:index];\n    return [pagerTabBar cellWidthForTitle:title];\n}\n\n- (void)pagerTabBar:(TYTabPagerBar *)pagerTabBar didSelectItemAtIndex:(NSInteger)index {\n    [_pageView scrollToViewAtIndex:index animate:YES];\n}\n\n#pragma mark - TYPagerViewDataSource\n\n- (NSInteger)numberOfViewsInPagerView {\n    return [_dataSource numberOfViewsInTabPagerView];\n}\n\n- (UIView *)pagerView:(TYPagerView *)pagerView viewForIndex:(NSInteger)index prefetching:(BOOL)prefetching {\n    UIView *view = [_dataSource tabPagerView:self viewForIndex:index prefetching:prefetching];\n    return view;\n}\n\n#pragma mark - TYPagerViewDelegate\n\n- (void)pagerView:(TYPagerView *)pagerView transitionFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex animated:(BOOL)animated {\n    [_tabBar scrollToItemFromIndex:fromIndex toIndex:toIndex animate:animated];\n}\n\n- (void)pagerView:(TYPagerView *)pagerView transitionFromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex progress:(CGFloat)progress {\n    [_tabBar scrollToItemFromIndex:fromIndex toIndex:toIndex progress:progress];\n}\n\n- (void)pagerView:(TYPagerView *)pagerView willAppearView:(UIView *)view forIndex:(NSInteger)index {\n    if ([_delegate respondsToSelector:@selector(tabPagerView:willAppearView:forIndex:)]) {\n        [_delegate tabPagerView:self willAppearView:view forIndex:index];\n    }\n}\n\n- (void)pagerView:(TYPagerView *)pagerView didDisappearView:(UIView *)view forIndex:(NSInteger)index {\n    if ([_delegate respondsToSelector:@selector(tabPagerView:didDisappearView:forIndex:)]) {\n        [_delegate tabPagerView:self didDisappearView:view forIndex:index];\n    }\n}\n\n- (void)pagerViewWillBeginScrolling:(TYPagerView *)pageView animate:(BOOL)animate {\n    if ([_delegate respondsToSelector:@selector(tabPagerViewWillBeginScrolling:animate:)]) {\n        [_delegate tabPagerViewWillBeginScrolling:self animate:animate];\n    }\n}\n\n- (void)pagerViewDidEndScrolling:(TYPagerView *)pageView animate:(BOOL)animate {\n    if ([_delegate respondsToSelector:@selector(tabPagerViewDidEndScrolling:animate:)]) {\n        [_delegate tabPagerViewDidEndScrolling:self animate:animate];\n    }\n}\n\n- (void)layoutSubviews {\n    [super layoutSubviews];\n    _tabBar.frame = CGRectMake(0, 0, CGRectGetWidth(self.frame), _tabBarHeight);\n    _pageView.frame = CGRectMake(0, _tabBarHeight, CGRectGetWidth(self.frame), CGRectGetHeight(self.frame) - _tabBarHeight);\n}\n\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/Alamofire/Alamofire-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Alamofire : NSObject\n@end\n@implementation PodsDummy_Alamofire\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/Alamofire/Alamofire-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/Alamofire/Alamofire-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double AlamofireVersionNumber;\nFOUNDATION_EXPORT const unsigned char AlamofireVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/Alamofire/Alamofire.modulemap",
    "content": "framework module Alamofire {\n  umbrella header \"Alamofire-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/Alamofire/Alamofire.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/Alamofire\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Public\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_BUILD_DIR = $BUILD_DIR\nPODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/Alamofire\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/Alamofire/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>4.5.1</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/Differentiator/Differentiator-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Differentiator : NSObject\n@end\n@implementation PodsDummy_Differentiator\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/Differentiator/Differentiator-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/Differentiator/Differentiator-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double DifferentiatorVersionNumber;\nFOUNDATION_EXPORT const unsigned char DifferentiatorVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/Differentiator/Differentiator.modulemap",
    "content": "framework module Differentiator {\n  umbrella header \"Differentiator-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/Differentiator/Differentiator.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/Differentiator\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Public\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_BUILD_DIR = $BUILD_DIR\nPODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/Differentiator\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/Differentiator/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>3.0.2</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_IQKeyboardManagerSwift : NSObject\n@end\n@implementation PodsDummy_IQKeyboardManagerSwift\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double IQKeyboardManagerSwiftVersionNumber;\nFOUNDATION_EXPORT const unsigned char IQKeyboardManagerSwiftVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift.modulemap",
    "content": "framework module IQKeyboardManagerSwift {\n  umbrella header \"IQKeyboardManagerSwift-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/IQKeyboardManagerSwift\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Public\"\nOTHER_LDFLAGS = -framework \"CoreGraphics\" -framework \"Foundation\" -framework \"QuartzCore\" -framework \"UIKit\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_BUILD_DIR = $BUILD_DIR\nPODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/IQKeyboardManagerSwift\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/IQKeyboardManagerSwift/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>5.0.6</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/Kingfisher/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>4.3.1</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/Kingfisher/Kingfisher-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Kingfisher : NSObject\n@end\n@implementation PodsDummy_Kingfisher\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/Kingfisher/Kingfisher-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/Kingfisher/Kingfisher-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n#import \"Kingfisher.h\"\n\nFOUNDATION_EXPORT double KingfisherVersionNumber;\nFOUNDATION_EXPORT const unsigned char KingfisherVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/Kingfisher/Kingfisher.modulemap",
    "content": "framework module Kingfisher {\n  umbrella header \"Kingfisher-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/Kingfisher/Kingfisher.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/Kingfisher\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Public\"\nOTHER_LDFLAGS = -framework \"CFNetwork\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_BUILD_DIR = $BUILD_DIR\nPODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/Kingfisher\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\nSWIFT_VERSION = 4.0\n"
  },
  {
    "path": "Pods/Target Support Files/MJRefresh/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>3.1.15</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/MJRefresh/MJRefresh-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_MJRefresh : NSObject\n@end\n@implementation PodsDummy_MJRefresh\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/MJRefresh/MJRefresh-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/MJRefresh/MJRefresh-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n#import \"MJRefreshAutoFooter.h\"\n#import \"MJRefreshBackFooter.h\"\n#import \"MJRefreshComponent.h\"\n#import \"MJRefreshFooter.h\"\n#import \"MJRefreshHeader.h\"\n#import \"MJRefreshAutoGifFooter.h\"\n#import \"MJRefreshAutoNormalFooter.h\"\n#import \"MJRefreshAutoStateFooter.h\"\n#import \"MJRefreshBackGifFooter.h\"\n#import \"MJRefreshBackNormalFooter.h\"\n#import \"MJRefreshBackStateFooter.h\"\n#import \"MJRefreshGifHeader.h\"\n#import \"MJRefreshNormalHeader.h\"\n#import \"MJRefreshStateHeader.h\"\n#import \"MJRefresh.h\"\n#import \"MJRefreshConst.h\"\n#import \"NSBundle+MJRefresh.h\"\n#import \"UIScrollView+MJExtension.h\"\n#import \"UIScrollView+MJRefresh.h\"\n#import \"UIView+MJExtension.h\"\n\nFOUNDATION_EXPORT double MJRefreshVersionNumber;\nFOUNDATION_EXPORT const unsigned char MJRefreshVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/MJRefresh/MJRefresh.modulemap",
    "content": "framework module MJRefresh {\n  umbrella header \"MJRefresh-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/MJRefresh/MJRefresh.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/MJRefresh\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Public\"\nPODS_BUILD_DIR = $BUILD_DIR\nPODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/MJRefresh\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/Moya/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>10.0.1</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/Moya/Moya-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Moya : NSObject\n@end\n@implementation PodsDummy_Moya\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/Moya/Moya-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/Moya/Moya-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double MoyaVersionNumber;\nFOUNDATION_EXPORT const unsigned char MoyaVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/Moya/Moya.modulemap",
    "content": "framework module Moya {\n  umbrella header \"Moya-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/Moya/Moya.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/Moya\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"$PODS_CONFIGURATION_BUILD_DIR/Alamofire\" \"$PODS_CONFIGURATION_BUILD_DIR/Result\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Public\"\nOTHER_LDFLAGS = -framework \"Foundation\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_BUILD_DIR = $BUILD_DIR\nPODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/Moya\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/NSObject+Rx/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>4.2.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/NSObject+Rx/NSObject+Rx-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_NSObject_Rx : NSObject\n@end\n@implementation PodsDummy_NSObject_Rx\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/NSObject+Rx/NSObject+Rx-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/NSObject+Rx/NSObject+Rx-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double NSObject_RxVersionNumber;\nFOUNDATION_EXPORT const unsigned char NSObject_RxVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/NSObject+Rx/NSObject+Rx.modulemap",
    "content": "framework module NSObject_Rx {\n  umbrella header \"NSObject+Rx-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/NSObject+Rx/NSObject+Rx.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/NSObject+Rx\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"$PODS_CONFIGURATION_BUILD_DIR/RxSwift\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Public\"\nOTHER_LDFLAGS = -framework \"Foundation\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_BUILD_DIR = $BUILD_DIR\nPODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/NSObject+Rx\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/ObjectMapper/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>3.1.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/ObjectMapper/ObjectMapper-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_ObjectMapper : NSObject\n@end\n@implementation PodsDummy_ObjectMapper\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/ObjectMapper/ObjectMapper-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/ObjectMapper/ObjectMapper-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double ObjectMapperVersionNumber;\nFOUNDATION_EXPORT const unsigned char ObjectMapperVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/ObjectMapper/ObjectMapper.modulemap",
    "content": "framework module ObjectMapper {\n  umbrella header \"ObjectMapper-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/ObjectMapper/ObjectMapper.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/ObjectMapper\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Public\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_BUILD_DIR = $BUILD_DIR\nPODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/ObjectMapper\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\nSWIFT_VERSION = 4.0\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-RxXMLY/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>1.0.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-RxXMLY/Pods-RxXMLY-acknowledgements.markdown",
    "content": "# Acknowledgements\nThis application makes use of the following third party libraries:\n\n## Alamofire\n\nCopyright (c) 2014-2017 Alamofire Software Foundation (http://alamofire.org/)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n## Differentiator\n\nMIT License\n\nCopyright (c) 2017 RxSwift Community\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n## IQKeyboardManagerSwift\n\nIQKeyboardManager license\n=========================\n\nThe MIT License (MIT)\n\nCopyright (c) 2013-16 Iftekhar Qurashi\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n## Kingfisher\n\nThe MIT License (MIT)\n\nCopyright (c) 2017 Wei Wang\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n\n## MJRefresh\n\nCopyright (c) 2013-2015 MJRefresh (https://github.com/CoderMJLee/MJRefresh)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n## Moya\n\nThe MIT License (MIT)\n\nCopyright (c) 2017 Artsy, Ash Furrow\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n## NSObject+Rx\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Ash Furrow\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n\n## ObjectMapper\n\nThe MIT License (MIT)\nCopyright (c) 2014 Hearst\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n## ReactorKit\n\nThe MIT License (MIT)\n\nCopyright (c) 2017 Suyeol Jeon (xoul.kr)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n## Result\n\nThe MIT License (MIT)\n\nCopyright (c) 2014 Rob Rix\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n## ReusableKit\n\nThe MIT License (MIT)\n\nCopyright (c) 2016 Suyeol Jeon (xoul.kr)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n## RxAlamofire\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Junior B.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n## RxCocoa\n\n**The MIT License**\n**Copyright © 2015 Krunoslav Zaher**\n**All rights reserved.**\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n## RxDataSources\n\nMIT License\n\nCopyright (c) 2017 RxSwift Community\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n## RxGesture\n\nCopyright (c) RxSwiftCommunity\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n## RxSwift\n\n**The MIT License**\n**Copyright © 2015 Krunoslav Zaher**\n**All rights reserved.**\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n## SnapKit\n\nCopyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n## SwiftyColor\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Suyeol Jeon (xoul.kr)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n## SwiftyJSON\n\nThe MIT License (MIT)\n\nCopyright (c) 2017 Ruoyu Fu\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n## TTRangeSlider\n\nCopyright (c) 2015 Tom Thorpe <code@tomthorpe.co.uk>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n## TYCyclePagerView\n\nMIT License\n\nCopyright (c) 2017 yeBlueColor\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n## TYPagerController\n\nThe MIT License (MIT)\n\nCopyright (c) 2016 tany\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n\n## Then\n\nThe MIT License (MIT)\n\nCopyright (c) 2015 Suyeol Jeon (xoul.kr)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\n## URLNavigator\n\nThe MIT License (MIT)\n\nCopyright (c) 2016 Suyeol Jeon (xoul.kr)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nGenerated by CocoaPods - https://cocoapods.org\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-RxXMLY/Pods-RxXMLY-acknowledgements.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>PreferenceSpecifiers</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>This application makes use of the following third party libraries:</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Acknowledgements</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>Copyright (c) 2014-2017 Alamofire Software Foundation (http://alamofire.org/)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Alamofire</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>MIT License\n\nCopyright (c) 2017 RxSwift Community\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Differentiator</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>IQKeyboardManager license\n=========================\n\nThe MIT License (MIT)\n\nCopyright (c) 2013-16 Iftekhar Qurashi\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>IQKeyboardManagerSwift</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>The MIT License (MIT)\n\nCopyright (c) 2017 Wei Wang\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Kingfisher</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>Copyright (c) 2013-2015 MJRefresh (https://github.com/CoderMJLee/MJRefresh)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>MJRefresh</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>The MIT License (MIT)\n\nCopyright (c) 2017 Artsy, Ash Furrow\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Moya</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>The MIT License (MIT)\n\nCopyright (c) 2015 Ash Furrow\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>NSObject+Rx</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>The MIT License (MIT)\nCopyright (c) 2014 Hearst\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>ObjectMapper</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>The MIT License (MIT)\n\nCopyright (c) 2017 Suyeol Jeon (xoul.kr)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>ReactorKit</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>The MIT License (MIT)\n\nCopyright (c) 2014 Rob Rix\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Result</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>The MIT License (MIT)\n\nCopyright (c) 2016 Suyeol Jeon (xoul.kr)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>ReusableKit</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>The MIT License (MIT)\n\nCopyright (c) 2015 Junior B.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>RxAlamofire</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>**The MIT License**\n**Copyright © 2015 Krunoslav Zaher**\n**All rights reserved.**\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>RxCocoa</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>MIT License\n\nCopyright (c) 2017 RxSwift Community\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>RxDataSources</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>Copyright (c) RxSwiftCommunity\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>RxGesture</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>**The MIT License**\n**Copyright © 2015 Krunoslav Zaher**\n**All rights reserved.**\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>RxSwift</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>SnapKit</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>The MIT License (MIT)\n\nCopyright (c) 2015 Suyeol Jeon (xoul.kr)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>SwiftyColor</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>The MIT License (MIT)\n\nCopyright (c) 2017 Ruoyu Fu\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>SwiftyJSON</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>Copyright (c) 2015 Tom Thorpe &lt;code@tomthorpe.co.uk&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>TTRangeSlider</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>MIT License\n\nCopyright (c) 2017 yeBlueColor\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>TYCyclePagerView</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>The MIT License (MIT)\n\nCopyright (c) 2016 tany\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>TYPagerController</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>The MIT License (MIT)\n\nCopyright (c) 2015 Suyeol Jeon (xoul.kr)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>Then</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>The MIT License (MIT)\n\nCopyright (c) 2016 Suyeol Jeon (xoul.kr)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n</string>\n\t\t\t<key>License</key>\n\t\t\t<string>MIT</string>\n\t\t\t<key>Title</key>\n\t\t\t<string>URLNavigator</string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>FooterText</key>\n\t\t\t<string>Generated by CocoaPods - https://cocoapods.org</string>\n\t\t\t<key>Title</key>\n\t\t\t<string></string>\n\t\t\t<key>Type</key>\n\t\t\t<string>PSGroupSpecifier</string>\n\t\t</dict>\n\t</array>\n\t<key>StringsTable</key>\n\t<string>Acknowledgements</string>\n\t<key>Title</key>\n\t<string>Acknowledgements</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-RxXMLY/Pods-RxXMLY-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Pods_RxXMLY : NSObject\n@end\n@implementation PodsDummy_Pods_RxXMLY\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-RxXMLY/Pods-RxXMLY-frameworks.sh",
    "content": "#!/bin/sh\nset -e\n\necho \"mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\nmkdir -p \"${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n\nSWIFT_STDLIB_PATH=\"${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}\"\n\n# This protects against multiple targets copying the same framework dependency at the same time. The solution\n# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html\nRSYNC_PROTECT_TMP_FILES=(--filter \"P .*.??????\")\n\ninstall_framework()\n{\n  if [ -r \"${BUILT_PRODUCTS_DIR}/$1\" ]; then\n    local source=\"${BUILT_PRODUCTS_DIR}/$1\"\n  elif [ -r \"${BUILT_PRODUCTS_DIR}/$(basename \"$1\")\" ]; then\n    local source=\"${BUILT_PRODUCTS_DIR}/$(basename \"$1\")\"\n  elif [ -r \"$1\" ]; then\n    local source=\"$1\"\n  fi\n\n  local destination=\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n\n  if [ -L \"${source}\" ]; then\n      echo \"Symlinked...\"\n      source=\"$(readlink \"${source}\")\"\n  fi\n\n  # Use filter instead of exclude so missing patterns don't throw errors.\n  echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${source}\\\" \\\"${destination}\\\"\"\n  rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"\n\n  local basename\n  basename=\"$(basename -s .framework \"$1\")\"\n  binary=\"${destination}/${basename}.framework/${basename}\"\n  if ! [ -r \"$binary\" ]; then\n    binary=\"${destination}/${basename}\"\n  fi\n\n  # Strip invalid architectures so \"fat\" simulator / device frameworks work on device\n  if [[ \"$(file \"$binary\")\" == *\"dynamically linked shared library\"* ]]; then\n    strip_invalid_archs \"$binary\"\n  fi\n\n  # Resign the code if required by the build settings to avoid unstable apps\n  code_sign_if_enabled \"${destination}/$(basename \"$1\")\"\n\n  # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7.\n  if [ \"${XCODE_VERSION_MAJOR}\" -lt 7 ]; then\n    local swift_runtime_libs\n    swift_runtime_libs=$(xcrun otool -LX \"$binary\" | grep --color=never @rpath/libswift | sed -E s/@rpath\\\\/\\(.+dylib\\).*/\\\\1/g | uniq -u  && exit ${PIPESTATUS[0]})\n    for lib in $swift_runtime_libs; do\n      echo \"rsync -auv \\\"${SWIFT_STDLIB_PATH}/${lib}\\\" \\\"${destination}\\\"\"\n      rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"\n      code_sign_if_enabled \"${destination}/${lib}\"\n    done\n  fi\n}\n\n# Copies the dSYM of a vendored framework\ninstall_dsym() {\n  local source=\"$1\"\n  if [ -r \"$source\" ]; then\n    echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \\\"- CVS/\\\" --filter \\\"- .svn/\\\" --filter \\\"- .git/\\\" --filter \\\"- .hg/\\\" --filter \\\"- Headers\\\" --filter \\\"- PrivateHeaders\\\" --filter \\\"- Modules\\\" \\\"${source}\\\" \\\"${DWARF_DSYM_FOLDER_PATH}\\\"\"\n    rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DWARF_DSYM_FOLDER_PATH}\"\n  fi\n}\n\n# Signs a framework with the provided identity\ncode_sign_if_enabled() {\n  if [ -n \"${EXPANDED_CODE_SIGN_IDENTITY}\" -a \"${CODE_SIGNING_REQUIRED}\" != \"NO\" -a \"${CODE_SIGNING_ALLOWED}\" != \"NO\" ]; then\n    # Use the current code_sign_identitiy\n    echo \"Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}\"\n    local code_sign_cmd=\"/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'\"\n\n    if [ \"${COCOAPODS_PARALLEL_CODE_SIGN}\" == \"true\" ]; then\n      code_sign_cmd=\"$code_sign_cmd &\"\n    fi\n    echo \"$code_sign_cmd\"\n    eval \"$code_sign_cmd\"\n  fi\n}\n\n# Strip invalid architectures\nstrip_invalid_archs() {\n  binary=\"$1\"\n  # Get architectures for current file\n  archs=\"$(lipo -info \"$binary\" | rev | cut -d ':' -f1 | rev)\"\n  stripped=\"\"\n  for arch in $archs; do\n    if ! [[ \"${ARCHS}\" == *\"$arch\"* ]]; then\n      # Strip non-valid architectures in-place\n      lipo -remove \"$arch\" -output \"$binary\" \"$binary\" || exit 1\n      stripped=\"$stripped $arch\"\n    fi\n  done\n  if [[ \"$stripped\" ]]; then\n    echo \"Stripped $binary of architectures:$stripped\"\n  fi\n}\n\n\nif [[ \"$CONFIGURATION\" == \"Debug\" ]]; then\n  install_framework \"${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/Differentiator/Differentiator.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/Kingfisher/Kingfisher.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/Moya/Moya.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/NSObject+Rx/NSObject_Rx.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/ObjectMapper/ObjectMapper.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/ReactorKit/ReactorKit.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/Result/Result.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/ReusableKit/ReusableKit.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/RxAlamofire/RxAlamofire.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/RxCocoa/RxCocoa.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/RxDataSources/RxDataSources.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/RxGesture/RxGesture.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/RxSwift/RxSwift.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/SwiftyColor/SwiftyColor.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/SwiftyJSON/SwiftyJSON.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/TTRangeSlider/TTRangeSlider.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/TYCyclePagerView/TYCyclePagerView.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/TYPagerController/TYPagerController.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/Then/Then.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/URLNavigator/URLNavigator.framework\"\nfi\nif [[ \"$CONFIGURATION\" == \"Release\" ]]; then\n  install_framework \"${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/Differentiator/Differentiator.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/Kingfisher/Kingfisher.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/Moya/Moya.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/NSObject+Rx/NSObject_Rx.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/ObjectMapper/ObjectMapper.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/ReactorKit/ReactorKit.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/Result/Result.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/ReusableKit/ReusableKit.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/RxAlamofire/RxAlamofire.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/RxCocoa/RxCocoa.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/RxDataSources/RxDataSources.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/RxGesture/RxGesture.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/RxSwift/RxSwift.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/SwiftyColor/SwiftyColor.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/SwiftyJSON/SwiftyJSON.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/TTRangeSlider/TTRangeSlider.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/TYCyclePagerView/TYCyclePagerView.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/TYPagerController/TYPagerController.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/Then/Then.framework\"\n  install_framework \"${BUILT_PRODUCTS_DIR}/URLNavigator/URLNavigator.framework\"\nfi\nif [ \"${COCOAPODS_PARALLEL_CODE_SIGN}\" == \"true\" ]; then\n  wait\nfi\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-RxXMLY/Pods-RxXMLY-resources.sh",
    "content": "#!/bin/sh\nset -e\n\nmkdir -p \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\n\nRESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt\n> \"$RESOURCES_TO_COPY\"\n\nXCASSET_FILES=()\n\n# This protects against multiple targets copying the same framework dependency at the same time. The solution\n# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html\nRSYNC_PROTECT_TMP_FILES=(--filter \"P .*.??????\")\n\ncase \"${TARGETED_DEVICE_FAMILY}\" in\n  1,2)\n    TARGET_DEVICE_ARGS=\"--target-device ipad --target-device iphone\"\n    ;;\n  1)\n    TARGET_DEVICE_ARGS=\"--target-device iphone\"\n    ;;\n  2)\n    TARGET_DEVICE_ARGS=\"--target-device ipad\"\n    ;;\n  3)\n    TARGET_DEVICE_ARGS=\"--target-device tv\"\n    ;;\n  4)\n    TARGET_DEVICE_ARGS=\"--target-device watch\"\n    ;;\n  *)\n    TARGET_DEVICE_ARGS=\"--target-device mac\"\n    ;;\nesac\n\ninstall_resource()\n{\n  if [[ \"$1\" = /* ]] ; then\n    RESOURCE_PATH=\"$1\"\n  else\n    RESOURCE_PATH=\"${PODS_ROOT}/$1\"\n  fi\n  if [[ ! -e \"$RESOURCE_PATH\" ]] ; then\n    cat << EOM\nerror: Resource \"$RESOURCE_PATH\" not found. Run 'pod install' to update the copy resources script.\nEOM\n    exit 1\n  fi\n  case $RESOURCE_PATH in\n    *.storyboard)\n      echo \"ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}\" || true\n      ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .storyboard`.storyboardc\" \"$RESOURCE_PATH\" --sdk \"${SDKROOT}\" ${TARGET_DEVICE_ARGS}\n      ;;\n    *.xib)\n      echo \"ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}\" || true\n      ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \\\"$RESOURCE_PATH\\\" .xib`.nib\" \"$RESOURCE_PATH\" --sdk \"${SDKROOT}\" ${TARGET_DEVICE_ARGS}\n      ;;\n    *.framework)\n      echo \"mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\" || true\n      mkdir -p \"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      echo \"rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\" || true\n      rsync --delete -av \"${RSYNC_PROTECT_TMP_FILES[@]}\" \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\n      ;;\n    *.xcdatamodel)\n      echo \"xcrun momc \\\"$RESOURCE_PATH\\\" \\\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\"`.mom\\\"\" || true\n      xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcdatamodel`.mom\"\n      ;;\n    *.xcdatamodeld)\n      echo \"xcrun momc \\\"$RESOURCE_PATH\\\" \\\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcdatamodeld`.momd\\\"\" || true\n      xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcdatamodeld`.momd\"\n      ;;\n    *.xcmappingmodel)\n      echo \"xcrun mapc \\\"$RESOURCE_PATH\\\" \\\"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcmappingmodel`.cdm\\\"\" || true\n      xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xcmappingmodel`.cdm\"\n      ;;\n    *.xcassets)\n      ABSOLUTE_XCASSET_FILE=\"$RESOURCE_PATH\"\n      XCASSET_FILES+=(\"$ABSOLUTE_XCASSET_FILE\")\n      ;;\n    *)\n      echo \"$RESOURCE_PATH\" || true\n      echo \"$RESOURCE_PATH\" >> \"$RESOURCES_TO_COPY\"\n      ;;\n  esac\n}\n\nmkdir -p \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nrsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from=\"$RESOURCES_TO_COPY\" / \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nif [[ \"${ACTION}\" == \"install\" ]] && [[ \"${SKIP_INSTALL}\" == \"NO\" ]]; then\n  mkdir -p \"${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\n  rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from=\"$RESOURCES_TO_COPY\" / \"${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nfi\nrm -f \"$RESOURCES_TO_COPY\"\n\nif [[ -n \"${WRAPPER_EXTENSION}\" ]] && [ \"`xcrun --find actool`\" ] && [ -n \"$XCASSET_FILES\" ]\nthen\n  # Find all other xcassets (this unfortunately includes those of path pods and other targets).\n  OTHER_XCASSETS=$(find \"$PWD\" -iname \"*.xcassets\" -type d)\n  while read line; do\n    if [[ $line != \"${PODS_ROOT}*\" ]]; then\n      XCASSET_FILES+=(\"$line\")\n    fi\n  done <<<\"$OTHER_XCASSETS\"\n\n  printf \"%s\\0\" \"${XCASSET_FILES[@]}\" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform \"${PLATFORM_NAME}\" --minimum-deployment-target \"${!DEPLOYMENT_TARGET_SETTING_NAME}\" ${TARGET_DEVICE_ARGS} --compress-pngs --compile \"${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"\nfi\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-RxXMLY/Pods-RxXMLY-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double Pods_RxXMLYVersionNumber;\nFOUNDATION_EXPORT const unsigned char Pods_RxXMLYVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-RxXMLY/Pods-RxXMLY.debug.xcconfig",
    "content": "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"$PODS_CONFIGURATION_BUILD_DIR/Alamofire\" \"$PODS_CONFIGURATION_BUILD_DIR/Differentiator\" \"$PODS_CONFIGURATION_BUILD_DIR/IQKeyboardManagerSwift\" \"$PODS_CONFIGURATION_BUILD_DIR/Kingfisher\" \"$PODS_CONFIGURATION_BUILD_DIR/MJRefresh\" \"$PODS_CONFIGURATION_BUILD_DIR/Moya\" \"$PODS_CONFIGURATION_BUILD_DIR/NSObject+Rx\" \"$PODS_CONFIGURATION_BUILD_DIR/ObjectMapper\" \"$PODS_CONFIGURATION_BUILD_DIR/ReactorKit\" \"$PODS_CONFIGURATION_BUILD_DIR/Result\" \"$PODS_CONFIGURATION_BUILD_DIR/ReusableKit\" \"$PODS_CONFIGURATION_BUILD_DIR/RxAlamofire\" \"$PODS_CONFIGURATION_BUILD_DIR/RxCocoa\" \"$PODS_CONFIGURATION_BUILD_DIR/RxDataSources\" \"$PODS_CONFIGURATION_BUILD_DIR/RxGesture\" \"$PODS_CONFIGURATION_BUILD_DIR/RxSwift\" \"$PODS_CONFIGURATION_BUILD_DIR/SnapKit\" \"$PODS_CONFIGURATION_BUILD_DIR/SwiftyColor\" \"$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON\" \"$PODS_CONFIGURATION_BUILD_DIR/TTRangeSlider\" \"$PODS_CONFIGURATION_BUILD_DIR/TYCyclePagerView\" \"$PODS_CONFIGURATION_BUILD_DIR/TYPagerController\" \"$PODS_CONFIGURATION_BUILD_DIR/Then\" \"$PODS_CONFIGURATION_BUILD_DIR/URLNavigator\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nLD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'\nOTHER_CFLAGS = $(inherited) -iquote \"$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/Differentiator/Differentiator.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/Kingfisher/Kingfisher.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/MJRefresh/MJRefresh.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/Moya/Moya.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/NSObject+Rx/NSObject_Rx.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/ObjectMapper/ObjectMapper.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/ReactorKit/ReactorKit.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/Result/Result.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/ReusableKit/ReusableKit.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/RxAlamofire/RxAlamofire.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/RxCocoa/RxCocoa.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/RxDataSources/RxDataSources.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/RxGesture/RxGesture.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/RxSwift/RxSwift.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/SnapKit/SnapKit.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/SwiftyColor/SwiftyColor.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON/SwiftyJSON.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/TTRangeSlider/TTRangeSlider.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/TYCyclePagerView/TYCyclePagerView.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/TYPagerController/TYPagerController.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/Then/Then.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/URLNavigator/URLNavigator.framework/Headers\"\nOTHER_LDFLAGS = $(inherited) -framework \"Alamofire\" -framework \"Differentiator\" -framework \"IQKeyboardManagerSwift\" -framework \"Kingfisher\" -framework \"MJRefresh\" -framework \"Moya\" -framework \"NSObject_Rx\" -framework \"ObjectMapper\" -framework \"ReactorKit\" -framework \"Result\" -framework \"ReusableKit\" -framework \"RxAlamofire\" -framework \"RxCocoa\" -framework \"RxDataSources\" -framework \"RxGesture\" -framework \"RxSwift\" -framework \"SnapKit\" -framework \"SwiftyColor\" -framework \"SwiftyJSON\" -framework \"TTRangeSlider\" -framework \"TYCyclePagerView\" -framework \"TYPagerController\" -framework \"Then\" -framework \"URLNavigator\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_BUILD_DIR = $BUILD_DIR\nPODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_PODFILE_DIR_PATH = ${SRCROOT}/.\nPODS_ROOT = ${SRCROOT}/Pods\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-RxXMLY/Pods-RxXMLY.modulemap",
    "content": "framework module Pods_RxXMLY {\n  umbrella header \"Pods-RxXMLY-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/Pods-RxXMLY/Pods-RxXMLY.release.xcconfig",
    "content": "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"$PODS_CONFIGURATION_BUILD_DIR/Alamofire\" \"$PODS_CONFIGURATION_BUILD_DIR/Differentiator\" \"$PODS_CONFIGURATION_BUILD_DIR/IQKeyboardManagerSwift\" \"$PODS_CONFIGURATION_BUILD_DIR/Kingfisher\" \"$PODS_CONFIGURATION_BUILD_DIR/MJRefresh\" \"$PODS_CONFIGURATION_BUILD_DIR/Moya\" \"$PODS_CONFIGURATION_BUILD_DIR/NSObject+Rx\" \"$PODS_CONFIGURATION_BUILD_DIR/ObjectMapper\" \"$PODS_CONFIGURATION_BUILD_DIR/ReactorKit\" \"$PODS_CONFIGURATION_BUILD_DIR/Result\" \"$PODS_CONFIGURATION_BUILD_DIR/ReusableKit\" \"$PODS_CONFIGURATION_BUILD_DIR/RxAlamofire\" \"$PODS_CONFIGURATION_BUILD_DIR/RxCocoa\" \"$PODS_CONFIGURATION_BUILD_DIR/RxDataSources\" \"$PODS_CONFIGURATION_BUILD_DIR/RxGesture\" \"$PODS_CONFIGURATION_BUILD_DIR/RxSwift\" \"$PODS_CONFIGURATION_BUILD_DIR/SnapKit\" \"$PODS_CONFIGURATION_BUILD_DIR/SwiftyColor\" \"$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON\" \"$PODS_CONFIGURATION_BUILD_DIR/TTRangeSlider\" \"$PODS_CONFIGURATION_BUILD_DIR/TYCyclePagerView\" \"$PODS_CONFIGURATION_BUILD_DIR/TYPagerController\" \"$PODS_CONFIGURATION_BUILD_DIR/Then\" \"$PODS_CONFIGURATION_BUILD_DIR/URLNavigator\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nLD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'\nOTHER_CFLAGS = $(inherited) -iquote \"$PODS_CONFIGURATION_BUILD_DIR/Alamofire/Alamofire.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/Differentiator/Differentiator.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/Kingfisher/Kingfisher.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/MJRefresh/MJRefresh.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/Moya/Moya.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/NSObject+Rx/NSObject_Rx.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/ObjectMapper/ObjectMapper.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/ReactorKit/ReactorKit.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/Result/Result.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/ReusableKit/ReusableKit.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/RxAlamofire/RxAlamofire.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/RxCocoa/RxCocoa.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/RxDataSources/RxDataSources.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/RxGesture/RxGesture.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/RxSwift/RxSwift.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/SnapKit/SnapKit.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/SwiftyColor/SwiftyColor.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON/SwiftyJSON.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/TTRangeSlider/TTRangeSlider.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/TYCyclePagerView/TYCyclePagerView.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/TYPagerController/TYPagerController.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/Then/Then.framework/Headers\" -iquote \"$PODS_CONFIGURATION_BUILD_DIR/URLNavigator/URLNavigator.framework/Headers\"\nOTHER_LDFLAGS = $(inherited) -framework \"Alamofire\" -framework \"Differentiator\" -framework \"IQKeyboardManagerSwift\" -framework \"Kingfisher\" -framework \"MJRefresh\" -framework \"Moya\" -framework \"NSObject_Rx\" -framework \"ObjectMapper\" -framework \"ReactorKit\" -framework \"Result\" -framework \"ReusableKit\" -framework \"RxAlamofire\" -framework \"RxCocoa\" -framework \"RxDataSources\" -framework \"RxGesture\" -framework \"RxSwift\" -framework \"SnapKit\" -framework \"SwiftyColor\" -framework \"SwiftyJSON\" -framework \"TTRangeSlider\" -framework \"TYCyclePagerView\" -framework \"TYPagerController\" -framework \"Then\" -framework \"URLNavigator\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_BUILD_DIR = $BUILD_DIR\nPODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_PODFILE_DIR_PATH = ${SRCROOT}/.\nPODS_ROOT = ${SRCROOT}/Pods\n"
  },
  {
    "path": "Pods/Target Support Files/ReactorKit/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>1.1.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/ReactorKit/ReactorKit-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_ReactorKit : NSObject\n@end\n@implementation PodsDummy_ReactorKit\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/ReactorKit/ReactorKit-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/ReactorKit/ReactorKit-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n#import \"ReactorKitRuntime.h\"\n\nFOUNDATION_EXPORT double ReactorKitVersionNumber;\nFOUNDATION_EXPORT const unsigned char ReactorKitVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/ReactorKit/ReactorKit.modulemap",
    "content": "framework module ReactorKit {\n  umbrella header \"ReactorKit-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/ReactorKit/ReactorKit.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/ReactorKit\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"$PODS_CONFIGURATION_BUILD_DIR/RxSwift\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Public\"\nOTHER_LDFLAGS = -framework \"Foundation\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_BUILD_DIR = $BUILD_DIR\nPODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/ReactorKit\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/Result/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>3.2.4</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/Result/Result-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Result : NSObject\n@end\n@implementation PodsDummy_Result\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/Result/Result-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/Result/Result-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double ResultVersionNumber;\nFOUNDATION_EXPORT const unsigned char ResultVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/Result/Result.modulemap",
    "content": "framework module Result {\n  umbrella header \"Result-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/Result/Result.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/Result\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Public\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_BUILD_DIR = $BUILD_DIR\nPODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/Result\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/ReusableKit/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>2.0.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/ReusableKit/ReusableKit-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_ReusableKit : NSObject\n@end\n@implementation PodsDummy_ReusableKit\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/ReusableKit/ReusableKit-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/ReusableKit/ReusableKit-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double ReusableKitVersionNumber;\nFOUNDATION_EXPORT const unsigned char ReusableKitVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/ReusableKit/ReusableKit.modulemap",
    "content": "framework module ReusableKit {\n  umbrella header \"ReusableKit-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/ReusableKit/ReusableKit.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/ReusableKit\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"$PODS_CONFIGURATION_BUILD_DIR/RxCocoa\" \"$PODS_CONFIGURATION_BUILD_DIR/RxSwift\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Public\"\nOTHER_LDFLAGS = -framework \"Foundation\" -framework \"UIKit\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_BUILD_DIR = $BUILD_DIR\nPODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/ReusableKit\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/RxAlamofire/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>4.0.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/RxAlamofire/RxAlamofire-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_RxAlamofire : NSObject\n@end\n@implementation PodsDummy_RxAlamofire\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/RxAlamofire/RxAlamofire-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/RxAlamofire/RxAlamofire-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double RxAlamofireVersionNumber;\nFOUNDATION_EXPORT const unsigned char RxAlamofireVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/RxAlamofire/RxAlamofire.modulemap",
    "content": "framework module RxAlamofire {\n  umbrella header \"RxAlamofire-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/RxAlamofire/RxAlamofire.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/RxAlamofire\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"$PODS_CONFIGURATION_BUILD_DIR/Alamofire\" \"$PODS_CONFIGURATION_BUILD_DIR/RxSwift\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Public\"\nOTHER_LDFLAGS = -framework \"Foundation\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_BUILD_DIR = $BUILD_DIR\nPODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/RxAlamofire\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/RxCocoa/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>4.0.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/RxCocoa/RxCocoa-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_RxCocoa : NSObject\n@end\n@implementation PodsDummy_RxCocoa\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/RxCocoa/RxCocoa-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/RxCocoa/RxCocoa-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n#import \"RxCocoa.h\"\n#import \"RxCocoaRuntime.h\"\n#import \"_RX.h\"\n#import \"_RXDelegateProxy.h\"\n#import \"_RXKVOObserver.h\"\n#import \"_RXObjCRuntime.h\"\n\nFOUNDATION_EXPORT double RxCocoaVersionNumber;\nFOUNDATION_EXPORT const unsigned char RxCocoaVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/RxCocoa/RxCocoa.modulemap",
    "content": "framework module RxCocoa {\n  umbrella header \"RxCocoa-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/RxCocoa/RxCocoa.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/RxCocoa\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"$PODS_CONFIGURATION_BUILD_DIR/RxSwift\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Public\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_BUILD_DIR = $BUILD_DIR\nPODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/RxCocoa\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/RxDataSources/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>3.0.2</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/RxDataSources/RxDataSources-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_RxDataSources : NSObject\n@end\n@implementation PodsDummy_RxDataSources\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/RxDataSources/RxDataSources-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/RxDataSources/RxDataSources-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double RxDataSourcesVersionNumber;\nFOUNDATION_EXPORT const unsigned char RxDataSourcesVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/RxDataSources/RxDataSources.modulemap",
    "content": "framework module RxDataSources {\n  umbrella header \"RxDataSources-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/RxDataSources/RxDataSources.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/RxDataSources\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"$PODS_CONFIGURATION_BUILD_DIR/Differentiator\" \"$PODS_CONFIGURATION_BUILD_DIR/RxCocoa\" \"$PODS_CONFIGURATION_BUILD_DIR/RxSwift\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Public\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_BUILD_DIR = $BUILD_DIR\nPODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/RxDataSources\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/RxGesture/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>1.2.1</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/RxGesture/RxGesture-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_RxGesture : NSObject\n@end\n@implementation PodsDummy_RxGesture\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/RxGesture/RxGesture-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/RxGesture/RxGesture-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double RxGestureVersionNumber;\nFOUNDATION_EXPORT const unsigned char RxGestureVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/RxGesture/RxGesture.modulemap",
    "content": "framework module RxGesture {\n  umbrella header \"RxGesture-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/RxGesture/RxGesture.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/RxGesture\nFRAMEWORK_SEARCH_PATHS = $(inherited) \"$PODS_CONFIGURATION_BUILD_DIR/RxCocoa\" \"$PODS_CONFIGURATION_BUILD_DIR/RxSwift\"\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Public\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_BUILD_DIR = $BUILD_DIR\nPODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/RxGesture\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/RxSwift/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>4.0.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/RxSwift/RxSwift-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_RxSwift : NSObject\n@end\n@implementation PodsDummy_RxSwift\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/RxSwift/RxSwift-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/RxSwift/RxSwift-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double RxSwiftVersionNumber;\nFOUNDATION_EXPORT const unsigned char RxSwiftVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/RxSwift/RxSwift.modulemap",
    "content": "framework module RxSwift {\n  umbrella header \"RxSwift-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/RxSwift/RxSwift.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/RxSwift\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Public\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_BUILD_DIR = $BUILD_DIR\nPODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/RxSwift\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/SnapKit/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>4.0.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/SnapKit/SnapKit-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_SnapKit : NSObject\n@end\n@implementation PodsDummy_SnapKit\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/SnapKit/SnapKit-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/SnapKit/SnapKit-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double SnapKitVersionNumber;\nFOUNDATION_EXPORT const unsigned char SnapKitVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/SnapKit/SnapKit.modulemap",
    "content": "framework module SnapKit {\n  umbrella header \"SnapKit-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/SnapKit/SnapKit.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/SnapKit\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Public\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_BUILD_DIR = $BUILD_DIR\nPODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/SnapKit\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/SwiftyColor/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>1.0.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/SwiftyColor/SwiftyColor-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_SwiftyColor : NSObject\n@end\n@implementation PodsDummy_SwiftyColor\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/SwiftyColor/SwiftyColor-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/SwiftyColor/SwiftyColor-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double SwiftyColorVersionNumber;\nFOUNDATION_EXPORT const unsigned char SwiftyColorVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/SwiftyColor/SwiftyColor.modulemap",
    "content": "framework module SwiftyColor {\n  umbrella header \"SwiftyColor-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/SwiftyColor/SwiftyColor.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/SwiftyColor\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Public\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_BUILD_DIR = $BUILD_DIR\nPODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/SwiftyColor\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/SwiftyJSON/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>4.0.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/SwiftyJSON/SwiftyJSON-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_SwiftyJSON : NSObject\n@end\n@implementation PodsDummy_SwiftyJSON\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/SwiftyJSON/SwiftyJSON-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/SwiftyJSON/SwiftyJSON-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double SwiftyJSONVersionNumber;\nFOUNDATION_EXPORT const unsigned char SwiftyJSONVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/SwiftyJSON/SwiftyJSON.modulemap",
    "content": "framework module SwiftyJSON {\n  umbrella header \"SwiftyJSON-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/SwiftyJSON/SwiftyJSON.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/SwiftyJSON\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Public\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_BUILD_DIR = $BUILD_DIR\nPODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/SwiftyJSON\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/TTRangeSlider/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>1.0.5</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/TTRangeSlider/TTRangeSlider-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_TTRangeSlider : NSObject\n@end\n@implementation PodsDummy_TTRangeSlider\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/TTRangeSlider/TTRangeSlider-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/TTRangeSlider/TTRangeSlider-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n#import \"TTRangeSlider.h\"\n#import \"TTRangeSliderDelegate.h\"\n\nFOUNDATION_EXPORT double TTRangeSliderVersionNumber;\nFOUNDATION_EXPORT const unsigned char TTRangeSliderVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/TTRangeSlider/TTRangeSlider.modulemap",
    "content": "framework module TTRangeSlider {\n  umbrella header \"TTRangeSlider-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/TTRangeSlider/TTRangeSlider.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/TTRangeSlider\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Public\"\nPODS_BUILD_DIR = $BUILD_DIR\nPODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/TTRangeSlider\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/TYCyclePagerView/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>1.0.6</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/TYCyclePagerView/TYCyclePagerView-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_TYCyclePagerView : NSObject\n@end\n@implementation PodsDummy_TYCyclePagerView\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/TYCyclePagerView/TYCyclePagerView-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/TYCyclePagerView/TYCyclePagerView-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n#import \"TYCyclePagerTransformLayout.h\"\n#import \"TYCyclePagerView.h\"\n#import \"TYPageControl.h\"\n\nFOUNDATION_EXPORT double TYCyclePagerViewVersionNumber;\nFOUNDATION_EXPORT const unsigned char TYCyclePagerViewVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/TYCyclePagerView/TYCyclePagerView.modulemap",
    "content": "framework module TYCyclePagerView {\n  umbrella header \"TYCyclePagerView-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/TYCyclePagerView/TYCyclePagerView.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/TYCyclePagerView\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Public\"\nPODS_BUILD_DIR = $BUILD_DIR\nPODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/TYCyclePagerView\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/TYPagerController/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>2.0.6</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/TYPagerController/TYPagerController-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_TYPagerController : NSObject\n@end\n@implementation PodsDummy_TYPagerController\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/TYPagerController/TYPagerController-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/TYPagerController/TYPagerController-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n#import \"TYTabPagerBar.h\"\n#import \"TYTabPagerBarCell.h\"\n#import \"TYTabPagerBarLayout.h\"\n#import \"TYTabPagerController.h\"\n#import \"TYTabPagerView.h\"\n#import \"TYPagerController.h\"\n#import \"TYPagerView.h\"\n#import \"TYPagerViewLayout.h\"\n\nFOUNDATION_EXPORT double TYPagerControllerVersionNumber;\nFOUNDATION_EXPORT const unsigned char TYPagerControllerVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/TYPagerController/TYPagerController.modulemap",
    "content": "framework module TYPagerController {\n  umbrella header \"TYPagerController-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/TYPagerController/TYPagerController.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/TYPagerController\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Public\"\nPODS_BUILD_DIR = $BUILD_DIR\nPODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/TYPagerController\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/Then/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>2.3.0</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/Then/Then-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_Then : NSObject\n@end\n@implementation PodsDummy_Then\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/Then/Then-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/Then/Then-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double ThenVersionNumber;\nFOUNDATION_EXPORT const unsigned char ThenVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/Then/Then.modulemap",
    "content": "framework module Then {\n  umbrella header \"Then-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/Then/Then.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/Then\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Public\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_BUILD_DIR = $BUILD_DIR\nPODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/Then\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Target Support Files/URLNavigator/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  <key>CFBundleDevelopmentRegion</key>\n  <string>en</string>\n  <key>CFBundleExecutable</key>\n  <string>${EXECUTABLE_NAME}</string>\n  <key>CFBundleIdentifier</key>\n  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>\n  <key>CFBundleInfoDictionaryVersion</key>\n  <string>6.0</string>\n  <key>CFBundleName</key>\n  <string>${PRODUCT_NAME}</string>\n  <key>CFBundlePackageType</key>\n  <string>FMWK</string>\n  <key>CFBundleShortVersionString</key>\n  <string>2.0.4</string>\n  <key>CFBundleSignature</key>\n  <string>????</string>\n  <key>CFBundleVersion</key>\n  <string>${CURRENT_PROJECT_VERSION}</string>\n  <key>NSPrincipalClass</key>\n  <string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Pods/Target Support Files/URLNavigator/URLNavigator-dummy.m",
    "content": "#import <Foundation/Foundation.h>\n@interface PodsDummy_URLNavigator : NSObject\n@end\n@implementation PodsDummy_URLNavigator\n@end\n"
  },
  {
    "path": "Pods/Target Support Files/URLNavigator/URLNavigator-prefix.pch",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n"
  },
  {
    "path": "Pods/Target Support Files/URLNavigator/URLNavigator-umbrella.h",
    "content": "#ifdef __OBJC__\n#import <UIKit/UIKit.h>\n#else\n#ifndef FOUNDATION_EXPORT\n#if defined(__cplusplus)\n#define FOUNDATION_EXPORT extern \"C\"\n#else\n#define FOUNDATION_EXPORT extern\n#endif\n#endif\n#endif\n\n\nFOUNDATION_EXPORT double URLNavigatorVersionNumber;\nFOUNDATION_EXPORT const unsigned char URLNavigatorVersionString[];\n\n"
  },
  {
    "path": "Pods/Target Support Files/URLNavigator/URLNavigator.modulemap",
    "content": "framework module URLNavigator {\n  umbrella header \"URLNavigator-umbrella.h\"\n\n  export *\n  module * { export * }\n}\n"
  },
  {
    "path": "Pods/Target Support Files/URLNavigator/URLNavigator.xcconfig",
    "content": "CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/URLNavigator\nGCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1\nHEADER_SEARCH_PATHS = \"${PODS_ROOT}/Headers/Private\" \"${PODS_ROOT}/Headers/Public\"\nOTHER_LDFLAGS = -framework \"Foundation\" -framework \"UIKit\"\nOTHER_SWIFT_FLAGS = $(inherited) \"-D\" \"COCOAPODS\"\nPODS_BUILD_DIR = $BUILD_DIR\nPODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)\nPODS_ROOT = ${SRCROOT}\nPODS_TARGET_SRCROOT = ${PODS_ROOT}/URLNavigator\nPRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}\nSKIP_INSTALL = YES\n"
  },
  {
    "path": "Pods/Then/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Suyeol Jeon (xoul.kr)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Pods/Then/README.md",
    "content": "# Then\n\n![Swift](https://img.shields.io/badge/Swift-4.0-orange.svg)\n[![CocoaPods](http://img.shields.io/cocoapods/v/Then.svg)](https://cocoapods.org/pods/Then)\n[![Build Status](https://travis-ci.org/devxoul/Then.svg?branch=master)](https://travis-ci.org/devxoul/Then)\n[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)\n\n✨ Super sweet syntactic sugar for Swift initializers.\n\n## At a Glance\n\nInitialize UILabel **then** set its properties.\n\n```swift\nlet label = UILabel().then {\n  $0.textAlignment = .center\n  $0.textColor = .black\n  $0.text = \"Hello, World!\"\n}\n```\n\nThis is equivalent to:\n\n```swift\nlet label: UILabel = {\n  let label = UILabel()\n  label.textAlignment = .center\n  label.textColor = .black\n  label.text = \"Hello, World!\"\n  return label\n}()\n```\n\n## Tips and Tricks\n\n- You can use `then()` to all of `NSObject` subclasses.\n\n    ```swift\n    let queue = OperationQueue().then {\n      $0.maxConcurrentOperationCount = 1\n    }\n    ```\n\n- Want to use with your own types? Just make extensions.\n\n    ```swift\n    extension MyType: Then {}\n    \n    let instance = MyType().then {\n      $0.really = \"awesome!\"\n    }\n    ```\n\n- Use `with()` when copying the value types.\n\n    ```swift\n    let newFrame = oldFrame.with {\n      $0.size.width = 200\n      $0.size.height = 100\n    }\n    newFrame.width // 200\n    newFrame.height // 100\n    ```\n\n- Use `do()` to do something with less typing.\n\n    ```swift\n    UserDefaults.standard.do {\n      $0.set(\"devxoul\", forKey: \"username\")\n      $0.set(\"devxoul@gmail.com\", forKey: \"email\")\n      $0.synchronize()\n    }\n    ```\n\n## Real World Example\n\nHere's an example usage in an UIViewController subclass.\n\n```swift\nfinal class MyViewController: UIViewController {\n\n  let titleLabel = UILabel().then {\n    $0.textColor = .black\n    $0.textAlignment = .center\n  }\n\n  let tableView = UITableView().then {\n    $0.backgroundColor = .clear\n    $0.separatorStyle = .none\n    $0.register(MyCell.self, forCellReuseIdentifier: \"myCell\")\n  }\n\n  override func viewDidLoad() {\n    super.viewDidLoad()\n    self.view.addSubview(self.titleLabel)\n    self.view.addSubview(self.tableView)\n  }\n\n}\n```\n\n## Installation\n\n- **For iOS 8+ projects** with [CocoaPods](https://cocoapods.org):\n\n    ```ruby\n    pod 'Then'\n    ```\n\n- **For iOS 8+ projects** with [Carthage](https://github.com/Carthage/Carthage):\n\n    ```\n    github \"devxoul/Then\"\n    ```\n\n- **Using [Swift Package Manager](https://swift.org/package-manager)**:\n\n    ```swift\n    import PackageDescription\n\n    let package = Package(\n      name: \"MyAwesomeApp\",\n      dependencies: [\n        .Package(url: \"https://github.com/devxoul/Then\", majorVersion: 2),\n      ]\n    )\n    ```\n\n## License\n\n**Then** is under MIT license. See the [LICENSE](LICENSE) file for more info.\n"
  },
  {
    "path": "Pods/Then/Sources/Then/Then.swift",
    "content": "// The MIT License (MIT)\n//\n// Copyright (c) 2015 Suyeol Jeon (xoul.kr)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport Foundation\nimport CoreGraphics\n#if os(iOS) || os(tvOS)\n  import UIKit.UIGeometry\n#endif\n\npublic protocol Then {}\n\nextension Then where Self: Any {\n\n  /// Makes it available to set properties with closures just after initializing and copying the value types.\n  ///\n  ///     let frame = CGRect().with {\n  ///       $0.origin.x = 10\n  ///       $0.size.width = 100\n  ///     }\n  public func with(_ block: (inout Self) throws -> Void) rethrows -> Self {\n    var copy = self\n    try block(&copy)\n    return copy\n  }\n\n  /// Makes it available to execute something with closures.\n  ///\n  ///     UserDefaults.standard.do {\n  ///       $0.set(\"devxoul\", forKey: \"username\")\n  ///       $0.set(\"devxoul@gmail.com\", forKey: \"email\")\n  ///       $0.synchronize()\n  ///     }\n  public func `do`(_ block: (Self) throws -> Void) rethrows {\n    try block(self)\n  }\n\n}\n\nextension Then where Self: AnyObject {\n\n  /// Makes it available to set properties with closures just after initializing.\n  ///\n  ///     let label = UILabel().then {\n  ///       $0.textAlignment = .Center\n  ///       $0.textColor = UIColor.blackColor()\n  ///       $0.text = \"Hello, World!\"\n  ///     }\n  public func then(_ block: (Self) throws -> Void) rethrows -> Self {\n    try block(self)\n    return self\n  }\n\n}\n\nextension NSObject: Then {}\n\nextension CGPoint: Then {}\nextension CGRect: Then {}\nextension CGSize: Then {}\nextension CGVector: Then {}\n\n#if os(iOS) || os(tvOS)\n  extension UIEdgeInsets: Then {}\n  extension UIOffset: Then {}\n  extension UIRectEdge: Then {}\n#endif\n"
  },
  {
    "path": "Pods/URLNavigator/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2016 Suyeol Jeon (xoul.kr)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Pods/URLNavigator/README.md",
    "content": "# URLNavigator\n\n![Swift](https://img.shields.io/badge/Swift-3.0-orange.svg)\n[![CocoaPods](http://img.shields.io/cocoapods/v/URLNavigator.svg)](https://cocoapods.org/pods/URLNavigator)\n[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)\n[![Build Status](https://travis-ci.org/devxoul/URLNavigator.svg?branch=master)](https://travis-ci.org/devxoul/URLNavigator)\n[![CodeCov](https://img.shields.io/codecov/c/github/devxoul/URLNavigator.svg)](https://codecov.io/gh/devxoul/URLNavigator)\n[![CocoaDocs](https://img.shields.io/cocoapods/metrics/doc-percent/URLNavigator.svg)](http://cocoadocs.org/docsets/URLNavigator/)\n\n⛵️ URLNavigator provides an elegant way to navigate through view controllers by URLs. URL patterns can be mapped by using `URLNavigator.register(_:_:)` function.\n\nURLNavigator can be used for mapping URL patterns with 2 kind of types: `URLNavigable` and `URLOpenHandler`. `URLNavigable` is a type which defines an custom initializer and `URLOpenHandler` is a closure which can be executed. Both an initializer and a closure receive an URL and placeholder values.\n\n\n## Getting Started\n\n#### 1. Understanding URL Patterns\n\nURL patterns can contain placeholders. Placeholders will be replaced with matching values from URLs. Use `<` and `>` to make placeholders. Placeholders can have types: `string`(default), `int`, `float`, and `path`.\n\nFor example, `myapp://user/<int:id>` matches with:\n\n* `myapp://user/123`\n* `myapp://user/87`\n\nBut it doesn't match with:\n\n* `myapp://user/devxoul` (expected int)\n* `myapp://user/123/posts` (different url structure)\n* `/user/devxoul` (missing scheme)\n\n#### 2. Mapping View Controllers and URL Open Handlers\n\nURLNavigator allows to map view controllers ans URL open handlers with URL patterns. Here's an example of mapping URL patterns with view controllers and a closure. Each closures has three parameters: `url`, `values` and `context`.\n\n* `url` is an URL that is passed from `push()` and `present()`.\n* `values` is a dictionary that contains URL placeholder keys and values.\n* `context` is a dictionary which contains extra values passed from `push()`, `present()` or `open()`.\n\n```swift\nlet navigator = Navigator()\n\n// register view controllers\nnavigator.register(\"myapp://user/<int:id>\") { url, values, context in\n  guard let userID = values[\"id\"] as? Int else { return nil }\n  return UserViewController(userID: userID)\n}\nnavigator.register(\"myapp://post/<title>\") { url, values, context in\n  return storyboard.instantiateViewController(withIdentifier: \"PostViewController\")\n}\n\n// register url open handlers\nnavigator.handle(\"myapp://alert\") { url, values, context in\n  let title = url.queryParameters[\"title\"]\n  let message = url.queryParameters[\"message\"]\n  presentAlertController(title: title, message: message)\n  return true\n}\n```\n\n#### 3. Pushing, Presenting and Opening URLs\n\nURLNavigator can push and present view controllers and execute closures with URLs.\n\nProvide the `from` parameter to `push()` to specify the navigation controller which the new view controller will be pushed. Similarly, provide the `from` parameter to `present()` to specify the view controller which the new view controller will be presented. If the `nil` is passed, which is a default value, current application's top most view controller will be used to push or present view controllers.\n\n`present()` takes an extra parameter: `wrap`. If a `UINavigationController` class is specified, the new view controller will be wrapped with the class. Default value is `nil`.\n\n```swift\nNavigator.push(\"myapp://user/123\")\nNavigator.present(\"myapp://post/54321\", wrap: UINavigationController.self)\n\nNavigator.open(\"myapp://alert?title=Hello&message=World\")\n```\n\n\n## Installation\n\n- **For iOS 8+ projects** with [CocoaPods](https://cocoapods.org):\n\n    ```ruby\n    pod 'URLNavigator'\n    ```\n\n- **For iOS 8+ projects** with [Carthage](https://github.com/Carthage/Carthage):\n\n    ```\n    github \"devxoul/URLNavigator\"\n    ```\n\n\n## Example\n\nYou can find an example app [here](https://github.com/devxoul/URLNavigator/tree/master/Example).\n\n1. Build and install the example app.\n2. Open Safari app\n3. Enter `navigator://user/devxoul` in the URL bar.\n4. The example app will be launched.\n\n\n## Tips and Tricks\n\n#### Where to initialize a Navigator instance\n\n1. Define as a global constant:\n\n    ```swift\n    let navigator = Navigator()\n\n    class AppDelegate: UIResponder, UIApplicationDelegate {\n      // ...\n    }\n    ```\n\n2. Register to an IoC container:\n\n    ```swift\n    container.register(NavigatorType.self) { _ in Navigator() } // Swinject\n    let navigator = container.resolve(NavigatorType.self)!\n    ```\n\n3. Inject dependency from a composition root.\n\n\n#### Where to Map URLs\n\nI'd prefer using separated URL map file.\n\n```swift\nstruct URLNavigationMap {\n  static func initialize(navigator: NavigatorType) {\n    navigator.register(\"myapp://user/<int:id>\") { ... }\n    navigator.register(\"myapp://post/<title>\") { ... }\n    navigator.handle(\"myapp://alert\") { ... }\n  }\n}\n```\n\nThen call `initialize()` at `AppDelegate`'s `application:didFinishLaunchingWithOptions:`.\n\n```swift\n@UIApplicationMain\nfinal class AppDelegate: UIResponder, UIApplicationDelegate {\n  func application(\n    _ application: UIApplication,\n    didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?\n  ) -> Bool {\n    // Navigator\n    URLNavigationMap.initialize(navigator: navigator)\n    \n    // Do something else...\n  }\n}\n```\n\n\n#### Implementing AppDelegate Launch Option URL\n\nIt's available to open your app with URLs if custom schemes are registered. In order to navigate to view controllers with URLs, you'll have to implement `application:didFinishLaunchingWithOptions:` method.\n\n```swift\nfunc application(\n  _ application: UIApplication,\n  didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?\n) -> Bool {\n  // ...\n  if let url = launchOptions?[.url] as? URL {\n    if let opened = navigator.open(url)\n    if !opened {\n      navigator.present(url)\n    }\n  }\n  return true\n}\n\n```\n\n\n#### Implementing AppDelegate Open URL Method\n\nYou'll might want to implement custom URL open handler. Here's an example of using URLNavigator with other URL open handlers.\n\n```swift\nfunc application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {\n  // If you're using Facebook SDK\n  let fb = FBSDKApplicationDelegate.sharedInstance()\n  if fb.application(application, open: url, sourceApplication: sourceApplication, annotation: annotation) {\n    return true\n  }\n\n  // URLNavigator Handler\n  if navigator.open(url) {\n    return true\n  }\n\n  // URLNavigator View Controller\n  if navigator.present(url, wrap: UINavigationController.self) != nil {\n    return true\n  }\n\n  return false\n}\n```\n\n\n#### Passing Extra Values when Pushing, Presenting and Opening\n\n```swift\nlet context: [AnyHashable: Any] = [\n  \"fromViewController\": self\n]\nNavigator.push(\"myapp://user/10\", context: context)\nNavigator.present(\"myapp://user/10\", context: context)\nNavigator.open(\"myapp://alert?title=Hi\", context: context)\n```\n\n\n## License\n\nURLNavigator is under MIT license. See the [LICENSE](LICENSE) file for more info.\n"
  },
  {
    "path": "Pods/URLNavigator/Sources/URLMatcher/URLConvertible.swift",
    "content": "import Foundation\n\n/// A type which can be converted to an URL string.\npublic protocol URLConvertible {\n  var urlValue: URL? { get }\n  var urlStringValue: String { get }\n\n  /// Returns URL query parameters. For convenience, this property will never return `nil` even if\n  /// there's no query string in the URL. This property doesn't take care of the duplicated keys.\n  /// For checking duplicated keys, use `queryItems` instead.\n  ///\n  /// - seealso: `queryItems`\n  var queryParameters: [String: String] { get }\n\n  /// Returns `queryItems` property of `URLComponents` instance.\n  ///\n  /// - seealso: `queryParameters`\n  @available(iOS 8, *)\n  var queryItems: [URLQueryItem]? { get }\n}\n\nextension URLConvertible {\n  public var queryParameters: [String: String] {\n    var parameters = [String: String]()\n    self.urlValue?.query?.components(separatedBy: \"&\").forEach {\n      let keyAndValue = $0.components(separatedBy: \"=\")\n      if keyAndValue.count == 2 {\n        let key = keyAndValue[0]\n        let value = keyAndValue[1].removingPercentEncoding ?? keyAndValue[1]\n        parameters[key] = value\n      }\n    }\n    return parameters\n  }\n\n  @available(iOS 8, *)\n  public var queryItems: [URLQueryItem]? {\n    return URLComponents(string: self.urlStringValue)?.queryItems\n  }\n}\n\nextension String: URLConvertible {\n  public var urlValue: URL? {\n    if let url = URL(string: self) {\n      return url\n    }\n    var set = CharacterSet()\n    set.formUnion(.urlHostAllowed)\n    set.formUnion(.urlPathAllowed)\n    set.formUnion(.urlQueryAllowed)\n    set.formUnion(.urlFragmentAllowed)\n    return self.addingPercentEncoding(withAllowedCharacters: set).flatMap { URL(string: $0) }\n  }\n\n  public var urlStringValue: String {\n    return self\n  }\n}\n\nextension URL: URLConvertible {\n  public var urlValue: URL? {\n    return self\n  }\n\n  public var urlStringValue: String {\n    return self.absoluteString\n  }\n}\n\n"
  },
  {
    "path": "Pods/URLNavigator/Sources/URLMatcher/URLMatchResult.swift",
    "content": "/// Represents an URL match result.\npublic struct URLMatchResult {\n  /// The url pattern that was matched.\n  public let pattern: String\n\n  /// The values extracted from the URL placeholder.\n  public let values: [String: Any]\n}\n"
  },
  {
    "path": "Pods/URLNavigator/Sources/URLMatcher/URLMatcher.swift",
    "content": "import Foundation\n\n/// URLMatcher provides a way to match URLs against a list of specified patterns.\n///\n/// URLMatcher extracts the pattern and the values from the URL if possible.\nopen class URLMatcher {\n  public typealias URLPattern = String\n  public typealias URLValueConverter = (_ pathComponents: [String], _ index: Int) -> Any?\n\n  static let defaultURLValueConverters: [String: URLValueConverter] = [\n    \"string\": { pathComponents, index in\n      return pathComponents[index]\n    },\n    \"int\": { pathComponents, index in\n      return Int(pathComponents[index])\n    },\n    \"float\": { pathComponents, index in\n      return Float(pathComponents[index])\n    },\n    \"uuid\": { pathComponents, index in\n      return UUID(uuidString: pathComponents[index])\n    },\n    \"path\": { pathComponents, index in\n      return pathComponents[index..<pathComponents.count].joined(separator: \"/\")\n    }\n  ]\n\n  open var valueConverters: [String: URLValueConverter] = URLMatcher.defaultURLValueConverters\n\n  public init() {\n    // 🔄 I'm an URLMatcher!\n  }\n\n  /// Returns a matching URL pattern and placeholder values from the specified URL and patterns.\n  /// It returns `nil` if the given URL is not contained in the URL patterns.\n  ///\n  /// For example:\n  ///\n  ///     let result = matcher.match(\"myapp://user/123\", from: [\"myapp://user/<int:id>\"])\n  ///\n  /// The value of the `URLPattern` from an example above is `\"myapp://user/<int:id>\"` and the\n  /// value of the `values` is `[\"id\": 123]`.\n  ///\n  /// - parameter url: The placeholder-filled URL.\n  /// - parameter from: The array of URL patterns.\n  ///\n  /// - returns: A `URLMatchComponents` struct that holds the URL pattern string, a dictionary of\n  ///            the URL placeholder values.\n  open func match(_ url: URLConvertible, from candidates: [URLPattern]) -> URLMatchResult? {\n    let url = self.normalizeURL(url)\n    let scheme = url.urlValue?.scheme\n    let stringPathComponents = self.stringPathComponents(from :url)\n\n    for candidate in candidates {\n      guard scheme == candidate.urlValue?.scheme else { continue }\n      if let result = self.match(stringPathComponents, with: candidate) {\n        return result\n      }\n    }\n\n    return nil\n  }\n\n  func match(_ stringPathComponents: [String], with candidate: URLPattern) -> URLMatchResult? {\n    let normalizedCandidate = self.normalizeURL(candidate).urlStringValue\n    let candidatePathComponents = self.pathComponents(from: normalizedCandidate)\n    guard self.ensurePathComponentsCount(stringPathComponents, candidatePathComponents) else {\n      return nil\n    }\n\n    var urlValues: [String: Any] = [:]\n\n    let pairCount = min(stringPathComponents.count, candidatePathComponents.count)\n    for index in 0..<pairCount {\n      let result = self.matchStringPathComponent(\n        at: index,\n        from: stringPathComponents,\n        with: candidatePathComponents\n      )\n\n      switch result {\n      case let .matches(placeholderValue):\n        if let (key, value) = placeholderValue {\n          urlValues[key] = value\n        }\n\n      case .notMatches:\n        return nil\n      }\n    }\n\n    return URLMatchResult(pattern: candidate, values: urlValues)\n  }\n\n  func normalizeURL(_ dirtyURL: URLConvertible) -> URLConvertible {\n    guard dirtyURL.urlValue != nil else { return dirtyURL }\n    var urlString = dirtyURL.urlStringValue\n    urlString = urlString.components(separatedBy: \"?\")[0].components(separatedBy: \"#\")[0]\n    urlString = self.replaceRegex(\":/{3,}\", \"://\", urlString)\n    urlString = self.replaceRegex(\"(?<!:)/{2,}\", \"/\", urlString)\n    urlString = self.replaceRegex(\"(?<!:|:/)/+$\", \"\", urlString)\n    return urlString\n  }\n\n  func replaceRegex(_ pattern: String, _ repl: String, _ string: String) -> String {\n    guard let regex = try? NSRegularExpression(pattern: pattern, options: []) else { return string }\n    let range = NSMakeRange(0, string.count)\n    return regex.stringByReplacingMatches(in: string, options: [], range: range, withTemplate: repl)\n  }\n\n  func ensurePathComponentsCount(\n    _ stringPathComponents: [String],\n    _ candidatePathComponents: [URLPathComponent]\n  ) -> Bool {\n    let hasSameNumberOfComponents = (stringPathComponents.count == candidatePathComponents.count)\n    let containsPathPlaceholderComponent = candidatePathComponents.contains {\n      if case let .placeholder(type, _) = $0, type == \"path\" {\n        return true\n      } else {\n        return false\n      }\n    }\n    return hasSameNumberOfComponents || containsPathPlaceholderComponent\n  }\n\n  func stringPathComponents(from url: URLConvertible) -> [String] {\n    return url.urlStringValue.components(separatedBy: \"/\").lazy\n      .filter { !$0.isEmpty }\n      .filter { !$0.hasSuffix(\":\") }\n  }\n\n  func pathComponents(from url: URLPattern) -> [URLPathComponent] {\n    return self.stringPathComponents(from: url).map(URLPathComponent.init)\n  }\n\n  func matchStringPathComponent(\n    at index: Int,\n    from stringPathComponents: [String],\n    with candidatePathComponents: [URLPathComponent]\n  ) -> URLPathComponentMatchResult {\n    let stringPathComponent = stringPathComponents[index]\n    let urlPathComponent = candidatePathComponents[index]\n\n    switch urlPathComponent {\n    case let .plain(value):\n      guard stringPathComponent == value else { return .notMatches }\n      return .matches(nil)\n\n    case let .placeholder(type, key):\n      guard let type = type, let converter = self.valueConverters[type] else {\n        return .matches((key, stringPathComponent))\n      }\n      if let value = converter(stringPathComponents, index) {\n        return .matches((key, value))\n      } else {\n        return .notMatches\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Pods/URLNavigator/Sources/URLMatcher/URLPatchComponentMatchResult.swift",
    "content": "enum URLPathComponentMatchResult {\n  case matches((key: String, value: Any)?)\n  case notMatches\n}\n"
  },
  {
    "path": "Pods/URLNavigator/Sources/URLMatcher/URLPathComponent.swift",
    "content": "enum URLPathComponent {\n  case plain(String)\n  case placeholder(type: String?, key: String)\n}\n\nextension URLPathComponent {\n  init(_ value: String) {\n    if value.hasPrefix(\"<\") && value.hasSuffix(\">\") {\n      let start = value.index(after: value.startIndex)\n      let end = value.index(before: value.endIndex)\n      let placeholder = value[start..<end] // e.g. \"<int:id>\" -> \"int:id\"\n      let typeAndKey = placeholder.components(separatedBy: \":\")\n      if typeAndKey.count == 1 { // any-type placeholder\n        self = .placeholder(type: nil, key: typeAndKey[0])\n      } else if typeAndKey.count == 2 {\n        self = .placeholder(type: typeAndKey[0], key: typeAndKey[1])\n      } else {\n        self = .plain(value)\n      }\n    } else {\n      self = .plain(value)\n    }\n  }\n}\n\nextension URLPathComponent: Equatable {\n  static func == (lhs: URLPathComponent, rhs: URLPathComponent) -> Bool {\n    switch (lhs, rhs) {\n    case let (.plain(leftValue), .plain(rightValue)):\n      return leftValue == rightValue\n\n    case let (.placeholder(leftType, leftKey), .placeholder(rightType, key: rightKey)):\n      return (leftType == rightType) && (leftKey == rightKey)\n\n    default:\n      return false\n    }\n  }\n}\n"
  },
  {
    "path": "Pods/URLNavigator/Sources/URLNavigator/Navigator.swift",
    "content": "#if os(iOS) || os(tvOS)\nimport UIKit\n\n#if !COCOAPODS\nimport URLMatcher\n#endif\n\nopen class Navigator: NavigatorType {\n  open let matcher = URLMatcher()\n  open weak var delegate: NavigatorDelegate?\n\n  private var viewControllerFactories = [URLPattern: ViewControllerFactory]()\n  private var handlerFactories = [URLPattern: URLOpenHandlerFactory]()\n\n  public init() {\n    // ⛵ I'm a Navigator!\n  }\n\n  open func register(_ pattern: URLPattern, _ factory: @escaping ViewControllerFactory) {\n    self.viewControllerFactories[pattern] = factory\n  }\n\n  open func handle(_ pattern: URLPattern, _ factory: @escaping URLOpenHandlerFactory) {\n    self.handlerFactories[pattern] = factory\n  }\n\n  open func viewController(for url: URLConvertible, context: Any? = nil) -> UIViewController? {\n    let urlPatterns = Array(self.viewControllerFactories.keys)\n    guard let match = self.matcher.match(url, from: urlPatterns) else { return nil }\n    guard let factory = self.viewControllerFactories[match.pattern] else { return nil }\n    return factory(url, match.values, context)\n  }\n\n  open func handler(for url: URLConvertible, context: Any?) -> URLOpenHandler? {\n    let urlPatterns = Array(self.handlerFactories.keys)\n    guard let match = self.matcher.match(url, from: urlPatterns) else { return nil }\n    guard let handler = self.handlerFactories[match.pattern] else { return nil }\n    return { handler(url, match.values, context) }\n  }\n}\n#endif\n"
  },
  {
    "path": "Pods/URLNavigator/Sources/URLNavigator/NavigatorDelegate.swift",
    "content": "#if os(iOS) || os(tvOS)\nimport UIKit\n\npublic protocol NavigatorDelegate: class {\n  /// Returns whether the navigator should push the view controller or not. It returns `true` for\n  /// default.\n  func shouldPush(viewController: UIViewController, from: UINavigationControllerType) -> Bool\n\n  /// Returns whether the navigator should present the view controller or not. It returns `true`\n  /// for default.\n  func shouldPresent(viewController: UIViewController, from: UIViewControllerType) -> Bool\n}\n\nextension NavigatorDelegate {\n  public func shouldPush(viewController: UIViewController, from: UINavigationControllerType) -> Bool {\n    return true\n  }\n\n  public func shouldPresent(viewController: UIViewController, from: UIViewControllerType) -> Bool {\n    return true\n  }\n}\n#endif\n"
  },
  {
    "path": "Pods/URLNavigator/Sources/URLNavigator/NavigatorType.swift",
    "content": "#if os(iOS) || os(tvOS)\nimport UIKit\n\n#if !COCOAPODS\nimport URLMatcher\n#endif\n\npublic typealias URLPattern = String\npublic typealias ViewControllerFactory = (_ url: URLConvertible, _ values: [String: Any], _ context: Any?) -> UIViewController?\npublic typealias URLOpenHandlerFactory = (_ url: URLConvertible, _ values: [String: Any], _ context: Any?) -> Bool\npublic typealias URLOpenHandler = () -> Bool\n\npublic protocol NavigatorType {\n  var matcher: URLMatcher { get }\n  weak var delegate: NavigatorDelegate? { get set }\n\n  /// Registers a view controller factory to the URL pattern.\n  func register(_ pattern: URLPattern, _ factory: @escaping ViewControllerFactory)\n\n  /// Registers an URL open handler to the URL pattern.\n  func handle(_ pattern: URLPattern, _ factory: @escaping URLOpenHandlerFactory)\n\n  /// Returns a matching view controller from the specified URL.\n  ///\n  /// - parameter url: An URL to find view controllers.\n  ///\n  /// - returns: A match view controller or `nil` if not matched.\n  func viewController(for url: URLConvertible, context: Any?) -> UIViewController?\n\n  /// Returns a matching URL handler from the specified URL.\n  ///\n  /// - parameter url: An URL to find url handlers.\n  ///\n  /// - returns: A matching handler factory or `nil` if not matched.\n  func handler(for url: URLConvertible, context: Any?) -> URLOpenHandler?\n\n  /// Pushes a matching view controller to the navigation controller stack.\n  ///\n  /// - note: It is not a good idea to use this method directly because this method requires all\n  ///         parameters. This method eventually gets called when pushing a view controller with\n  ///         an URL, so it's recommended to implement this method only for mocking.\n  @discardableResult\n  func pushURL(_ url: URLConvertible, context: Any?, from: UINavigationControllerType?, animated: Bool) -> UIViewController?\n\n  /// Pushes the view controller to the navigation controller stack.\n  ///\n  /// - note: It is not a good idea to use this method directly because this method requires all\n  ///         parameters. This method eventually gets called when pushing a view controller, so\n  ///         it's recommended to implement this method only for mocking.\n  @discardableResult\n  func pushViewController(_ viewController: UIViewController, from: UINavigationControllerType?, animated: Bool) -> UIViewController?\n\n  /// Presents a matching view controller.\n  ///\n  /// - note: It is not a good idea to use this method directly because this method requires all\n  ///         parameters. This method eventually gets called when presenting a view controller with\n  ///         an URL, so it's recommended to implement this method only for mocking.\n  @discardableResult\n  func presentURL(_ url: URLConvertible, context: Any?, wrap: UINavigationController.Type?, from: UIViewControllerType?, animated: Bool, completion: (() -> Void)?) -> UIViewController?\n\n  /// Presents the view controller.\n  ///\n  /// - note: It is not a good idea to use this method directly because this method requires all\n  ///         parameters. This method eventually gets called when presenting a view controller, so\n  ///         it's recommended to implement this method only for mocking.\n  @discardableResult\n  func presentViewController(_ viewController: UIViewController, wrap: UINavigationController.Type?, from: UIViewControllerType?, animated: Bool, completion: (() -> Void)?) -> UIViewController?\n\n  /// Executes an URL open handler.\n  ///\n  /// - note: It is not a good idea to use this method directly because this method requires all\n  ///         parameters. This method eventually gets called when opening an url, so it's\n  ///         recommended to implement this method only for mocking.\n  @discardableResult\n  func openURL(_ url: URLConvertible, context: Any?) -> Bool\n}\n\n\n// MARK: - Protocol Requirements\n\nextension NavigatorType {\n  public func viewController(for url: URLConvertible) -> UIViewController? {\n    return self.viewController(for: url, context: nil)\n  }\n\n  public func handler(for url: URLConvertible) -> URLOpenHandler? {\n    return self.handler(for: url, context: nil)\n  }\n\n  @discardableResult\n  public func pushURL(_ url: URLConvertible, context: Any? = nil, from: UINavigationControllerType? = nil, animated: Bool = true) -> UIViewController? {\n    guard let viewController = self.viewController(for: url, context: context) else { return nil }\n    return self.pushViewController(viewController, from: from, animated: animated)\n  }\n\n  @discardableResult\n  public func pushViewController(_ viewController: UIViewController, from: UINavigationControllerType?, animated: Bool) -> UIViewController? {\n    guard (viewController is UINavigationController) == false else { return nil }\n    guard let navigationController = from ?? UIViewController.topMost?.navigationController else { return nil }\n    guard self.delegate?.shouldPush(viewController: viewController, from: navigationController) != false else { return nil }\n    navigationController.pushViewController(viewController, animated: animated)\n    return viewController\n  }\n\n  @discardableResult\n  public func presentURL(_ url: URLConvertible, context: Any? = nil, wrap: UINavigationController.Type? = nil, from: UIViewControllerType? = nil, animated: Bool = true, completion: (() -> Void)? = nil) -> UIViewController? {\n    guard let viewController = self.viewController(for: url, context: context) else { return nil }\n    return self.presentViewController(viewController, wrap: wrap, from: from, animated: animated, completion: completion)\n  }\n\n  @discardableResult\n  public func presentViewController(_ viewController: UIViewController, wrap: UINavigationController.Type?, from: UIViewControllerType?, animated: Bool, completion: (() -> Void)?) -> UIViewController? {\n    guard let fromViewController = from ?? UIViewController.topMost else { return nil }\n\n    let viewControllerToPresent: UIViewController\n    if let navigationControllerClass = wrap, (viewController is UINavigationController) == false {\n      viewControllerToPresent = navigationControllerClass.init(rootViewController: viewController)\n    } else {\n      viewControllerToPresent = viewController\n    }\n\n    guard self.delegate?.shouldPresent(viewController: viewController, from: fromViewController) != false else { return nil }\n    fromViewController.present(viewControllerToPresent, animated: animated, completion: completion)\n    return viewController\n  }\n\n  @discardableResult\n  public func openURL(_ url: URLConvertible, context: Any?) -> Bool {\n    guard let handler = self.handler(for: url, context: context) else { return false }\n    return handler()\n  }\n}\n\n\n// MARK: - Syntactic Sugars for Optional Parameters\n\nextension NavigatorType {\n  @discardableResult\n  public func push(_ url: URLConvertible, context: Any? = nil, from: UINavigationControllerType? = nil, animated: Bool = true) -> UIViewController? {\n    return self.pushURL(url, context: context, from: from, animated: animated)\n  }\n\n  @discardableResult\n  public func push(_ viewController: UIViewController, from: UINavigationControllerType? = nil, animated: Bool = true) -> UIViewController? {\n    return self.pushViewController(viewController, from: from, animated: animated)\n  }\n\n  @discardableResult\n  public func present(_ url: URLConvertible, context: Any? = nil, wrap: UINavigationController.Type? = nil, from: UIViewControllerType? = nil, animated: Bool = true, completion: (() -> Void)? = nil) -> UIViewController? {\n    return self.presentURL(url, context: context, wrap: wrap, from: from, animated: animated, completion: completion)\n  }\n\n  @discardableResult\n  public func present(_ viewController: UIViewController, wrap: UINavigationController.Type? = nil, from: UIViewControllerType? = nil, animated: Bool = true, completion: (() -> Void)? = nil) -> UIViewController? {\n    return self.presentViewController(viewController, wrap: wrap, from: from, animated: animated, completion: completion)\n  }\n\n  @discardableResult\n  public func open(_ url: URLConvertible, context: Any? = nil) -> Bool {\n    return self.openURL(url, context: context)\n  }\n}\n#endif\n"
  },
  {
    "path": "Pods/URLNavigator/Sources/URLNavigator/UIViewController+TopMostViewController.swift",
    "content": "#if os(iOS) || os(tvOS)\nimport UIKit\n\nextension UIViewController {\n  private class var sharedApplication: UIApplication? {\n    let selector = NSSelectorFromString(\"sharedApplication\")\n    return UIApplication.perform(selector)?.takeUnretainedValue() as? UIApplication\n  }\n\n  /// Returns the current application's top most view controller.\n  open class var topMost: UIViewController? {\n    guard let currentWindows = self.sharedApplication?.windows else { return nil }\n    var rootViewController: UIViewController?\n    for window in currentWindows {\n      if let windowRootViewController = window.rootViewController {\n        rootViewController = windowRootViewController\n        break\n      }\n    }\n\n    return self.topMost(of: rootViewController)\n  }\n\n  /// Returns the top most view controller from given view controller's stack.\n  open class func topMost(of viewController: UIViewController?) -> UIViewController? {\n    // presented view controller\n    if let presentedViewController = viewController?.presentedViewController {\n      return self.topMost(of: presentedViewController)\n    }\n\n    // UITabBarController\n    if let tabBarController = viewController as? UITabBarController,\n      let selectedViewController = tabBarController.selectedViewController {\n      return self.topMost(of: selectedViewController)\n    }\n\n    // UINavigationController\n    if let navigationController = viewController as? UINavigationController,\n      let visibleViewController = navigationController.visibleViewController {\n      return self.topMost(of: visibleViewController)\n    }\n\n    // UIPageController\n    if let pageViewController = viewController as? UIPageViewController,\n      pageViewController.viewControllers?.count == 1 {\n      return self.topMost(of: pageViewController.viewControllers?.first)\n    }\n\n    // child view controller\n    for subview in viewController?.view?.subviews ?? [] {\n      if let childViewController = subview.next as? UIViewController {\n        return self.topMost(of: childViewController)\n      }\n    }\n\n    return viewController\n  }\n}\n#endif\n"
  },
  {
    "path": "Pods/URLNavigator/Sources/URLNavigator/UIViewControllerType.swift",
    "content": "#if os(iOS) || os(tvOS)\nimport UIKit\n\npublic protocol UINavigationControllerType {\n  func pushViewController(_ viewController: UIViewController, animated: Bool)\n}\n\npublic protocol UIViewControllerType {\n  func present(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)?)\n}\n\nextension UINavigationController: UINavigationControllerType {}\nextension UIViewController: UIViewControllerType {}\n#endif\n"
  },
  {
    "path": "README.md",
    "content": "# RxSwift实现MVVM高仿喜马拉雅的函数响应式编程\n\n\n### RxSwift 简介\n\n[ReactiveX](http://reactivex.io/)（简写: Rx） 是一个可以帮助我们简化异步编程的框架。\n\n它拓展了[观察者模式](https://zh.wikipedia.org/wiki/%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F)。使你能够自由组合多个异步事件，而不需要去关心线程，同步，线程安全，并发数据以及I/O阻塞。\n\n[RxSwift](https://github.com/ReactiveX/RxSwift) 是 [Rx](https://github.com/Reactive-Extensions/Rx.NET) 的 Swift 版本。\n\n它尝试将原有的一些概念移植到 iOS/macOS 平台。\n\n你可以在这里找到跨平台文档 [ReactiveX.io](http://reactivex.io/)。\n\n<!-- more -->\n\n### RxSwift 参考资料\n\n- [RxSwift 中文文档](https://beeth0ven.github.io/RxSwift-Chinese-Documentation/)\n- [RxSwift + ReactorKit 构建信息流框架](https://www.jianshu.com/p/dff7b0368d2b)\n- [Flux 架构入门教程](http://www.ruanyifeng.com/blog/2016/01/flux.html)\n- [RxSwift + MJRefresh 打造自动处理刷新控件状态](http://blog.csdn.net/lincsdnnet/article/details/78328428)\n- [RxSwift 项目实战记录](http://blog.csdn.net/lincsdnnet/article/details/77896404)\n\n### RxSwift 项目实战\n\n#### 动画演示\n\n![喜马拉雅演示动画](http://ovy8j7ypb.bkt.clouddn.com/1.25%E5%96%9C%E9%A9%AC%E6%8B%89%E9%9B%85%E6%BC%94%E7%A4%BA%E5%9B%BEgithub.gif)\n\n#### 源码下载\n\n[RxSwift实现MVVM高仿喜马拉雅的函数响应式编程](https://github.com/sessionCh/RxXMLY)\n\n***注意事项***\n\n- 1.源码下载后，执行 pod update --no-repo-update 更新第三方库；\n- 2.项目运行中，如果数据获取失败，一般是链接失效，需要自己重新去抓取相关的链接；\n- 3.项目仅供学习参考用，如有问题，欢迎指正；\n- 4.项目所使用的图片资源均是从原 ***喜马拉雅 FM*** 中扣出来的，图片资源巨多，只保留了 ***@2*** 倍的图片，依然还有两千多张，所有导致项目源码的体积很大。 \n\n#### 项目计划\n\n目前只是花了些零散的时间做了些基础的功能，项目中事件响应机制和逻辑部分基本是采用 RxSwift 方式来进行的，UI 组件的创建方式基本采用协议方式创建和添加，这种模式值得大家在合适的场合借鉴和采用。\n\n当前已完成以下部分：\n\n- 1.【首页-推荐、精品】模块，其他模块可类比；该模块从数据抓取，数组处理和数据显示，均采用 MVVM 模式开发，对于学习 RxSwift 进行 MVVM 开发比较有借鉴作用；\n- 2.【登录】模块，比较形象的展现了 ***函数响应式编程*** 在进行状态转化方面的优势\n- 3.【我的、设置】模块，简易版 MVVM 模式开发，实现了比较典型的导航栏渐变和顶部图片下拉缩放的效果，如：QQ 空间，喜马拉雅 FM 我的页面的效果；\n- 4.【播放页面】模块待完善。\n\n未来计划从以下两个方面着手：\n\n- 1.架构方面：目前重在学习 RxSwift 函数响应式编程，未来计划对项目架构进行进一步调整，构建成 RxSwift + ReactorKit 的信息流架构；\n- 2.功能方面：后期将加入音视频播放的功能。\n\n#### 效果截图\n\n![高仿喜马拉雅截图1-1](http://upload-images.jianshu.io/upload_images/1126310-d4fa407856a53136.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n\n![高仿喜马拉雅截图1-2](http://upload-images.jianshu.io/upload_images/1126310-34850bc3e862281c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n\n![高仿喜马拉雅截图1-3](http://upload-images.jianshu.io/upload_images/1126310-9c5eec8b7519c9a0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n\n![高仿喜马拉雅截图1-4](http://upload-images.jianshu.io/upload_images/1126310-7e4192dd98de6071.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n\n\n#### 项目结构\n\n![喜马拉雅-目录结构](http://upload-images.jianshu.io/upload_images/1126310-c54e0e33682b4ccb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n\n![喜马拉雅-第三方库](http://upload-images.jianshu.io/upload_images/1126310-9df8a179885aab1d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n\n"
  },
  {
    "path": "RxXMLY/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"AppIcon20x20@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"AppIcon29x29@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"AppIcon40x40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"AppIcon60x60@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\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": "RxXMLY/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/Default.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Default.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": "RxXMLY/Assets.xcassets/favicon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"favicon.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": "RxXMLY/Assets.xcassets/icon_XMLY/+.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"+@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"+@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/-.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"-@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"-@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/3dNeedHeadSet.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"3dNeedHeadSet.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": "RxXMLY/Assets.xcassets/icon_XMLY/Ad_tag_inbanner.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Ad_tag_inbanner@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Ad_tag_incell.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Ad_tag_incell@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Ad_tag_infeed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Ad_tag_infeed@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Album_toast_hint_up.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Album_toast_hint_up@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/AlipaySDK/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/AlipaySDK/bar.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bar@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/AlipaySDK/refresh.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"refresh@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/AlipaySDK/refresh_click.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"refresh_click@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/AlipaySDK/shutdown.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"shutdown@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/AlipaySDK/shutdown_click.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"shutdown_click@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Assets.dataset/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"data\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Assets.car\"\n    }\n  ]\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Cancel_btn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Cancel_btn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Combined Shape.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Combined Shape@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/CorpV0.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"CorpV0@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/CorpV1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"CorpV1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/CorpV10.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"CorpV10@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/CorpV11.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"CorpV11@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/CorpV12.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"CorpV12@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/CorpV13.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"CorpV13@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/CorpV14.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"CorpV14@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/CorpV15.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"CorpV15@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/CorpV16.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"CorpV16@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/CorpV2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"CorpV2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/CorpV3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"CorpV3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/CorpV4.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"CorpV4@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/CorpV5.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"CorpV5@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/CorpV6.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"CorpV6@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/CorpV7.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"CorpV7@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/CorpV8.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"CorpV8@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/CorpV9.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"CorpV9@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/DINCondensed Bold.dataset/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"data\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"DINCondensed Bold.ttf\"\n    }\n  ]\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/DSDigitalNormal.dataset/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"data\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"DSDigitalNormal.ttf\"\n    }\n  ]\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group 2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group 2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group 25.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group 25@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group 3 Copy.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group 3 Copy@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group 7 Copy 3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group 7 Copy 3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_bg_list.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_bg_list@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_ic_audio_left_gif1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_ic_audio_left_gif1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_ic_audio_left_gif2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_ic_audio_left_gif2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_ic_audio_left_gif3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_ic_audio_left_gif3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_ic_audio_right_gif1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_ic_audio_right_gif1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_ic_audio_right_gif2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_ic_audio_right_gif2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_ic_audio_right_gif3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_ic_audio_right_gif3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_ic_delete.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_ic_delete@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_ic_edit.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_ic_edit@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_ic_scteening.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_ic_scteening@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_ic_talk_cancel.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_ic_talk_cancel@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_ic_talk_warning.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_ic_talk_warning@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_ic_talkon_gif1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_ic_talkon_gif1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_ic_talkon_gif2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_ic_talkon_gif2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_ic_talkon_gif3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_ic_talkon_gif3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_ic_talkon_gif4.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_ic_talkon_gif4@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_ic_talkon_gif5.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_ic_talkon_gif5@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_ic_talkon_gif6.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_ic_talkon_gif6@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_ic_warning.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_ic_warning@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_ic_x.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_ic_x@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_icon_>.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_icon_>@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_icon_>@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_icon_announcement.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_icon_announcement@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_icon_close.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_icon_close@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_icon_delete.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_icon_delete@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_icon_establish.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_icon_establish@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_icon_get.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_icon_get@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_icon_manager.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_icon_manager@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_icon_more.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_icon_more@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_icon_moreMsg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_icon_moreMsg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_icon_moregroup_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_icon_moregroup_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_icon_moregroup_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_icon_moregroup_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_icon_owner.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_icon_owner@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_icon_pic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_icon_pic@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_icon_plus.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_icon_plus@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_icon_plus_add_members.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_icon_plus_add_members@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_icon_plus_d.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_icon_plus_d@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_icon_plus_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_icon_plus_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_icon_topic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_icon_topic@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_img_Q&A.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_img_Q&A@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_img_congratulations.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_img_congratulations@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_img_hi.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_img_hi@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_img_meiyouqunzu.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_img_meiyouqunzu@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_img_notice.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_img_notice@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_img_picloading.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_img_picloading@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_img_recruit.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_img_recruit@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_img_sayhi.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_img_sayhi@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Group_img_topic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Group_img_topic@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ID5_lockbg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ID5_lockbg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ID5_skip_normal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ID5_skip_normal@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ID5_skip_pressed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ID5_skip_pressed@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/JSNativeRecoder_upload_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"JSNativeRecoder_upload_bg.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": "RxXMLY/Assets.xcassets/icon_XMLY/Launching.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Launching@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/MCArrow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"MCArrow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/MCLive.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"MCLive@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/MCRecord.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"MCRecord@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/My_ic_massage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"My_ic_massage@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/My_icon_RSS.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"My_icon_RSS@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/My_icon_download.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"My_icon_download@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/My_icon_history.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"My_icon_history@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/My_icon_tgk.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"My_icon_tgk@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/My_jmgl_ic_a+.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"My_jmgl_ic_a+@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"My_jmgl_ic_a+@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/My_more_icon_spread.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"My_more_icon_spread@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/NPCreateComment.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NPCreateComment@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/NPIPauseStatus.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NPIPauseStatus@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/NPIPlayStatus.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NPIPlayStatus@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/NPIShareMore.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NPIShareMore@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/NPIShareWeChat.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NPIShareWeChat@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/NPIShareWeChatF.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NPIShareWeChatF@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/NPIShareWeibo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NPIShareWeibo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/NPProCycle.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NPProCycle@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/NPProCycleHL.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NPProCycleHL@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/NPProDMOff.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NPProDMOff@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/NPProDMOffHL.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NPProDMOffHL@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/NPProDMOn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NPProDMOn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/NPProDMOnHL.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NPProDMOnHL@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/NPProList.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NPProList@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/NPProListHL.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NPProListHL@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/NPProRandom.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NPProRandom@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/NPProRandomHL.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NPProRandomHL@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/NPProSet.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NPProSet@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/NPProSetCmt.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NPProSetCmt@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/NPProSetHL.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NPProSetHL@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/NPProSingle.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NPProSingle@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/NPProSingleHL.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"NPProSingleHL@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/PHGradeArrow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PHGradeArrow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/PHGradeV0.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PHGradeV0@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/PHGradeV1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PHGradeV1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/PHGradeV10.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PHGradeV10@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/PHGradeV11.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PHGradeV11@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/PHGradeV12.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PHGradeV12@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/PHGradeV13.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PHGradeV13@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/PHGradeV14.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PHGradeV14@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/PHGradeV15.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PHGradeV15@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/PHGradeV16.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PHGradeV16@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/PHGradeV2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PHGradeV2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/PHGradeV3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PHGradeV3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/PHGradeV4.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PHGradeV4@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/PHGradeV5.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PHGradeV5@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/PHGradeV6.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PHGradeV6@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/PHGradeV7.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PHGradeV7@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/PHGradeV8.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PHGradeV8@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/PHGradeV9.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PHGradeV9@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/PkgInfo.dataset/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"data\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PkgInfo\"\n    }\n  ]\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/PkgInfo.dataset/PkgInfo",
    "content": "APPL????"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/PushNotificationPayload.dataset/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"data\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"PushNotificationPayload.apns\"\n    }\n  ]\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/PushNotificationPayload.dataset/PushNotificationPayload.apns",
    "content": "{   \"alert\":\"消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容\",\n    \"badge\":1,\n    \"sound\":\"提示音\",\n        \"extra\":\n        {\n            \"n_type\":1,\n            \"msg_type\":1,\n            \"title\":\"标题\",\n            \"message\":\"消息内容\",\n            \"url\":\"消息跳转的url地址\",\n            \"track_id\":12312,\n            \"album_id\":123123,\n            \"uid\":12312,\n            \"recSrc\":\"cf1\",\n            \"recTrack\":\"n\",\n            \"msgId\":\"time_type_id\"\n        }\n}\n"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/QA4Free.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"QA4Free@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/QA4Pay.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"QA4Pay@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/QAIntroBack.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"QAIntroBack@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/QALogo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"QALogo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/QAVolume.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"QAVolume@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/README.dataset/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"data\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"README.txt\"\n    }\n  ]\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/README.dataset/README.txt",
    "content": "=============================\nGoogle Mobile Ads SDK for iOS\n=============================\n\nThis is the Google Mobile Ads SDK for iOS.\n\nRequirements:\n- Xcode 5.1 or later.\n- iOS deployment target of iOS 6.0 or later.\n\nThe latest documentation and code samples are available at:\nhttps://developers.google.com/mobile-ads-sdk/\n"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/RFGuideClose.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"RFGuideClose@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/RF_history.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"RF_history@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/RF_hot_category.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"RF_hot_category@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/RF_icon_loading.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"RF_icon_loading@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/RF_local.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"RF_local@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/RF_news.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"RF_news@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/RF_noContent.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"RF_noContent@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/RF_noInternet.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"RF_noInternet@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/RF_normal_level.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"RF_normal_level@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/RF_other.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"RF_other@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Star.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Star@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/VIP_Album_Section_Image.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"VIP_Album_Section_Image@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/VIP_Answere_Section_Image.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"VIP_Answere_Section_Image@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/VIP_Rights_Section_Image.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"VIP_Rights_Section_Image@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/VIP_card_BG_default.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"VIP_card_BG_default@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/VIP_cell_BG_img.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"VIP_cell_BG_img@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/VIP_cell_small_BG_img.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"VIP_cell_small_BG_img@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/VIP_right_Image.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"VIP_right_Image@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/VIP_split_Image.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"VIP_split_Image@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/VIP_success_big.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"VIP_success_big@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Wifi_rock.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Wifi_rock@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/Wifi_rock_pwd.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Wifi_rock_pwd@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/XMPaySuccessView.dataset/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"data\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"XMPaySuccessView.nib\"\n    }\n  ]\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/XMRefundInfoView.dataset/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"data\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"XMRefundInfoView.nib\"\n    }\n  ]\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/XMUIKit/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/XMUIKit/Info.dataset/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"data\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"Info.plist\"\n    }\n  ]\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/XMUIKit/pullToRefresh_0.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\" : \"pullToRefresh_0@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/XMUIKit/pullToRefresh_1.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\" : \"pullToRefresh_1@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/XMUIKit/pullToRefresh_2.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\" : \"pullToRefresh_2@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/XMUIKit/pullToRefresh_3.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\" : \"pullToRefresh_3@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/XMUIKit/pullToRefresh_4.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\" : \"pullToRefresh_4@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/XMUIKit/pullToRefresh_5.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\" : \"pullToRefresh_5@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/XMUIKit/pullToRefresh_6.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\" : \"pullToRefresh_6@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/XMUIKit/pullToRefresh_7.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\" : \"pullToRefresh_7@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/XMUIKit/pullToRefresh_8.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\" : \"pullToRefresh_8@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/XMUIKit/pullToRefresh_9.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\" : \"pullToRefresh_9@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/XMUIKit/xmb_back_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"xmb_back_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"xmb_back_h@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/XMUIKit/xmb_back_highlight.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"xmb_back_highlight@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"xmb_back_highlight@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/XNLocalizable.dataset/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"data\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"XNLocalizable.strings\"\n    }\n  ]\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/XNLocalizable.dataset/XNLocalizable.strings",
    "content": "/*\n XNLocalizable.strings\n ChatDemo-UI1.0\n \n Created by NTalker-zhou on 16/6/6.\n Copyright © 2016年 NTalker. All rights reserved.\n */\n\n//NTalkerChatViewController(主聊窗)\n\"chatTitle\" = \"在线客服\";//聊窗标题\n\"inputingTitle\" = \"正在输入...\";//客服正在输入\n\"netWorkStatus\" = \"当前网络不可用，请检查网络设置！\";//无网提示\n\"recordBtnTitleNomal\" = \"按住 说话\";//录音按钮标题 默认状态下\n\"recordBtnTitleHlight\" = \"松开 结束\";//录音按钮标题 高亮状态下\n\"sure\" = \"确定\";\n\"deviceUnused\" = \"设备不可用\";\n\"tipTitle\" = \"提　示\";//提示标题\n\"openCameraAuthority\" = \"请在设备的\\\"设置-隐私-相机\\\"中允许访问相机。\";//相机权限提示\n\"cantRecord\" = \"无法录音\";//无法录音提示\n\"openMicrophoneAuthority\" = \"请在“设置-隐私-麦克风”选项中允许访问您的麦克风\";\n//小视频相关\n\"noPermissions\" = \"没有权限\";\n\"openPermissions\" = \"请在设置>隐私>里打开照相机和麦克风的权限\";\n\"ok\" = \"好\";\n\"pressToRecord\" = \"按住录\";\n\"cancel\" = \"取消\";\n\"recordTooShortTip\" = \"录制时间太短\";\n\n\"muchMoreTextTip\" = \"发送的内容过长\";\n\"noTextTip\" = \"发送信息不能为空\";\n//客服非在线提醒\n\"lostNetTip\" = \"连接超时，建议您检查网络环境或返回重新请求\";\n\"customerServiceLeaved\" = \"您好！客服不在线，请留言！\";\n\"onlineUpFront\" = \"您好！客服忙碌中,您排在第\";\n\"onlineUpBehind\" = \"位请稍候或留言!\";\n\"KFLeavedNoLeaveMessage\" = \"您好！客服不在线\";\n\"KFBusyNoLeaveMsgFront\" = \"您好！客服忙碌中,您排在第\";\n\"KFBusyNoLeaveMsgBehind\" = \"位请稍候\";\n//强输时提醒\n\"customerServiceLeavedTip\" = \"亲！客服不在线，请留言！\";\n\"customerServiceBusyTip\" = \"亲！客服忙碌中，请稍候！\";\n\"requestingTip\" = \"正在请求客服...\";\n\"netWorkStatusTip\" = \"亲，请检查网络设置\";\n//访客排队中，提醒\n\"isGiveUp\" = \"您好！是否放弃排队？\";\n\"yes\" = \"是\";\n\"no\" = \"否\";\n//转人工\n\"TurnManual\" = \"转人工\";\n//功能键盘\n\"pictureLabel\" = \"图片\";\n\"cameraLabel\" = \"相机\";\n\"evalueLabel\" = \"评价\";\n\"videoLabel\" = \"视频\";\n\"orderLabel\" = \"订单\";\n\"haveEvaluedLabel\" = \"已评价\";\n//表情\n\"send\" = \"发送\";\n\"historyTip\" = \"以上是历史消息\";\n\"clickLeveMsg\" = \"留言\";\n//录音图片上提示\n\"talkerTooShort\" = \"说话时间太短\";\n\"recordEnding\" = \"松开手指，取消发送\";\n\"talkerEndToVolume\" = \"手指上滑，取消发送\";\n\n//NTalkerLeaveMsgViewController(留言)\n\"leaveMessageTitle\" = \"留言\";\n//placeHold\n\"leaveMsg\" = \"留言...\";\n\"leaveMsgName\" = \"姓名\";\n\"leaveMsgPhoneNum\" = \"电话\";\n\"leaveMsgEmail\" = \"邮箱\";\n\"submit\" = \"提交\";\n\"Required\" = \"必填\";\n\"Notice\" = \"公告\";\n//机器人\n\"systypeClickText\" = \"留言\";//点击留言\n//提示语\n\"limitMsgTipText\" = \"留言内容不能超过400个字符\";\n\"limitNameTipText\" = \"姓名内容过长\";\n\"submitLeaveFail\" = \"留言提交失败\";\n\"submitLeaveSuccess\" = \"留言提交成功\";\n\"unsubmitByNet\" = \"亲，无网络，留言暂时无法提交\";\n\"noleaveMsgTip\" = \"请填写留言内容，谢谢！\";\n\"noLeaveNameTip\" = \"请填写您的姓名，谢谢！\";\n\"noContactInfoTip\" = \"请填写手机号或邮箱！\";\n\"phoneNumErrorTip\" = \"请填写正确的手机号，谢谢!\";\n\"EmailErrorTip\" = \"请填写正确的邮箱，谢谢！\";\n\"phoneOrEmailErrorTip\" = \"请填写有效的电话号码或邮箱\";\n\n//评价\n\"evalue0\" = \"非常满意\";\n\"evalue1\" = \"满意\";\n\"evalue2\" = \"一般\";\n\"evalue3\" = \"不满意\";\n\"evalue4\" = \"非常不满意\";\n\"evalueTitle\" = \"感谢您的支持,请进行评价\";\n\"solveStatus\" = \"问题解决状态\";\n\"solve0\" = \"已解决\";\n\"solve1\" = \"跟进中\";\n\"solve2\" = \"未解决\";\n\"evalueAdvise\" = \"建议与反馈\";\n\"cancelTitle\" = \"取消\";\n\"advisePlaceHold\" = \"此刻的想法\";\n\"limitEvalueTip\" = \"评价内容不能超过200个字符\";\n\"noNetWorkSubmitEvalueTip\" = \"亲！无网络，评价暂时不可提交\";\n\"submitEvalueResult\" = \"评价提交成功!\";\n\n//cell\n\"copyLink\" = \"拷贝链接\";\n//本地未读消息\n\"imageMsg\" = \"图片消息\";\n\"voiceMsg\" = \"语音消息\";\n\"videoMsg\" = \"视频消息\";\n\"fuMadiaMsg\" = \"富媒体消息\";\n//保存照片到相册\n\"successSaveToLibrary\" = \"成功保存图片到相册\";\n\"savePictureFailed\" = \"未能成功保存图片,请检查相册权限设置\";\n\n\n"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/abc_bg_comments.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"abc_bg_comments@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/abc_btn_emoji.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"abc_btn_emoji@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/abc_btn_gallery_camera.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"abc_btn_gallery_camera@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/abc_btn_gallery_check.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"abc_btn_gallery_check@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/abc_btn_gallery_checked.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"abc_btn_gallery_checked@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/abc_btn_gallery_select.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"abc_btn_gallery_select@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/abc_btn_gallery_selected.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"abc_btn_gallery_selected@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/abc_btn_keyboard.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"abc_btn_keyboard@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/abc_btn_talk.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"abc_btn_talk@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/abc_ic_notice_live.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"abc_ic_notice_live@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/abc_img_no_TF.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"abc_img_no_TF@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/abc_img_no_comment.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"abc_img_no_comment@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/abc_img_no_default.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"abc_img_no_default@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/abc_img_no_download.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"abc_img_no_download@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/abc_img_no_fans.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"abc_img_no_fans@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/abc_img_no_history.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"abc_img_no_history@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/abc_img_no_like.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"abc_img_no_like@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/abc_img_no_network.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"abc_img_no_network@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/abc_img_no_search.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"abc_img_no_search@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/abc_img_no_sounds.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"abc_img_no_sounds@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/abc_img_no_subscribe.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"abc_img_no_subscribe@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/abc_img_no_toplist.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"abc_img_no_toplist@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/about_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"about_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/abq_lockscreen.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"abq_lockscreen.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": "RxXMLY/Assets.xcassets/icon_XMLY/activity_begin.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"activity_begin@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/activity_during.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"activity_during@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/activity_end.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"activity_end@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ad_icon_close.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ad_icon_close@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ad_img_logo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ad_img_logo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ad_soundPatch_image.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ad_soundPatch_image.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": "RxXMLY/Assets.xcassets/icon_XMLY/ad_toolbar_pause_n_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ad_toolbar_pause_n_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ad_toolbar_play_n_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ad_toolbar_play_n_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/add.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"add@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/addphoto_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"addphoto_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/addphoto_icon_disable.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"addphoto_icon_disable@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/addphoto_icon_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"addphoto_icon_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/addphoto_kb.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"addphoto_kb@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/airPlay.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"airPlay@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/albumArrow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"albumArrow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/albumHeaderDefault.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"albumHeaderDefault@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/albumSubscribe.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"albumSubscribe@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/albumView_top_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"albumView_top_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_activitytag_default.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_activitytag_default@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_album_mask.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_album_mask@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_blind.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_blind@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_change_btn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_change_btn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_collected.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_collected@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_collected_non.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_collected_non@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_coupon_left.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_coupon_left@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_coupon_right.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_coupon_right@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_cover_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_cover_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_dashed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_dashed@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_down_similar.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_down_similar@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_download.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_download@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_mecoupon_right.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_mecoupon_right@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_multiDownload.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_multiDownload@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_novel_finish.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_novel_finish@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_pay_refund.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_pay_refund@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_play.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_play@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_playCountLogo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_playCountLogo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_plus_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_plus_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_private.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_private@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_rec_unlike.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_rec_unlike@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_rec_unlike_bg_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_rec_unlike_bg_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_rec_unlike_bg_indicator.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_rec_unlike_bg_indicator@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_rec_unlike_bg_indicator_down.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_rec_unlike_bg_indicator_down@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_rec_unlike_bg_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_rec_unlike_bg_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_relative.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_relative@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_relative_album.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_relative_album@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_removed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_removed@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_rightArrow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_rightArrow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_search.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_search@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_segButton.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_segButton@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_sort.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_sort@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_sortButton.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_sortButton@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_sort_down.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_sort_down@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_subscribe_count.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_subscribe_count@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_tag_delete.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_tag_delete@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_tag_normal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_tag_normal@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_tag_selected.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_tag_selected@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_tracks.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_tracks@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_unlike.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_unlike@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_vip_guide_arrow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_vip_guide_arrow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/album_vip_guide_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"album_vip_guide_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/albumpage_audition_ic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"albumpage_audition_ic@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/albumpage_gift_ic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"albumpage_gift_ic@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/albumpage_subscribed_ic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"albumpage_subscribed_ic@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/albumpage_subscription_ic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"albumpage_subscription_ic@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/albumtag_pay.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"albumtag_pay@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/allSing.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"allSing@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/allSingMic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"allSingMic@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/alum_ic_buy_1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"alum_ic_buy_1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/alum_ic_buy_2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"alum_ic_buy_2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/alum_ic_group_1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"alum_ic_group_1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/alum_ic_group_2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"alum_ic_group_2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/alum_ic_group_red_1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"alum_ic_group_red_1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/alum_ic_group_red_2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"alum_ic_group_red_2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/alum_ic_pause_1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"alum_ic_pause_1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/alum_ic_pause_2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"alum_ic_pause_2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/alum_ic_play_1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"alum_ic_play_1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/alum_ic_play_2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"alum_ic_play_2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/alum_ic_share_1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"alum_ic_share_1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/alum_ic_share_2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"alum_ic_share_2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/alum_ic_subscribe_1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"alum_ic_subscribe_1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/alum_ic_subscribe_2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"alum_ic_subscribe_2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/alum_ic_subscribed_1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"alum_ic_subscribed_1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/alum_ic_subscribed_2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"alum_ic_subscribed_2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/anchortop_ic_gift.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"anchortop_ic_gift@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/anchortop_ic_gift_line.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"anchortop_ic_gift_line@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/anchortop_ic_tips.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"anchortop_ic_tips@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/anchortop_ic_top1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"anchortop_ic_top1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/anchortop_ic_top2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"anchortop_ic_top2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/anchortop_ic_top3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"anchortop_ic_top3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/anchortop_ic_topanchor.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"anchortop_ic_topanchor@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/anchortop_ic_weektop.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"anchortop_ic_weektop@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/archived-expanded-entitlements.dataset/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"data\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"archived-expanded-entitlements.xcent\"\n    }\n  ]\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/archived-expanded-entitlements.dataset/archived-expanded-entitlements.xcent",
    "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>aps-environment</key>\n\t<string>development</string>\n\t<key>com.apple.developer.associated-domains</key>\n\t<array>\n\t\t<string>applinks:m.test.ximalaya.com</string>\n\t\t<string>applinks:m.ximalaya.com</string>\n\t</array>\n\t<key>com.apple.security.application-groups</key>\n\t<array>\n\t\t<string>group.com.gemd.iting</string>\n\t</array>\n\t<key>keychain-access-groups</key>\n\t<array>\n\t\t<string>AS4ANJJUVM.com.gemd.iting</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/arrow_down.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"arrow_down@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/arrow_ic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"arrow_ic@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/arrow_up.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"arrow_up@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/audio_AD_close.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"audio_AD_close@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/audition_finish.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"audition_finish@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/autoShutDown.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"autoShutDown@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/avatar_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"avatar_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/badge_num.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"badge_num@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/badge_num1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"badge_num1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/badge_num2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"badge_num2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bg_albumView_header.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bg_albumView_header@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bg_album_detail_text.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bg_album_detail_text@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bg_carlife.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bg_carlife@2x.jpg\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bg_find_segsel.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bg_find_segsel.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": "RxXMLY/Assets.xcassets/icon_XMLY/bg_focusImage_loading.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bg_focusImage_loading@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bg_live_date.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bg_live_date@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bg_msgbox_1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bg_msgbox_1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bg_msgbox_2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bg_msgbox_2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bg_msgbox_3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bg_msgbox_3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bg_statusbar.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bg_statusbar@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bg_transparent.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bg_transparent@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bg_wakeup.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bg_wakeup@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bg_wave.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bg_wave@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bgm_btn_checked.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bgm_btn_checked@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bgm_btn_downloaded.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bgm_btn_downloaded@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bgm_btn_unchecked.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bgm_btn_unchecked@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bgm_tab_btn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bgm_tab_btn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bindMphoneWarning.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bindMphoneWarning@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bindPhone.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bindPhone@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bitingCover.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bitingCover@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bitingMore.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bitingMore@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bitingPlayAll.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bitingPlayAll@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/biting_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"biting_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/biting_slogen.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"biting_slogen@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bmw_connected.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bmw_connected@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bmw_connected_logo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bmw_connected_logo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bmw_lock_line.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bmw_lock_line@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bmw_lockbg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bmw_lockbg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bmw_skip_normal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bmw_skip_normal@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bmw_skip_pressed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bmw_skip_pressed@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bofangtiao_l.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bofangtiao_l@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bofangtiao_r.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bofangtiao_r@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/boom.dataset/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"data\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"boom.json\"\n    }\n  ]\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/boom.dataset/boom.json",
    "content": "{\"v\":\"4.6.10\",\"fr\":24,\"ip\":0,\"op\":20,\"w\":1000,\"h\":1000,\"nm\":\"圈圈 细\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":3,\"nm\":\"CONTROL\",\"ks\":{\"o\":{\"a\":0,\"k\":0},\"r\":{\"a\":0,\"k\":0},\"p\":{\"a\":0,\"k\":[500,500,0]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":0,\"k\":[100,100,100]}},\"ao\":0,\"ip\":0,\"op\":20,\"st\":0,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":2,\"ty\":3,\"nm\":\"dots\",\"parent\":1,\"ks\":{\"o\":{\"a\":0,\"k\":0},\"r\":{\"a\":0,\"k\":0},\"p\":{\"a\":0,\"k\":[0,0,0]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.833,0.833,0.833],\"y\":[0.833,0.833,0.833]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0.167,0.167,0.167]},\"n\":[\"0p833_0p833_0p167_0p167\",\"0p833_0p833_0p167_0p167\",\"0p833_0p833_0p167_0p167\"],\"t\":9.609,\"s\":[95,95,100],\"e\":[108.5,108.5,100]},{\"t\":25.6259765625}]}},\"ao\":0,\"ip\":0,\"op\":20,\"st\":0,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":4,\"ty\":4,\"nm\":\"Dot 9\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":12.812,\"s\":[100],\"e\":[0]},{\"t\":23.2236132616992}]},\"r\":{\"a\":0,\"k\":0},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":0.801,\"s\":[495.409,464.295,0],\"e\":[210.159,188.545,0],\"to\":[42.7916679382324,-199.95832824707,0],\"ti\":[-42.7916679382324,115.958335876465,0]},{\"t\":23.2236132616992}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":-0.801,\"s\":[62.5,62.5,100],\"e\":[250,250,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":8.008,\"s\":[250,250,100],\"e\":[0,0,100]},{\"t\":24.0243945116992}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":0.8008008008008,\"op\":20,\"st\":-0.8008008008008,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":5,\"ty\":4,\"nm\":\"Dot 10\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":13.613,\"s\":[60],\"e\":[0]},{\"t\":24.0244140625}]},\"r\":{\"a\":0,\"k\":0},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":1.602,\"s\":[495.409,464.295,0],\"e\":[210.159,188.545,0],\"to\":[42.7916679382324,-199.95832824707,0],\"ti\":[-42.7916679382324,115.958335876465,0]},{\"t\":24.0244140625}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":0,\"s\":[62.5,62.5,100],\"e\":[300,300,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":8.809,\"s\":[300,300,100],\"e\":[0,0,100]},{\"t\":24.8251953125}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":1.6016016016016,\"op\":20,\"st\":0,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":6,\"ty\":4,\"nm\":\"Dot 11\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":14.414,\"s\":[40],\"e\":[0]},{\"t\":24.8252148633008}]},\"r\":{\"a\":0,\"k\":0},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":2.402,\"s\":[495.409,464.295,0],\"e\":[210.159,188.545,0],\"to\":[42.7916679382324,-199.95832824707,0],\"ti\":[-42.7916679382324,115.958335876465,0]},{\"t\":24.8252148633008}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":0.801,\"s\":[62.5,62.5,100],\"e\":[350,350,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":9.609,\"s\":[350,350,100],\"e\":[0,0,100]},{\"t\":25.6259961133008}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":2.4024024024024,\"op\":20,\"st\":0.8008008008008,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":7,\"ty\":4,\"nm\":\"Dot 12\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":15.215,\"s\":[20],\"e\":[0]},{\"t\":25.6260156641016}]},\"r\":{\"a\":0,\"k\":0},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":3.203,\"s\":[495.409,464.295,0],\"e\":[210.159,188.545,0],\"to\":[42.7916679382324,-199.95832824707,0],\"ti\":[-42.7916679382324,115.958335876465,0]},{\"t\":25.6260156641016}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":1.602,\"s\":[62.5,62.5,100],\"e\":[400,400,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":10.41,\"s\":[400,400,100],\"e\":[0,0,100]},{\"t\":26.4267969141016}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":3.2032032032032,\"op\":20,\"st\":1.6016016016016,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":8,\"ty\":4,\"nm\":\"Dot 13\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":16.016,\"s\":[20],\"e\":[0]},{\"t\":26.4268164649024}]},\"r\":{\"a\":0,\"k\":0},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":4.004,\"s\":[495.409,464.295,0],\"e\":[210.159,188.545,0],\"to\":[42.7916679382324,-199.95832824707,0],\"ti\":[-42.7916679382324,115.958335876465,0]},{\"t\":26.4268164649024}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":2.402,\"s\":[62.5,62.5,100],\"e\":[450,450,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":11.211,\"s\":[450,450,100],\"e\":[0,0,100]},{\"t\":27.2275977149024}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":4.004004004004,\"op\":20,\"st\":2.4024024024024,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":9,\"ty\":4,\"nm\":\"Dot 14\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":12.812,\"s\":[100],\"e\":[0]},{\"t\":23.2236132616992}]},\"r\":{\"a\":0,\"k\":128.647},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":0.801,\"s\":[508.667,516.82,0],\"e\":[896.835,472.926,0],\"to\":[130.245651245117,157.297241210938,0],\"ti\":[-64.640983581543,-104.837478637695,0]},{\"t\":23.2236132616992}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":-0.801,\"s\":[60.627,62.5,100],\"e\":[242.508,250,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":8.008,\"s\":[242.508,250,100],\"e\":[0,0,100]},{\"t\":24.0243945116992}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":0.8008008008008,\"op\":20,\"st\":-0.8008008008008,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":10,\"ty\":4,\"nm\":\"Dot 15\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":13.613,\"s\":[60],\"e\":[0]},{\"t\":24.0244140625}]},\"r\":{\"a\":0,\"k\":128.647},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":1.602,\"s\":[508.667,516.82,0],\"e\":[896.835,472.926,0],\"to\":[130.245651245117,157.297241210938,0],\"ti\":[-64.640983581543,-104.837478637695,0]},{\"t\":24.0244140625}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":0,\"s\":[60.627,62.5,100],\"e\":[291.009,300,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":8.809,\"s\":[291.009,300,100],\"e\":[0,0,100]},{\"t\":24.8251953125}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":1.6016016016016,\"op\":20,\"st\":0,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":11,\"ty\":4,\"nm\":\"Dot 16\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":14.414,\"s\":[40],\"e\":[0]},{\"t\":24.8252148633008}]},\"r\":{\"a\":0,\"k\":128.647},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":2.402,\"s\":[508.667,516.82,0],\"e\":[896.835,472.926,0],\"to\":[130.245651245117,157.297241210938,0],\"ti\":[-64.640983581543,-104.837478637695,0]},{\"t\":24.8252148633008}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":0.801,\"s\":[60.627,62.5,100],\"e\":[339.511,350,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":9.609,\"s\":[339.511,350,100],\"e\":[0,0,100]},{\"t\":25.6259961133008}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":2.4024024024024,\"op\":20,\"st\":0.8008008008008,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":12,\"ty\":4,\"nm\":\"Dot 17\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":15.215,\"s\":[20],\"e\":[0]},{\"t\":25.6260156641016}]},\"r\":{\"a\":0,\"k\":128.647},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":3.203,\"s\":[508.667,516.82,0],\"e\":[896.835,472.926,0],\"to\":[130.245651245117,157.297241210938,0],\"ti\":[-64.640983581543,-104.837478637695,0]},{\"t\":25.6260156641016}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":1.602,\"s\":[60.627,62.5,100],\"e\":[388.013,400,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":10.41,\"s\":[388.013,400,100],\"e\":[0,0,100]},{\"t\":26.4267969141016}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":3.2032032032032,\"op\":20,\"st\":1.6016016016016,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":13,\"ty\":4,\"nm\":\"Dot 18\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":16.016,\"s\":[20],\"e\":[0]},{\"t\":26.4268164649024}]},\"r\":{\"a\":0,\"k\":128.647},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":4.004,\"s\":[508.667,516.82,0],\"e\":[896.835,472.926,0],\"to\":[130.245651245117,157.297241210938,0],\"ti\":[-64.640983581543,-104.837478637695,0]},{\"t\":26.4268164649024}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":2.402,\"s\":[60.627,62.5,100],\"e\":[436.514,450,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":11.211,\"s\":[436.514,450,100],\"e\":[0,0,100]},{\"t\":27.2275977149024}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":4.004004004004,\"op\":20,\"st\":2.4024024024024,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":14,\"ty\":4,\"nm\":\"Dot 19\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":12.812,\"s\":[100],\"e\":[0]},{\"t\":23.2236132616992}]},\"r\":{\"a\":0,\"k\":-76.387},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":0.801,\"s\":[472.25,505.924,0],\"e\":[139.121,709.951,0],\"to\":[-184.571243286133,-87.4060211181641,0],\"ti\":[102.931007385254,67.6355056762695,0]},{\"t\":23.2236132616992}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":-0.801,\"s\":[60.627,62.5,100],\"e\":[242.508,250,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":8.008,\"s\":[242.508,250,100],\"e\":[0,0,100]},{\"t\":24.0243945116992}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":0.8008008008008,\"op\":20,\"st\":-0.8008008008008,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":15,\"ty\":4,\"nm\":\"Dot 20\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":13.613,\"s\":[60],\"e\":[0]},{\"t\":24.0244140625}]},\"r\":{\"a\":0,\"k\":-76.387},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":1.602,\"s\":[472.25,505.924,0],\"e\":[139.121,709.951,0],\"to\":[-184.571243286133,-87.4060211181641,0],\"ti\":[102.931007385254,67.6355056762695,0]},{\"t\":24.0244140625}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":0,\"s\":[60.627,62.5,100],\"e\":[291.009,300,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":8.809,\"s\":[291.009,300,100],\"e\":[0,0,100]},{\"t\":24.8251953125}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":1.6016016016016,\"op\":20,\"st\":0,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":16,\"ty\":4,\"nm\":\"Dot 21\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":14.414,\"s\":[40],\"e\":[0]},{\"t\":24.8252148633008}]},\"r\":{\"a\":0,\"k\":-76.387},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":2.402,\"s\":[472.25,505.924,0],\"e\":[139.121,709.951,0],\"to\":[-184.571243286133,-87.4060211181641,0],\"ti\":[102.931007385254,67.6355056762695,0]},{\"t\":24.8252148633008}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":0.801,\"s\":[60.627,62.5,100],\"e\":[339.511,350,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":9.609,\"s\":[339.511,350,100],\"e\":[0,0,100]},{\"t\":25.6259961133008}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":2.4024024024024,\"op\":20,\"st\":0.8008008008008,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":17,\"ty\":4,\"nm\":\"Dot 22\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":15.215,\"s\":[20],\"e\":[0]},{\"t\":25.6260156641016}]},\"r\":{\"a\":0,\"k\":-76.387},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":3.203,\"s\":[472.25,505.924,0],\"e\":[139.121,709.951,0],\"to\":[-184.571243286133,-87.4060211181641,0],\"ti\":[102.931007385254,67.6355056762695,0]},{\"t\":25.6260156641016}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":1.602,\"s\":[60.627,62.5,100],\"e\":[388.013,400,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":10.41,\"s\":[388.013,400,100],\"e\":[0,0,100]},{\"t\":26.4267969141016}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":3.2032032032032,\"op\":20,\"st\":1.6016016016016,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":18,\"ty\":4,\"nm\":\"Dot 23\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":16.016,\"s\":[20],\"e\":[0]},{\"t\":26.4268164649024}]},\"r\":{\"a\":0,\"k\":-76.387},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":4.004,\"s\":[472.25,505.924,0],\"e\":[139.121,709.951,0],\"to\":[-184.571243286133,-87.4060211181641,0],\"ti\":[102.931007385254,67.6355056762695,0]},{\"t\":26.4268164649024}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":2.402,\"s\":[60.627,62.5,100],\"e\":[436.514,450,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":11.211,\"s\":[436.514,450,100],\"e\":[0,0,100]},{\"t\":27.2275977149024}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":4.004004004004,\"op\":20,\"st\":2.4024024024024,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":19,\"ty\":4,\"nm\":\"Dot 24\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":14.414,\"s\":[100],\"e\":[0]},{\"t\":24.8252148633008}]},\"r\":{\"a\":0,\"k\":45},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":2.402,\"s\":[517.334,477.551,0],\"e\":[512.041,165.014,0],\"to\":[135.237670898438,-87.5586166381836,0],\"ti\":[-88.4407043457031,40.761646270752,0]},{\"t\":24.8252148633008}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":0.801,\"s\":[49.242,49.242,100],\"e\":[196.967,196.967,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":9.609,\"s\":[196.967,196.967,100],\"e\":[0,0,100]},{\"t\":25.6259961133008}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":2.4024024024024,\"op\":20,\"st\":0.8008008008008,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":20,\"ty\":4,\"nm\":\"Dot 25\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":14.414,\"s\":[100],\"e\":[0]},{\"t\":24.8252148633008}]},\"r\":{\"a\":0,\"k\":173.647},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":2.402,\"s\":[495.457,514.199,0],\"e\":[736.163,705.997,0],\"to\":[-15.0706205368042,160.192092895508,0],\"ti\":[22.3937397003174,-94.4176025390625,0]},{\"t\":24.8252148633008}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":0.801,\"s\":[47.766,49.242,100],\"e\":[191.064,196.967,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":9.609,\"s\":[191.064,196.967,100],\"e\":[0,0,100]},{\"t\":25.6259961133008}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":2.4024024024024,\"op\":20,\"st\":0.8008008008008,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":21,\"ty\":4,\"nm\":\"Dot 26\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":14.414,\"s\":[100],\"e\":[0]},{\"t\":24.8252148633008}]},\"r\":{\"a\":0,\"k\":-31.387},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":2.402,\"s\":[481.24,487.841,0],\"e\":[181.987,415.917,0],\"to\":[-54.1313972473145,-151.520370483398,0],\"ti\":[19.663366317749,95.0237579345703,0]},{\"t\":24.8252148633008}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":0.801,\"s\":[47.766,49.242,100],\"e\":[191.064,196.967,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":9.609,\"s\":[191.064,196.967,100],\"e\":[0,0,100]},{\"t\":25.6259961133008}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":2.4024024024024,\"op\":20,\"st\":0.8008008008008,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":22,\"ty\":4,\"nm\":\"Dot 28\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":14.414,\"s\":[100],\"e\":[0]},{\"t\":24.8252148633008}]},\"r\":{\"a\":0,\"k\":96.121},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":2.402,\"s\":[512.883,507.502,0],\"e\":[752.145,313.907,0],\"to\":[153.155258178711,49.3163261413574,0],\"ti\":[-87.351676940918,-42.2592887878418,0]},{\"t\":24.8252148633008}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":0.801,\"s\":[47.766,49.242,100],\"e\":[191.064,196.967,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":9.609,\"s\":[191.064,196.967,100],\"e\":[0,0,100]},{\"t\":25.6259961133008}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":2.4024024024024,\"op\":20,\"st\":0.8008008008008,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":23,\"ty\":4,\"nm\":\"Dot 29\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":14.414,\"s\":[100],\"e\":[0]},{\"t\":24.8252148633008}]},\"r\":{\"a\":0,\"k\":-108.913},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":2.402,\"s\":[484.076,515.691,0],\"e\":[349.211,792.344,0],\"to\":[-159.635864257812,20.1251602172852,0],\"ti\":[97.0278549194336,1.32593882083893,0]},{\"t\":24.8252148633008}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":0.801,\"s\":[47.766,49.242,100],\"e\":[191.064,196.967,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":9.609,\"s\":[191.064,196.967,100],\"e\":[0,0,100]},{\"t\":25.6259961133008}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":2.4024024024024,\"op\":20,\"st\":0.8008008008008,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":24,\"ty\":4,\"nm\":\"Dot 30\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":15.215,\"s\":[50],\"e\":[0]},{\"t\":25.6260156641016}]},\"r\":{\"a\":0,\"k\":45},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":3.203,\"s\":[517.334,477.551,0],\"e\":[512.041,165.014,0],\"to\":[135.237670898438,-87.5586166381836,0],\"ti\":[-88.4407043457031,40.761646270752,0]},{\"t\":25.6260156641016}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":1.602,\"s\":[49.242,49.242,100],\"e\":[196.967,196.967,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":10.41,\"s\":[196.967,196.967,100],\"e\":[0,0,100]},{\"t\":26.4267969141016}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":3.2032032032032,\"op\":20,\"st\":1.6016016016016,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":25,\"ty\":4,\"nm\":\"Dot 31\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":15.215,\"s\":[50],\"e\":[0]},{\"t\":25.6260156641016}]},\"r\":{\"a\":0,\"k\":173.647},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":3.203,\"s\":[495.457,514.199,0],\"e\":[736.163,705.997,0],\"to\":[-15.0706205368042,160.192092895508,0],\"ti\":[22.3937397003174,-94.4176025390625,0]},{\"t\":25.6260156641016}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":1.602,\"s\":[47.766,49.242,100],\"e\":[191.064,196.967,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":10.41,\"s\":[191.064,196.967,100],\"e\":[0,0,100]},{\"t\":26.4267969141016}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":3.2032032032032,\"op\":20,\"st\":1.6016016016016,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":26,\"ty\":4,\"nm\":\"Dot 32\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":15.215,\"s\":[50],\"e\":[0]},{\"t\":25.6260156641016}]},\"r\":{\"a\":0,\"k\":-31.387},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":3.203,\"s\":[481.24,487.841,0],\"e\":[181.987,415.917,0],\"to\":[-54.1313972473145,-151.520370483398,0],\"ti\":[19.663366317749,95.0237579345703,0]},{\"t\":25.6260156641016}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":1.602,\"s\":[47.766,49.242,100],\"e\":[191.064,196.967,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":10.41,\"s\":[191.064,196.967,100],\"e\":[0,0,100]},{\"t\":26.4267969141016}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":3.2032032032032,\"op\":20,\"st\":1.6016016016016,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":27,\"ty\":4,\"nm\":\"Dot 33\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":15.215,\"s\":[50],\"e\":[0]},{\"t\":25.6260156641016}]},\"r\":{\"a\":0,\"k\":96.121},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":3.203,\"s\":[512.883,507.502,0],\"e\":[752.145,313.907,0],\"to\":[153.155258178711,49.3163261413574,0],\"ti\":[-87.351676940918,-42.2592887878418,0]},{\"t\":25.6260156641016}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":1.602,\"s\":[47.766,49.242,100],\"e\":[191.064,196.967,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":10.41,\"s\":[191.064,196.967,100],\"e\":[0,0,100]},{\"t\":26.4267969141016}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":3.2032032032032,\"op\":20,\"st\":1.6016016016016,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":28,\"ty\":4,\"nm\":\"Dot 34\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":15.215,\"s\":[50],\"e\":[0]},{\"t\":25.6260156641016}]},\"r\":{\"a\":0,\"k\":-108.913},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":3.203,\"s\":[484.076,515.691,0],\"e\":[349.211,792.344,0],\"to\":[-159.635864257812,20.1251602172852,0],\"ti\":[97.0278549194336,1.32593882083893,0]},{\"t\":25.6260156641016}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":1.602,\"s\":[47.766,49.242,100],\"e\":[191.064,196.967,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":10.41,\"s\":[191.064,196.967,100],\"e\":[0,0,100]},{\"t\":26.4267969141016}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":3.2032032032032,\"op\":20,\"st\":1.6016016016016,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":29,\"ty\":4,\"nm\":\"Dot 35\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":16.016,\"s\":[25],\"e\":[0]},{\"t\":26.4268164649024}]},\"r\":{\"a\":0,\"k\":45},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":4.004,\"s\":[517.334,477.551,0],\"e\":[512.041,165.014,0],\"to\":[135.237670898438,-87.5586166381836,0],\"ti\":[-88.4407043457031,40.761646270752,0]},{\"t\":26.4268164649024}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":2.402,\"s\":[49.242,49.242,100],\"e\":[196.967,196.967,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":11.211,\"s\":[196.967,196.967,100],\"e\":[0,0,100]},{\"t\":27.2275977149024}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":4.004004004004,\"op\":20,\"st\":2.4024024024024,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":30,\"ty\":4,\"nm\":\"Dot 36\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":16.016,\"s\":[25],\"e\":[0]},{\"t\":26.4268164649024}]},\"r\":{\"a\":0,\"k\":173.647},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":4.004,\"s\":[495.457,514.199,0],\"e\":[736.163,705.997,0],\"to\":[-15.0706205368042,160.192092895508,0],\"ti\":[22.3937397003174,-94.4176025390625,0]},{\"t\":26.4268164649024}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":2.402,\"s\":[47.766,49.242,100],\"e\":[191.064,196.967,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":11.211,\"s\":[191.064,196.967,100],\"e\":[0,0,100]},{\"t\":27.2275977149024}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":4.004004004004,\"op\":20,\"st\":2.4024024024024,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":31,\"ty\":4,\"nm\":\"Dot 37\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":16.016,\"s\":[25],\"e\":[0]},{\"t\":26.4268164649024}]},\"r\":{\"a\":0,\"k\":-31.387},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":4.004,\"s\":[481.24,487.841,0],\"e\":[181.987,415.917,0],\"to\":[-54.1313972473145,-151.520370483398,0],\"ti\":[19.663366317749,95.0237579345703,0]},{\"t\":26.4268164649024}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":2.402,\"s\":[47.766,49.242,100],\"e\":[191.064,196.967,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":11.211,\"s\":[191.064,196.967,100],\"e\":[0,0,100]},{\"t\":27.2275977149024}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":4.004004004004,\"op\":20,\"st\":2.4024024024024,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":32,\"ty\":4,\"nm\":\"Dot 38\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":16.016,\"s\":[25],\"e\":[0]},{\"t\":26.4268164649024}]},\"r\":{\"a\":0,\"k\":96.121},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":4.004,\"s\":[512.883,507.502,0],\"e\":[752.145,313.907,0],\"to\":[153.155258178711,49.3163261413574,0],\"ti\":[-87.351676940918,-42.2592887878418,0]},{\"t\":26.4268164649024}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":2.402,\"s\":[47.766,49.242,100],\"e\":[191.064,196.967,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":11.211,\"s\":[191.064,196.967,100],\"e\":[0,0,100]},{\"t\":27.2275977149024}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":4.004004004004,\"op\":20,\"st\":2.4024024024024,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":33,\"ty\":4,\"nm\":\"Dot 39\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":16.016,\"s\":[25],\"e\":[0]},{\"t\":26.4268164649024}]},\"r\":{\"a\":0,\"k\":-108.913},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.1,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p1_1_0p167_0p167\",\"t\":4.004,\"s\":[484.076,515.691,0],\"e\":[349.211,792.344,0],\"to\":[-159.635864257812,20.1251602172852,0],\"ti\":[97.0278549194336,1.32593882083893,0]},{\"t\":26.4268164649024}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p2_1_0p333_0\",\"0p2_1_0p333_0\",\"0p2_0p2_0p333_0p333\"],\"t\":2.402,\"s\":[47.766,49.242,100],\"e\":[191.064,196.967,100]},{\"i\":{\"x\":[0.2,0.2,0.2],\"y\":[1,1,0.2]},\"o\":{\"x\":[0.167,0.167,0.167],\"y\":[0,0,0.167]},\"n\":[\"0p2_1_0p167_0\",\"0p2_1_0p167_0\",\"0p2_0p2_0p167_0p167\"],\"t\":11.211,\"s\":[191.064,196.967,100],\"e\":[0,0,100]},{\"t\":27.2275977149024}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[9.559,9.559]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-0.5],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":4.004004004004,\"op\":20,\"st\":2.4024024024024,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":34,\"ty\":4,\"nm\":\"Circle Big 5 细\",\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.833],\"y\":[0.833]},\"o\":{\"x\":[0.167],\"y\":[0.167]},\"n\":[\"0p833_0p833_0p167_0p167\"],\"t\":11.25,\"s\":[100],\"e\":[0]},{\"t\":14.9999217967968}]},\"r\":{\"a\":0,\"k\":-45},\"p\":{\"a\":0,\"k\":[500,500,0]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.87,0.87,0.417],\"y\":[0.757,0.757,0.417]},\"o\":{\"x\":[0.892,0.892,0.517],\"y\":[0,0,0.517]},\"n\":[\"0p87_0p757_0p892_0\",\"0p87_0p757_0p892_0\",\"0p417_0p417_0p517_0p517\"],\"t\":0,\"s\":[10,10,100],\"e\":[70,70,100]},{\"i\":{\"x\":[0.26,0.26,0.51],\"y\":[1,1,0.51]},\"o\":{\"x\":[0.088,0.088,0.204],\"y\":[0.288,0.288,0.204]},\"n\":[\"0p26_1_0p088_0p288\",\"0p26_1_0p088_0p288\",\"0p51_0p51_0p204_0p204\"],\"t\":3.126,\"s\":[70,70,100],\"e\":[200,200,100]},{\"t\":14.9999217967968}]}},\"ao\":0,\"ef\":[{\"ty\":5,\"nm\":\"梯度渐变\",\"mn\":\"ADBE Ramp\",\"ix\":1,\"en\":1,\"ef\":[{\"ty\":3,\"nm\":\"渐变起点\",\"mn\":\"ADBE Ramp-0001\",\"ix\":1,\"v\":{\"a\":0,\"k\":[820,268]}},{\"ty\":2,\"nm\":\"起始颜色\",\"mn\":\"ADBE Ramp-0002\",\"ix\":2,\"v\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.509804,1]}},{\"ty\":3,\"nm\":\"渐变终点\",\"mn\":\"ADBE Ramp-0003\",\"ix\":3,\"v\":{\"a\":0,\"k\":[204,768]}},{\"ty\":2,\"nm\":\"结束颜色\",\"mn\":\"ADBE Ramp-0004\",\"ix\":4,\"v\":{\"a\":0,\"k\":[0.9019608,0.682353,0.0901961,1]}},{\"ty\":7,\"nm\":\"渐变形状\",\"mn\":\"ADBE Ramp-0005\",\"ix\":5,\"v\":{\"a\":0,\"k\":1}},{\"ty\":0,\"nm\":\"渐变散射\",\"mn\":\"ADBE Ramp-0006\",\"ix\":6,\"v\":{\"a\":0,\"k\":0}},{\"ty\":0,\"nm\":\"与原始图像混合\",\"mn\":\"ADBE Ramp-0007\",\"ix\":7,\"v\":{\"a\":0,\"k\":0}},{\"ty\":6,\"nm\":\"\",\"mn\":\"ADBE Ramp-0008\",\"ix\":8,\"v\":0}]}],\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"d\":1,\"ty\":\"el\",\"s\":{\"a\":0,\"k\":[308.096,308.096]},\"p\":{\"a\":0,\"k\":[0,0]},\"nm\":\"Ellipse Path 1\",\"mn\":\"ADBE Vector Shape - Ellipse\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.8980392,0.6745098,0.0823529,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.167],\"y\":[0.167]},\"n\":[\"0p667_1_0p167_0p167\"],\"t\":0,\"s\":[120],\"e\":[20]},{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":4,\"s\":[20],\"e\":[15]},{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":9,\"s\":[15],\"e\":[2]},{\"t\":12.9999217967968}]},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[0,-1.678],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Ellipse 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":0,\"op\":15,\"st\":-3.2032032032032,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":35,\"ty\":4,\"nm\":\"Square 8\",\"parent\":1,\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":12.705,\"s\":[100],\"e\":[0]},{\"t\":20.8203907032032}]},\"r\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.1],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p1_1_0p333_0\"],\"t\":4.047,\"s\":[0],\"e\":[50]},{\"t\":14.3282032032032}]},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.12,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p12_1_0p167_0p167\",\"t\":1.883,\"s\":[-113.48,-111.359,0],\"e\":[-311.209,-309.399,0],\"to\":[-32.9548797607422,-33.0066795349121,0],\"ti\":[42.9548797607422,103.006675720215,0]},{\"t\":20.8203907032032}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667,0.667,0.667],\"y\":[1,1,0.667]},\"o\":{\"x\":[0.75,0.75,0.75],\"y\":[0,0,0.75]},\"n\":[\"0p667_1_0p75_0\",\"0p667_1_0p75_0\",\"0p667_0p667_0p75_0p75\"],\"t\":3.507,\"s\":[25,25,100],\"e\":[0,0,100]},{\"t\":14.3282032032032}]}},\"ao\":0,\"ef\":[{\"ty\":5,\"nm\":\"简单阻塞工具\",\"mn\":\"ADBE Simple Choker\",\"ix\":1,\"en\":1,\"ef\":[{\"ty\":7,\"nm\":\"视图\",\"mn\":\"ADBE Simple Choker-0001\",\"ix\":1,\"v\":{\"a\":0,\"k\":1}},{\"ty\":0,\"nm\":\"阻塞遮罩\",\"mn\":\"ADBE Simple Choker-0002\",\"ix\":2,\"v\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.75],\"y\":[0]},\"n\":[\"0p667_1_0p75_0\"],\"t\":10.54,\"s\":[0],\"e\":[22.3]},{\"t\":36.8369922657032}]}}]}],\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"rc\",\"d\":1,\"s\":{\"a\":0,\"k\":[49.497,49.497]},\"p\":{\"a\":0,\"k\":[0,0]},\"r\":{\"a\":0,\"k\":0},\"nm\":\"Rectangle Path 1\",\"mn\":\"ADBE Vector Shape - Rect\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":5},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-1.53,-1.379],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Rectangle 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":3.2032032032032,\"op\":20,\"st\":3.2032032032032,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":36,\"ty\":4,\"nm\":\"Square 7\",\"parent\":1,\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":12.705,\"s\":[100],\"e\":[0]},{\"t\":20.8203907032032}]},\"r\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.1],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p1_1_0p333_0\"],\"t\":4.047,\"s\":[0],\"e\":[50]},{\"t\":14.3282032032032}]},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.12,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p12_1_0p167_0p167\",\"t\":1.883,\"s\":[118.337,113.83,0],\"e\":[274.306,274.802,0],\"to\":[25.9948673248291,26.8286876678467,0],\"ti\":[-42.3058013916016,-90.8021240234375,0]},{\"t\":20.8203907032032}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667,0.667,0.667],\"y\":[1,1,0.667]},\"o\":{\"x\":[0.75,0.75,0.75],\"y\":[0,0,0.75]},\"n\":[\"0p667_1_0p75_0\",\"0p667_1_0p75_0\",\"0p667_0p667_0p75_0p75\"],\"t\":3.507,\"s\":[25,25,100],\"e\":[0,0,100]},{\"t\":14.3282032032032}]}},\"ao\":0,\"ef\":[{\"ty\":5,\"nm\":\"简单阻塞工具\",\"mn\":\"ADBE Simple Choker\",\"ix\":1,\"en\":1,\"ef\":[{\"ty\":7,\"nm\":\"视图\",\"mn\":\"ADBE Simple Choker-0001\",\"ix\":1,\"v\":{\"a\":0,\"k\":1}},{\"ty\":0,\"nm\":\"阻塞遮罩\",\"mn\":\"ADBE Simple Choker-0002\",\"ix\":2,\"v\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.75],\"y\":[0]},\"n\":[\"0p667_1_0p75_0\"],\"t\":10.54,\"s\":[0],\"e\":[22.3]},{\"t\":36.8369922657032}]}}]}],\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"rc\",\"d\":1,\"s\":{\"a\":0,\"k\":[49.497,49.497]},\"p\":{\"a\":0,\"k\":[0,0]},\"r\":{\"a\":0,\"k\":0},\"nm\":\"Rectangle Path 1\",\"mn\":\"ADBE Vector Shape - Rect\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":5},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-1.53,-1.379],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Rectangle 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":3.2032032032032,\"op\":20,\"st\":3.2032032032032,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":37,\"ty\":4,\"nm\":\"Square 6\",\"parent\":1,\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":11.081,\"s\":[100],\"e\":[0]},{\"t\":19.1972851758008}]},\"r\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.1],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p1_1_0p333_0\"],\"t\":2.425,\"s\":[0],\"e\":[50]},{\"t\":12.7050976758008}]},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p833_0p833_0p167_0p167\",\"t\":0.801,\"s\":[124.094,-107.785,0],\"e\":[115.57,-111.524,0],\"to\":[10.7745389938354,-13.9832201004028,0],\"ti\":[1.88890182971954,-2.1129584312439,0]},{\"i\":{\"x\":0.333,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p333_1_0p167_0p167\",\"t\":1.883,\"s\":[115.57,-111.524,0],\"e\":[275.578,-283.558,0],\"to\":[45.3566741943359,-29.6727848052979,0],\"ti\":[-41.577880859375,83.5582733154297,0]},{\"t\":19.1972851758008}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667,0.667,0.667],\"y\":[1,1,0.667]},\"o\":{\"x\":[0.75,0.75,0.75],\"y\":[0,0,0.75]},\"n\":[\"0p667_1_0p75_0\",\"0p667_1_0p75_0\",\"0p667_0p667_0p75_0p75\"],\"t\":3.507,\"s\":[25,25,100],\"e\":[0,0,100]},{\"t\":14.3281445508008}]}},\"ao\":0,\"ef\":[{\"ty\":5,\"nm\":\"简单阻塞工具\",\"mn\":\"ADBE Simple Choker\",\"ix\":1,\"en\":1,\"ef\":[{\"ty\":7,\"nm\":\"视图\",\"mn\":\"ADBE Simple Choker-0001\",\"ix\":1,\"v\":{\"a\":0,\"k\":1}},{\"ty\":0,\"nm\":\"阻塞遮罩\",\"mn\":\"ADBE Simple Choker-0002\",\"ix\":2,\"v\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.75],\"y\":[0]},\"n\":[\"0p667_1_0p75_0\"],\"t\":8.917,\"s\":[0],\"e\":[22.3]},{\"t\":34.4345898633008}]}}]}],\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"rc\",\"d\":1,\"s\":{\"a\":0,\"k\":[49.497,49.497]},\"p\":{\"a\":0,\"k\":[0,0]},\"r\":{\"a\":0,\"k\":0},\"nm\":\"Rectangle Path 1\",\"mn\":\"ADBE Vector Shape - Rect\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":5},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-1.53,-1.379],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Rectangle 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":3.2032032032032,\"op\":20,\"st\":0.8008008008008,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":38,\"ty\":4,\"nm\":\"Square 5\",\"parent\":1,\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":11.623,\"s\":[100],\"e\":[0]},{\"t\":19.7383203516016}]},\"r\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.1],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p1_1_0p333_0\"],\"t\":2.965,\"s\":[0],\"e\":[50]},{\"t\":13.2451562891016}]},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.12,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p12_1_0p167_0p167\",\"t\":1.883,\"s\":[-94.752,105.06,0],\"e\":[-261.067,281.229,0],\"to\":[-27.7191791534424,29.3613471984863,0],\"ti\":[51.7191772460938,-91.0280151367188,0]},{\"t\":19.7383203516016}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667,0.667,0.667],\"y\":[1,1,0.667]},\"o\":{\"x\":[0.75,0.75,0.75],\"y\":[0,0,0.75]},\"n\":[\"0p667_1_0p75_0\",\"0p667_1_0p75_0\",\"0p667_0p667_0p75_0p75\"],\"t\":3.507,\"s\":[25,25,100],\"e\":[0,0,100]},{\"t\":14.3281641016016}]}},\"ao\":0,\"ef\":[{\"ty\":5,\"nm\":\"简单阻塞工具\",\"mn\":\"ADBE Simple Choker\",\"ix\":1,\"en\":1,\"ef\":[{\"ty\":7,\"nm\":\"视图\",\"mn\":\"ADBE Simple Choker-0001\",\"ix\":1,\"v\":{\"a\":0,\"k\":1}},{\"ty\":0,\"nm\":\"阻塞遮罩\",\"mn\":\"ADBE Simple Choker-0002\",\"ix\":2,\"v\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.75],\"y\":[0]},\"n\":[\"0p667_1_0p75_0\"],\"t\":9.458,\"s\":[0],\"e\":[22.3]},{\"t\":35.2353906641016}]}}]}],\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"rc\",\"d\":1,\"s\":{\"a\":0,\"k\":[49.497,49.497]},\"p\":{\"a\":0,\"k\":[0,0]},\"r\":{\"a\":0,\"k\":0},\"nm\":\"Rectangle Path 1\",\"mn\":\"ADBE Vector Shape - Rect\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":5},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-1.53,-1.379],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Rectangle 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":3.2032032032032,\"op\":20,\"st\":1.6016016016016,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":39,\"ty\":4,\"nm\":\"Square 4\",\"parent\":1,\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":11.623,\"s\":[100],\"e\":[0]},{\"t\":19.7383203516016}]},\"r\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.1],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p1_1_0p333_0\"],\"t\":2.965,\"s\":[-45],\"e\":[5]},{\"t\":13.2451562891016}]},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.12,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p12_1_0p167_0p167\",\"t\":0.801,\"s\":[-74.132,1.5,0],\"e\":[-438.836,1.28,0],\"to\":[-60.7840003967285,-0.03662599250674,0],\"ti\":[134.783996582031,-59.9633750915527,0]},{\"t\":19.7383203516016}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667,0.667,0.667],\"y\":[1,1,0.667]},\"o\":{\"x\":[0.75,0.75,0.75],\"y\":[0,0,0.75]},\"n\":[\"0p667_1_0p75_0\",\"0p667_1_0p75_0\",\"0p667_0p667_0p75_0p75\"],\"t\":2.425,\"s\":[55,55,100],\"e\":[0,0,100]},{\"t\":13.2451562891016}]}},\"ao\":0,\"ef\":[{\"ty\":5,\"nm\":\"简单阻塞工具\",\"mn\":\"ADBE Simple Choker\",\"ix\":1,\"en\":1,\"ef\":[{\"ty\":7,\"nm\":\"视图\",\"mn\":\"ADBE Simple Choker-0001\",\"ix\":1,\"v\":{\"a\":0,\"k\":1}},{\"ty\":0,\"nm\":\"阻塞遮罩\",\"mn\":\"ADBE Simple Choker-0002\",\"ix\":2,\"v\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.75],\"y\":[0]},\"n\":[\"0p667_1_0p75_0\"],\"t\":9.458,\"s\":[0],\"e\":[22.3]},{\"t\":35.2353906641016}]}}]}],\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"rc\",\"d\":1,\"s\":{\"a\":0,\"k\":[49.497,49.497]},\"p\":{\"a\":0,\"k\":[0,0]},\"r\":{\"a\":0,\"k\":0},\"nm\":\"Rectangle Path 1\",\"mn\":\"ADBE Vector Shape - Rect\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":5},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-1.53,-1.379],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Rectangle 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":3.2032032032032,\"op\":20,\"st\":1.6016016016016,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":40,\"ty\":4,\"nm\":\"Square 3\",\"parent\":1,\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":11.623,\"s\":[100],\"e\":[0]},{\"t\":19.7383203516016}]},\"r\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.1],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p1_1_0p333_0\"],\"t\":2.965,\"s\":[-45],\"e\":[5]},{\"t\":13.2451562891016}]},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.12,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p12_1_0p167_0p167\",\"t\":0.801,\"s\":[79.314,-3.187,0],\"e\":[388.278,0.351,0],\"to\":[51.4940299987793,0.58960056304932,0],\"ti\":[-181.494033813477,53.410400390625,0]},{\"t\":19.7383203516016}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667,0.667,0.667],\"y\":[1,1,0.667]},\"o\":{\"x\":[0.75,0.75,0.75],\"y\":[0,0,0.75]},\"n\":[\"0p667_1_0p75_0\",\"0p667_1_0p75_0\",\"0p667_0p667_0p75_0p75\"],\"t\":2.425,\"s\":[55,55,100],\"e\":[0,0,100]},{\"t\":13.2451562891016}]}},\"ao\":0,\"ef\":[{\"ty\":5,\"nm\":\"简单阻塞工具\",\"mn\":\"ADBE Simple Choker\",\"ix\":1,\"en\":1,\"ef\":[{\"ty\":7,\"nm\":\"视图\",\"mn\":\"ADBE Simple Choker-0001\",\"ix\":1,\"v\":{\"a\":0,\"k\":1}},{\"ty\":0,\"nm\":\"阻塞遮罩\",\"mn\":\"ADBE Simple Choker-0002\",\"ix\":2,\"v\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.75],\"y\":[0]},\"n\":[\"0p667_1_0p75_0\"],\"t\":9.458,\"s\":[0],\"e\":[22.3]},{\"t\":35.2353906641016}]}}]}],\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"rc\",\"d\":1,\"s\":{\"a\":0,\"k\":[49.497,49.497]},\"p\":{\"a\":0,\"k\":[0,0]},\"r\":{\"a\":0,\"k\":0},\"nm\":\"Rectangle Path 1\",\"mn\":\"ADBE Vector Shape - Rect\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":5},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-1.53,-1.379],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Rectangle 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":3.2032032032032,\"op\":20,\"st\":1.6016016016016,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":41,\"ty\":4,\"nm\":\"Square 2\",\"parent\":1,\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":9.999,\"s\":[100],\"e\":[0]},{\"t\":18.1152148241992}]},\"r\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.1],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p1_1_0p333_0\"],\"t\":1.343,\"s\":[-45],\"e\":[5]},{\"t\":11.6230273241992}]},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p833_0p833_0p167_0p167\",\"t\":-0.801,\"s\":[11.532,-163.963,0],\"e\":[2.862,-75.727,0],\"to\":[-2.26888060569763,-17.5063800811768,0],\"ti\":[1.4984222650528,0.42509147524834,0]},{\"i\":{\"x\":0.333,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p333_1_0p167_0p167\",\"t\":0.801,\"s\":[2.862,-75.727,0],\"e\":[-5.643,-395.369,0],\"to\":[-54.7088050842285,-105.195976257324,0],\"ti\":[51.593620300293,161.727890014648,0]},{\"t\":18.1152148241992}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667,0.667,0.667],\"y\":[1,1,0.667]},\"o\":{\"x\":[0.75,0.75,0.75],\"y\":[0,0,0.75]},\"n\":[\"0p667_1_0p75_0\",\"0p667_1_0p75_0\",\"0p667_0p667_0p75_0p75\"],\"t\":2.425,\"s\":[55,55,100],\"e\":[0,0,100]},{\"t\":13.2450976366992}]}},\"ao\":0,\"ef\":[{\"ty\":5,\"nm\":\"简单阻塞工具\",\"mn\":\"ADBE Simple Choker\",\"ix\":1,\"en\":1,\"ef\":[{\"ty\":7,\"nm\":\"视图\",\"mn\":\"ADBE Simple Choker-0001\",\"ix\":1,\"v\":{\"a\":0,\"k\":1}},{\"ty\":0,\"nm\":\"阻塞遮罩\",\"mn\":\"ADBE Simple Choker-0002\",\"ix\":2,\"v\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.75],\"y\":[0]},\"n\":[\"0p667_1_0p75_0\"],\"t\":7.835,\"s\":[0],\"e\":[22.3]},{\"t\":32.8329882616992}]}}]}],\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"rc\",\"d\":1,\"s\":{\"a\":0,\"k\":[49.497,49.497]},\"p\":{\"a\":0,\"k\":[0,0]},\"r\":{\"a\":0,\"k\":0},\"nm\":\"Rectangle Path 1\",\"mn\":\"ADBE Vector Shape - Rect\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":5},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-1.53,-1.379],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Rectangle 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":0.8008008008008,\"op\":20,\"st\":-0.8008008008008,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":42,\"ty\":4,\"nm\":\"Square\",\"parent\":1,\"ks\":{\"o\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p667_1_0p333_0\"],\"t\":10.541,\"s\":[100],\"e\":[0]},{\"t\":18.65625}]},\"r\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.1],\"y\":[1]},\"o\":{\"x\":[0.333],\"y\":[0]},\"n\":[\"0p1_1_0p333_0\"],\"t\":1.883,\"s\":[-45],\"e\":[5]},{\"t\":12.1630859375}]},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.12,\"y\":1},\"o\":{\"x\":0.167,\"y\":0.167},\"n\":\"0p12_1_0p167_0p167\",\"t\":0.801,\"s\":[7.289,56.436,0],\"e\":[4.357,373.561,0],\"to\":[41.5112724304199,88.854248046875,0],\"ti\":[-67.5112762451172,-156.854248046875,0]},{\"t\":18.65625}]},\"a\":{\"a\":0,\"k\":[0,0,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667,0.667,0.667],\"y\":[1,1,0.667]},\"o\":{\"x\":[0.75,0.75,0.75],\"y\":[0,0,0.75]},\"n\":[\"0p667_1_0p75_0\",\"0p667_1_0p75_0\",\"0p667_0p667_0p75_0p75\"],\"t\":2.425,\"s\":[55,55,100],\"e\":[0,0,100]},{\"t\":13.2451171875}]}},\"ao\":0,\"ef\":[{\"ty\":5,\"nm\":\"简单阻塞工具\",\"mn\":\"ADBE Simple Choker\",\"ix\":1,\"en\":1,\"ef\":[{\"ty\":7,\"nm\":\"视图\",\"mn\":\"ADBE Simple Choker-0001\",\"ix\":1,\"v\":{\"a\":0,\"k\":1}},{\"ty\":0,\"nm\":\"阻塞遮罩\",\"mn\":\"ADBE Simple Choker-0002\",\"ix\":2,\"v\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667],\"y\":[1]},\"o\":{\"x\":[0.75],\"y\":[0]},\"n\":[\"0p667_1_0p75_0\"],\"t\":8.376,\"s\":[0],\"e\":[22.3]},{\"t\":33.6337890625}]}}]}],\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"rc\",\"d\":1,\"s\":{\"a\":0,\"k\":[49.497,49.497]},\"p\":{\"a\":0,\"k\":[0,0]},\"r\":{\"a\":0,\"k\":0},\"nm\":\"Rectangle Path 1\",\"mn\":\"ADBE Vector Shape - Rect\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":5},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"Stroke 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.9960784,0.8627451,0.5098039,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-1.53,-1.379],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"Rectangle 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":0.8008008008008,\"op\":20,\"st\":0,\"bm\":0,\"sr\":1}]}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bottomBg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bottomBg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/brand_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"brand_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/brand_icon_unavailable.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"brand_icon_unavailable@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btfmbg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btfmbg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btlogo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btlogo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_activitybg_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_activitybg_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_activitybg_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_activitybg_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_back_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_back_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_back_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_back_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_bg_gold.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_bg_gold@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_bg_green.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_bg_green@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_bg_grey.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_bg_grey@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_bg_grey2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_bg_grey2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_bg_light.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_bg_light@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_bg_lightGray.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_bg_lightGray@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_bg_orange.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_bg_orange@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_bg_orange2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_bg_orange2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_bg_t.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_bg_t@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_bg_unable.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_bg_unable@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_bg_w.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_bg_w@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_bg_yellow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_bg_yellow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_block_remove_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_block_remove_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_block_remove_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_block_remove_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_buy_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_buy_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_cancel_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_cancel_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_cancel_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_cancel_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_clear_listened_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_clear_listened_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_clear_listened_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_clear_listened_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_close_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_close_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_close_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_close_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_codeNext_d.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_codeNext_d@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_codeNext_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_codeNext_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_codeNext_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_codeNext_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_comment.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_comment@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_del_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_del_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_dmgg_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_dmgg_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_dmgg_bg_o.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_dmgg_bg_o@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_dmgg_buling.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_dmgg_buling@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_done_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_done_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_done_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_done_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_downloadAlbumSound_list_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_downloadAlbumSound_list_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_downloadAlbumSound_savelist_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_downloadAlbumSound_savelist_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_downloadalbum_delete_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_downloadalbum_delete_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_downloadsound_ascOrder_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_downloadsound_ascOrder_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_downloadsound_clear_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_downloadsound_clear_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_downloadsound_clear_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_downloadsound_clear_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_downloadsound_continue_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_downloadsound_continue_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_downloadsound_continue_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_downloadsound_continue_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_downloadsound_deletion_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_downloadsound_deletion_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_downloadsound_list_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_downloadsound_list_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_downloadsound_list_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_downloadsound_list_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_downloadsound_pause_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_downloadsound_pause_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_downloadsound_pause_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_downloadsound_pause_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_downloadsound_reverseOrder_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_downloadsound_reverseOrder_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_downloadsound_savelist_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_downloadsound_savelist_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_downloadsound_savelist_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_downloadsound_savelist_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_fav.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_fav@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_feedblock_remove_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_feedblock_remove_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_feedblock_remove_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_feedblock_remove_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_finish_listened_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_finish_listened_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_finish_listened_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_finish_listened_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_follow_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_follow_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_home_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_home_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_home_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_home_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_indicator.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_indicator@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_invite.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_invite@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_invite_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_invite_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_join_vip.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_join_vip@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_login_action_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_login_action_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_login_action_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_login_action_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_mailCode_submit_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_mailCode_submit_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_mailCode_submit_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_mailCode_submit_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_mention_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_mention_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_mention_bg_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_mention_bg_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_more_down.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_more_down@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_more_up.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_more_up@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_msgbox_cancel_1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_msgbox_cancel_1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_msgbox_cancel_2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_msgbox_cancel_2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_msgbox_cancel_3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_msgbox_cancel_3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_msgbox_cancel_4.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_msgbox_cancel_4@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_msgbox_cancel_5.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_msgbox_cancel_5@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_msgbox_cancel_7.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_msgbox_cancel_7@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_msgbox_cancel_h_1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_msgbox_cancel_h_1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_msgbox_cancel_h_2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_msgbox_cancel_h_2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_msgbox_cancel_h_3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_msgbox_cancel_h_3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_msgbox_cancel_h_4.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_msgbox_cancel_h_4@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_msgbox_cancel_h_5.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_msgbox_cancel_h_5@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_msgbox_cancel_h_7.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_msgbox_cancel_h_7@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_msgbox_ok.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_msgbox_ok@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_msgbox_ok_1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_msgbox_ok_1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_msgbox_ok_2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_msgbox_ok_2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_msgbox_ok_3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_msgbox_ok_3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_msgbox_ok_4.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_msgbox_ok_4@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_msgbox_ok_5.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_msgbox_ok_5@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_msgbox_ok_7.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_msgbox_ok_7@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_phoneCode.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_phoneCode@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_phoneNext_d.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_phoneNext_d@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_phoneNext_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_phoneNext_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_phoneNext_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_phoneNext_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_post_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_post_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_post_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_post_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_refresh_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_refresh_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_refresh_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_refresh_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_select_listened_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_select_listened_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_select_listened_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_select_listened_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_share_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_share_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_share_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_share_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_sixin.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_sixin@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_sixin_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_sixin_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_skip.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_skip@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_startView_phone_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_startView_phone_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_startView_phone_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_startView_phone_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_startView_qq_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_startView_qq_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_startView_qq_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_startView_qq_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_startView_reg_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_startView_reg_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_startView_reg_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_startView_reg_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_startView_rr_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_startView_rr_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_startView_rr_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_startView_rr_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_startView_sina_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_startView_sina_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_startView_sina_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_startView_sina_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_startView_wechat_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_startView_wechat_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_startView_wechat_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_startView_wechat_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_tyq_enter.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_tyq_enter@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_tyq_fb_delete.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_tyq_fb_delete@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_tyq_play.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_tyq_play@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_unfollow_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_unfollow_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_unfollow_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_unfollow_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_wakeup_info_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_wakeup_info_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btn_wakeup_info_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btn_wakeup_info_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btsetting1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btsetting1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/btsetting2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"btsetting2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/bugtags.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"bugtags.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": "RxXMLY/Assets.xcassets/icon_XMLY/buyPresent.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"buyPresent@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cancelConnectBtn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cancelConnectBtn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/card_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"card_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/carlifeLogo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"carlifeLogo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/categoryHot.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"categoryHot@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/categoryNew.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"categoryNew@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/category_rec_arrow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"category_rec_arrow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/category_rec_mark.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"category_rec_mark@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/category_rec_play.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"category_rec_play@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/category_rec_play_all.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"category_rec_play_all@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_arrow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_arrow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_arrow_all.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_arrow_all@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_arrow_all_up.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_arrow_all_up@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_bottom_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_bottom_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_bottom_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_bottom_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_c.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_c@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_chat_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_chat_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_chat_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_chat_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_commentline.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_commentline@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_info_bottom.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_info_bottom@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_info_top.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_info_top@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_loadletter_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_loadletter_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_loadletter_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_loadletter_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_middle_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_middle_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_middle_ipad_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_middle_ipad_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_middle_ipad_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_middle_ipad_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_middle_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_middle_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_middle_noseg_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_middle_noseg_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_middle_noseg_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_middle_noseg_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_newchat.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_newchat@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_noData_1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_noData_1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_noData_2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_noData_2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_noData_3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_noData_3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_noData_4.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_noData_4@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_noData_5.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_noData_5@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_noData_6.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_noData_6@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_noData_7.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_noData_7@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_noseg_c.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_noseg_c@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_top_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_top_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_top_ipad_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_top_ipad_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_top_ipad_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_top_ipad_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_top_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_top_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_top_noseg_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_top_noseg_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_bg_top_noseg_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_bg_top_noseg_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_chat_bg_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_chat_bg_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_chat_bg_me.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_chat_bg_me@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_chat_bg_other.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_chat_bg_other@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_chat_bg_time.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_chat_bg_time@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_chat_sharpCorner_l.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_chat_sharpCorner_l@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_chat_sharpCorner_l_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_chat_sharpCorner_l_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_chat_sharpCorner_r.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_chat_sharpCorner_r@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_chat_sharpCorner_r_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_chat_sharpCorner_r_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_comment_sharpcorner.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_comment_sharpcorner@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_contactlist_line.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_contactlist_line@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_cover_mask.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_cover_mask@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_delete_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_delete_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_delete_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_delete_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_download.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_download@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_download_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_download_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_download_loading.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_download_loading@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_download_lock.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_download_lock@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_downloaded.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_downloaded@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_downloading.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_downloading@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_downstop.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_downstop@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_freshnews_arrow_down.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_freshnews_arrow_down@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_freshnews_down.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_freshnews_down@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_freshnews_up.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_freshnews_up@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_moreMenu_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_moreMenu_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_moreMenu_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_moreMenu_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_phone_mark.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_phone_mark@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_sound_disable.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_sound_disable@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_sound_pause_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_sound_pause_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_sound_play_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_sound_play_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_sound_tip.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_sound_tip@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cell_writeChat.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cell_writeChat@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cgz_ic_accuracy.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cgz_ic_accuracy@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/changeAlbum.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"changeAlbum@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/changeBind.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"changeBind@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/channel_change_btn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"channel_change_btn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/chat_bg_left_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"chat_bg_left_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/chat_bg_left_norma.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"chat_bg_left_norma@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/chat_bg_left_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"chat_bg_left_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/chat_bg_left_pressed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"chat_bg_left_pressed@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/chat_bg_right_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"chat_bg_right_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/chat_bg_right_norma.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"chat_bg_right_norma@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/chat_bg_right_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"chat_bg_right_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/chat_bg_right_pressed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"chat_bg_right_pressed@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/chat_bg_right_share_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"chat_bg_right_share_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/chat_bg_right_share_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"chat_bg_right_share_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/chat_bg_right_w_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"chat_bg_right_w_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/chat_btn_image.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"chat_btn_image@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/chat_icon_setting.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"chat_icon_setting@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/checkmark.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"checkmark@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/checkmark_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"checkmark_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/clickAdIcon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"clickAdIcon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/clickAdIconImg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"clickAdIconImg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/closeBind.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"closeBind@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/closeBtn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"closeBtn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/closeShakeLottoryResult.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"closeShakeLottoryResult@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cmtDetailDelete.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cmtDetailDelete@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cmtDetailReport.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cmtDetailReport@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cmtNoData.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cmtNoData@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/code_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"code_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/code_btn_change.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"code_btn_change@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/color_clear.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"color_clear.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": "RxXMLY/Assets.xcassets/icon_XMLY/columnShadow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"columnShadow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/commentShare_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"commentShare_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/comment_like.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"comment_like@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/comment_share_check_mark.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"comment_share_check_mark@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/comment_unlike.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"comment_unlike@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/connectDevice.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"connectDevice@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/connectFail.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"connectFail@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/connect_wifi.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"connect_wifi.gif\",\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": "RxXMLY/Assets.xcassets/icon_XMLY/connextAgain.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"connextAgain@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/contactlist_header_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"contactlist_header_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/content_closeView.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"content_closeView@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/couponCardClose.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"couponCardClose@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/coupon_limit_bkg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"coupon_limit_bkg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/coupon_limit_buy.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"coupon_limit_buy@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/coupon_limit_line.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"coupon_limit_line@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/coupon_limit_success.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"coupon_limit_success@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/coupon_sel.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"coupon_sel@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/coupon_unsel.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"coupon_unsel@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/couponbg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"couponbg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/coverTip.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"coverTip@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cover_recommend.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cover_recommend@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cycle_arrow_down.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cycle_arrow_down@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/cycle_arrow_up.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"cycle_arrow_up@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_aini.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_aini.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_aini@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_aoteman.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_aoteman.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_aoteman@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_baibai.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_baibai.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_baibai@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_beishang.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_beishang.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_beishang@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_bishi.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_bishi.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_bishi@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_bizui.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_bizui.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_bizui@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_chanzui.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_chanzui.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_chanzui@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_chijing.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_chijing.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_chijing@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_dahaqi.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_dahaqi.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_dahaqi@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_ding.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_ding.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_ding@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_fennu.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_fennu.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_fennu@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_ganmao.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_ganmao.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_ganmao@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_guzhang.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_guzhang.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_guzhang@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_haha.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_haha.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_haha@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_haixiu.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_haixiu.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_haixiu@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_han.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_han.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_han@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_hehe.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_hehe.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_hehe@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_heixian.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_heixian.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_heixian@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_heng.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_heng.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_heng@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_huaxin.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_huaxin.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_huaxin@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_keai.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_keai.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_keai@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_kelian.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_kelian.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_kelian@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_ku.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_ku.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_ku@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_kun.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_kun.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_kun@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_landelini.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_landelini.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_landelini@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_lei.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_lei.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_lei@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_nanhaier.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_nanhaier.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_nanhaier@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_nu.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_nu.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_nu@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_numa.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_numa.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_numa@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_nvhaier.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_nvhaier.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_nvhaier@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_qian.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_qian.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_qian@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_qinqin.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_qinqin.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_qinqin@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_shengbing.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_shengbing.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_shengbing@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_shiwang.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_shiwang.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_shiwang@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_shuai.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_shuai.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_shuai@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_shudaizi.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_shudaizi.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_shudaizi@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_shuijiao.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_shuijiao.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_shuijiao@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_sikao.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_sikao.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_sikao@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_taikaixin.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_taikaixin.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_taikaixin@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_touxiao.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_touxiao.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_touxiao@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_tu.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_tu.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_tu@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_tuzi.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_tuzi.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_tuzi@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_wabishi.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_wabishi.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_wabishi@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_weiqu.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_weiqu.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_weiqu@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_xiongmao.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_xiongmao.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_xiongmao@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_xixi.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_xixi.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_xixi@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_xu.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_xu.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_xu@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_yinxian.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_yinxian.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_yinxian@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_yiwen.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_yiwen.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_yiwen@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_youhengheng.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_youhengheng.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_youhengheng@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_yun.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_yun.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_yun@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_zhuakuang.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_zhuakuang.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_zhuakuang@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_zhutou.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_zhutou.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_zhutou@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_zuoguilian.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_zuoguilian.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_zuoguilian@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/d_zuohengheng.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_zuohengheng.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"d_zuohengheng@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/dailylistening_Batch_download.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"dailylistening_Batch_download@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/dailylistening_cell_download.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"dailylistening_cell_download@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/dailylistening_icon_Play_all.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"dailylistening_icon_Play_all@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/dailylistening_icon_album.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"dailylistening_icon_album@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/dailylistening_icon_length.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"dailylistening_icon_length@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/dailylistening_img_date.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"dailylistening_img_date@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/danmubg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"danmubg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/danmubgself.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"danmubgself@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/dash.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"dash@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/dataicon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"dataicon.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": "RxXMLY/Assets.xcassets/icon_XMLY/delete.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"delete@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/deleteCell_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"deleteCell_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/deleteCell_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"deleteCell_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/delete_all_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"delete_all_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/delete_all_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"delete_all_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/deletion_selected.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"deletion_selected@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/deletion_unselected.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"deletion_unselected@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/deviceBackView.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"deviceBackView@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/device_dot.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"device_dot@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/device_more.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"device_more@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/device_play.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"device_play@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/device_playFast.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"device_playFast@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/device_playLike.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"device_playLike@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/device_playLiked.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"device_playLiked@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/device_playPause.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"device_playPause@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/device_playPre.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"device_playPre@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/dis_next_arrow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"dis_next_arrow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/dis_previous_arrow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"dis_previous_arrow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/down_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"down_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/downloadAlbum.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"downloadAlbum@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/downloadMore.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"downloadMore@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/download_ic_download.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"download_ic_download@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/download_ic_pause.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"download_ic_pause@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/download_ic_waiting.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"download_ic_waiting@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/download_ic_wrong.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"download_ic_wrong@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/download_icon_downloadmore.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"download_icon_downloadmore@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/downloading.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"downloading@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/dynamic_album_new.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"dynamic_album_new@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/dynamic_event.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"dynamic_event@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/dynamic_more.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"dynamic_more@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/dynamic_recommand.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"dynamic_recommand@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/expiredDateBg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"expiredDateBg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/f_geili.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"f_geili.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"f_geili@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/f_hufen.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"f_hufen.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"f_hufen@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/f_jiong.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"f_jiong.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"f_jiong@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/f_meng.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"f_meng.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"f_meng@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/f_shenma.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"f_shenma.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"f_shenma@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/f_shuai.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"f_shuai.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"f_shuai@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/f_v5.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"f_v5.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"f_v5@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/f_xi.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"f_xi.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"f_xi@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/f_zhi.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"f_zhi.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"f_zhi@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/fail.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"fail@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/fanlist_ic_gift(w).imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"fanlist_ic_gift(w)@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"fanlist_ic_gift(w)@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/fanlist_icon_❤_grey.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"fanlist_icon_❤_grey@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/fanlist_icon_❤_pink.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"fanlist_icon_❤_pink@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/fanlist_icon_❤_white.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"fanlist_icon_❤_white@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/fanlist_icon_❤_yellow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"fanlist_icon_❤_yellow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/fanlist_top1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"fanlist_top1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/fanlist_top2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"fanlist_top2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/fanlist_top3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"fanlist_top3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/fanlist_top_g.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"fanlist_top_g@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/fanlist_top_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"fanlist_top_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/favAlbumCell_new.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"favAlbumCell_new@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/favSoundDelete.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"favSoundDelete@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/favSoundDeleteH.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"favSoundDeleteH@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/feedAd_del.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"feedAd_del@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/feedAd_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"feedAd_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/feedAd_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"feedAd_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/feedbackAlert_close.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"feedbackAlert_close@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/feedbackAlert_content.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"feedbackAlert_content@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/feedbackAlert_negative_btn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"feedbackAlert_negative_btn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/feedbackAlert_positive_btn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"feedbackAlert_positive_btn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/feedbackImg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"feedbackImg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/field_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"field_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/filter_detail.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"filter_detail@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/findCategory_default.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"findCategory_default@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_Local_Icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_Local_Icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_VIP.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_VIP@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_ad_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_ad_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_album_border.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_album_border@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_album_fav_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_album_fav_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_album_unfav_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_album_unfav_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_albumcell_cover_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_albumcell_cover_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_albumcell_play.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_albumcell_play@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_all.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_all@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_baijia.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_baijia@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_book.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_book@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_bubble_large.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_bubble_large@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_bubble_middle.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_bubble_middle@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_bubble_small.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_bubble_small@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_campus.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_campus@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_car.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_car@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_category_rank_line.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_category_rank_line@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_chair.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_chair@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_change_batch.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_change_batch@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_change_more.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_change_more@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_comic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_comic@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_comment_star.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_comment_star@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_cover.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_cover@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_culture.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_culture@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_dot_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_dot_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_dot_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_dot_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_down_rec.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_down_rec@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_emotion.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_emotion@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_entertainment.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_entertainment@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_finance.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_finance@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_game.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_game@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_gotocate.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_gotocate@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_health.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_health@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_hotUser_fans.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_hotUser_fans@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_hotUser_following.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_hotUser_following@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_hotUser_sounds.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_hotUser_sounds@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_hotUser_toFollow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_hotUser_toFollow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_hot_albumcover.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_hot_albumcover@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_hotuser_pause.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_hotuser_pause@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_hotuser_play.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_hotuser_play@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_it.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_it@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_kid.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_kid@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_kind_btn_default.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_kind_btn_default@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_movie.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_movie@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_music.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_music@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_news.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_news@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_notReachable.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_notReachable.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": "RxXMLY/Assets.xcassets/icon_XMLY/find_opera.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_opera@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_other.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_other@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_person_6.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_person_6@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_person_cover.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_person_cover@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_pop_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_pop_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_pop_btn_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_pop_btn_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_pop_btn_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_pop_btn_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_pop_btn_sepline.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_pop_btn_sepline@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_pop_footer.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_pop_footer@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_pop_header.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_pop_header@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_pop_shadow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_pop_shadow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_radio.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_radio@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_radio_default.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_radio_default@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_radio_focuse.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_radio_focuse@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_radio_focuse_sel.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_radio_focuse_sel@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_radioplay.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_radioplay@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_rec_live.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_rec_live@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_rec_mask.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_rec_mask@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_rec_play.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_rec_play@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_rec_report.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_rec_report@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_searchbar.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_searchbar@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_seg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_seg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_selected.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_selected@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_special_default.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_special_default@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_specialicon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_specialicon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_subject_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_subject_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_tagicon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_tagicon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_track_comment.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_track_comment@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_track_pause.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_track_pause@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_track_play.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_track_play@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_train.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_train@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_travel.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_travel@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/find_usercover.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"find_usercover@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/findcell_arrow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"findcell_arrow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/findfriends_via_contact.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"findfriends_via_contact@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/findfriends_via_qq.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"findfriends_via_qq@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/findfriends_via_renren.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"findfriends_via_renren@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/findfriends_via_weibo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"findfriends_via_weibo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/findfriends_via_wx.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"findfriends_via_wx@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/findsection_logo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"findsection_logo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/findsection_more.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"findsection_more@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/findsubject_large_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"findsubject_large_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/findsubject_mask.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"findsubject_mask@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/flexible.dataset/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"data\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"flexible.js\"\n    }\n  ]\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/flexible.dataset/flexible.js",
    "content": ";(function(win, lib) {\n    var doc = win.document;\n    var docEl = doc.documentElement;\n    var metaEl = doc.querySelector('meta[name=\"viewport\"]');\n    var flexibleEl = doc.querySelector('meta[name=\"flexible\"]');\n    var dpr = 0;\n    var scale = 0;\n    var tid;\n    var flexible = lib.flexible || (lib.flexible = {});\n\n    if (metaEl) {\n        console.warn('将根据已有的meta标签来设置缩放比例');\n        var match = metaEl.getAttribute('content').match(/initial\\-scale=([\\d\\.]+)/);\n        if (match) {\n            scale = parseFloat(match[1]);\n            dpr = parseInt(1 / scale);\n        }\n    } else if (flexibleEl) {\n        var content = flexibleEl.getAttribute('content');\n        if (content) {\n            var initialDpr = content.match(/initial\\-dpr=([\\d\\.]+)/);\n            var maximumDpr = content.match(/maximum\\-dpr=([\\d\\.]+)/);\n            if (initialDpr) {\n                dpr = parseFloat(initialDpr[1]);\n                scale = parseFloat((1 / dpr).toFixed(2));\n            }\n            if (maximumDpr) {\n                dpr = parseFloat(maximumDpr[1]);\n                scale = parseFloat((1 / dpr).toFixed(2));\n            }\n        }\n    }\n\n    if (!dpr && !scale) {\n        var isAndroid = win.navigator.appVersion.match(/android/gi);\n        var isIPhone = win.navigator.appVersion.match(/iphone/gi);\n        var devicePixelRatio = win.devicePixelRatio;\n        if (isIPhone) {\n            // iOS下，对于2和3的屏，用2倍的方案，其余的用1倍方案\n            if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {\n                dpr = 3;\n            } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)){\n                dpr = 2;\n            } else {\n                dpr = 1;\n            }\n        } else {\n            // 其他设备下，仍旧使用1倍的方案\n            dpr = 1;\n        }\n        scale = 1 / dpr;\n    }\n\n    docEl.setAttribute('data-dpr', dpr);\n    if (!metaEl) {\n        metaEl = doc.createElement('meta');\n        metaEl.setAttribute('name', 'viewport');\n        metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');\n        if (docEl.firstElementChild) {\n            docEl.firstElementChild.appendChild(metaEl);\n        } else {\n            var wrap = doc.createElement('div');\n            wrap.appendChild(metaEl);\n            doc.write(wrap.innerHTML);\n        }\n    }\n\n    function refreshRem(){\n        var width = docEl.getBoundingClientRect().width;\n        if (width / dpr > 540) {\n            width = 540 * dpr;\n        }\n        var rem = width / 10;\n        docEl.style.fontSize = rem + 'px';\n        flexible.rem = win.rem = rem;\n    }\n\n    win.addEventListener('resize', function() {\n        clearTimeout(tid);\n        tid = setTimeout(refreshRem, 300);\n    }, false);\n    win.addEventListener('pageshow', function(e) {\n        if (e.persisted) {\n            clearTimeout(tid);\n            tid = setTimeout(refreshRem, 300);\n        }\n    }, false);\n\n    if (doc.readyState === 'complete') {\n        doc.body.style.fontSize = 12 * dpr + 'px';\n    } else {\n        doc.addEventListener('DOMContentLoaded', function(e) {\n            doc.body.style.fontSize = 12 * dpr + 'px';\n        }, false);\n    }\n\n\n    refreshRem();\n\n    flexible.dpr = win.dpr = dpr;\n    flexible.refreshRem = refreshRem;\n    flexible.rem2px = function(d) {\n        var val = parseFloat(d) * this.rem;\n        if (typeof d === 'string' && d.match(/rem$/)) {\n            val += 'px';\n        }\n        return val;\n    }\n    flexible.px2rem = function(d) {\n        var val = parseFloat(d) / this.rem;\n        if (typeof d === 'string' && d.match(/px$/)) {\n            val += 'rem';\n        }\n        return val;\n    }\n\n})(window, window['lib'] || (window['lib'] = {}));\n"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/fm_down.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"fm_down@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/fm_down_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"fm_down_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/fm_up.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"fm_up@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/fm_up_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"fm_up_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/foldCmtBG.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"foldCmtBG@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/foldCmt_anchor.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"foldCmt_anchor@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/freeTrafficAlertBg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"freeTrafficAlertBg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/freeTrafficAlertBg_Nomal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"freeTrafficAlertBg_Nomal@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/freeTrafficAlertClose.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"freeTrafficAlertClose@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/freeTrafficOpenBtn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"freeTrafficOpenBtn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/free_hight.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"free_hight@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/free_normal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"free_normal@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/freshman_coupon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"freshman_coupon.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": "RxXMLY/Assets.xcassets/icon_XMLY/futuraLT.dataset/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"data\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"futuraLT.ttf\"\n    }\n  ]\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/game_banner.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"game_banner@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/game_logined_logo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"game_logined_logo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/game_qq_login.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"game_qq_login@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/game_qq_login_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"game_qq_login_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/game_wechat_login.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"game_wechat_login@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/game_wechat_login_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"game_wechat_login_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/game_weibo_login.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"game_weibo_login@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/game_weibo_login_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"game_weibo_login_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/gdticon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"gdticon.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": "RxXMLY/Assets.xcassets/icon_XMLY/getLottory.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"getLottory@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/group_bbs_ic_pic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"group_bbs_ic_pic@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/group_ic_camera.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"group_ic_camera@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/group_ic_img.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"group_ic_img@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/group_ic_topic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"group_ic_topic@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/group_icon_checkbox_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"group_icon_checkbox_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/group_icon_checkbox_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"group_icon_checkbox_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/group_icon_setting.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"group_icon_setting@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/group_img_album(null).imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"group_img_album(null)@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"group_img_album(null)@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/group_img_all.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"group_img_all@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/group_img_null.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"group_img_null@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/group_tag_jp.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"group_tag_jp@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/group_tag_pay.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"group_tag_pay@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/group_tag_top.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"group_tag_top@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/guessRefresh.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"guessRefresh@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/guidemask_broadcast.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"guidemask_broadcast@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/guidemask_download.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"guidemask_download@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/guidemask_inviteting.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"guidemask_inviteting@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/guidemask_shareting.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"guidemask_shareting@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/gushiji_1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"gushiji_1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/gushiji_2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"gushiji_2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/gushiji_manage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"gushiji_manage@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/h_buyao.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"h_buyao.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"h_buyao@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/h_good.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"h_good.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"h_good@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/h_guolai.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"h_guolai.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": "RxXMLY/Assets.xcassets/icon_XMLY/h_haha.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"h_haha.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"h_haha@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/h_lai.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"h_lai@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/h_ok.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"h_ok.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"h_ok@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/h_quantou.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"h_quantou.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"h_quantou@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/h_ruo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"h_ruo.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"h_ruo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/h_woshou.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"h_woshou.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"h_woshou@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/h_ye.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"h_ye.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"h_ye@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/h_zan.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"h_zan.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"h_zan@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/h_zuicha.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"h_zuicha.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"h_zuicha@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/halfOff4123.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"halfOff4123@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/hardware_load.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hardware_load@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/hardware_shopping.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hardware_shopping@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/header_over.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"header_over@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/hearContentIV.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hearContentIV@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/hearDownload.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hearDownload@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/hearGuideClose.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hearGuideClose@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/hearHistory.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hearHistory@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/hearLiveCount.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hearLiveCount@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/hearLiveTag.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hearLiveTag@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/hearSubscribe.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hearSubscribe@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/hearSubscribed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hearSubscribed@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/hear_download.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hear_download@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/hear_favourite.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hear_favourite@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/hear_history.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hear_history@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/hear_paid.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hear_paid@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/hear_sort_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hear_sort_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/hear_sort_s.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hear_sort_s@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/hobby_ic_learn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hobby_ic_learn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/hobby_ic_life.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hobby_ic_life@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/hobby_ic_listen.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hobby_ic_listen@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/hobby_pic_boy.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hobby_pic_boy@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/hobby_pic_girl.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hobby_pic_girl@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/home_tips_icon_more.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"home_tips_icon_more@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/home_tips_icon_turnoff.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"home_tips_icon_turnoff@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/hot.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hot@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/hoticon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hoticon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/hover.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hover@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/hybrid_overlay.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"hybrid_overlay@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_?.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_?@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_?@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_LYP.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_LYP@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_achieve.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_achieve@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_close.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_close@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_create_album.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_create_album@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_discovery_new.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_discovery_new@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_dmgg_buling_o.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_dmgg_buling_o@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_dmgg_img_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_dmgg_img_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_dmgg_img_bg_o.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_dmgg_img_bg_o@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_dmgg_star_big.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_dmgg_star_big@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_dmgg_star_big_o.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_dmgg_star_big_o@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_dmgg_star_small.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_dmgg_star_small@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_dmgg_star_small_o.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_dmgg_star_small_o@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_fans.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_fans@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_gift_.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_gift_@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_gift_@3x.png\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_group.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_group@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_live.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_live@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_massage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_massage@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_money.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_money@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_more.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_more@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_navi_group.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_navi_group@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_navi_group_new.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_navi_group_new@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_plus.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_plus@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_popularize.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_popularize@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_rec_o.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_rec_o@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_rec_w.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_rec_w@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_setting.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_setting@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_sounds.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_sounds@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_triangle_up.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_triangle_up@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_tyq.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_tyq@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_tyq_-report.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_tyq_-report@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_tyq_albums.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_tyq_albums@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_tyq_comment.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_tyq_comment@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_tyq_copy.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_tyq_copy@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_tyq_delete.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_tyq_delete@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_tyq_edit.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_tyq_edit@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_tyq_fb_albums_big.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_tyq_fb_albums_big@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_tyq_fb_pic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_tyq_fb_pic@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_tyq_fb_sound.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_tyq_fb_sound@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_tyq_like.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_tyq_like@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_tyq_like_on.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_tyq_like_on@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_tyq_massage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_tyq_massage@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_tyq_massage_red.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_tyq_massage_red@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_tyq_more.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_tyq_more@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_tyq_next.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_tyq_next@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_tyq_reply.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_tyq_reply@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_tyq_save.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_tyq_save@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_tyq_stop.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_tyq_stop@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_tyq_unfollow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_tyq_unfollow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_tyq_zty.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_tyq_zty@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_tyq_zty_phone.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_tyq_zty_phone@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_tyq_zty_qq.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_tyq_zty_qq@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_tyq_zty_wechat.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_tyq_zty_wechat@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_tyq_zty_weibo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_tyq_zty_weibo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_up.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_up@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_upload.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_upload@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_v.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_v@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ic_wyzb_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ic_wyzb_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon-120.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon-120.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": "RxXMLY/Assets.xcassets/icon_XMLY/icon-180.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon-180.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": "RxXMLY/Assets.xcassets/icon_XMLY/icon-72.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon-72.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon-72@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon-76.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon-76.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon-76@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_add.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_add@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_as_cancel.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_as_cancel@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_as_comment.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_as_comment@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_as_coupon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_as_coupon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_as_pop_album_device.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_as_pop_album_device@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_as_share.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_as_share@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_as_tick.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_as_tick@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_as_top.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_as_top@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_as_unfav.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_as_unfav@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_as_untop.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_as_untop@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_as_worn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_as_worn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_back.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_back@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_back_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_back_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_back_highlight.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_back_highlight@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_back_round.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_back_round@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_back_round_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_back_round_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_clock.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_clock@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_clock_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_clock_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_fabu_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_fabu_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_fabu_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_fabu_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_history_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_history_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_history_live.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_history_live@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_history_mobile.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_history_mobile@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_history_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_history_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_history_pc.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_history_pc@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_history_radio.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_history_radio@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_home.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_home@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_home_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_home_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_home_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_home_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_indicator_down.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_indicator_down@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_indicator_right.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_indicator_right@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_more.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_more@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_more_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_more_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_more_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_more_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_more_round.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_more_round@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_more_round_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_more_round_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_myView.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_myView@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_playlist_live.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_playlist_live@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_playlist_playback.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_playlist_playback@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_playlist_schedules_0.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_playlist_schedules_0@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_playlist_schedules_1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_playlist_schedules_1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_radio_country.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_radio_country@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_radio_hide.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_radio_hide@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_radio_internet.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_radio_internet@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_radio_local.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_radio_local@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_radio_province.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_radio_province@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_radio_show.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_radio_show@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_rec_bgm.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_rec_bgm@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_rec_bgm_add.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_rec_bgm_add@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_rec_bgm_new.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_rec_bgm_new@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_rec_track_pause.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_rec_track_pause@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_rec_track_play.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_rec_track_play@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_rec_tutorial.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_rec_tutorial@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_rec_vol.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_rec_vol@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_rec_volcontrol.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_rec_volcontrol@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_search_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_search_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_search_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_search_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_setting.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_setting@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_setting_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_setting_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_setting_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_setting_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_share.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_share@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_share_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_share_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_share_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_share_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_sixin.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_sixin@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_sixin_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_sixin_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_sixin_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_sixin_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_title_rss.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_title_rss@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_toolbar_morelive.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_toolbar_morelive@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_tyq_tz_like.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_tyq_tz_like@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/icon_x.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"icon_x@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/iconfont-yaoyiyao.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"iconfont-yaoyiyao@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/image_mylive_nodata.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"image_mylive_nodata@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/image_two_close.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"image_two_close@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/image_two_mark.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"image_two_mark@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/img_carlife.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"img_carlife.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": "RxXMLY/Assets.xcassets/icon_XMLY/img_rec_bgm_offline.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"img_rec_bgm_offline@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/img_rec_bgm_wifi.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"img_rec_bgm_wifi@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/img_tyq_cellbg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"img_tyq_cellbg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/img_tyq_here.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"img_tyq_here@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/img_tyq_nofriend.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"img_tyq_nofriend@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individualV0.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individualV0@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individualV1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individualV1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individualV10.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individualV10@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individualV11.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individualV11@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individualV12.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individualV12@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individualV13.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individualV13@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individualV14.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individualV14@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individualV15.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individualV15@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individualV16.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individualV16@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individualV2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individualV2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individualV3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individualV3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individualV4.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individualV4@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individualV5.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individualV5@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individualV6.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individualV6@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individualV7.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individualV7@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individualV8.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individualV8@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individualV9.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individualV9@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_blueV0.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_blueV0@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_blueV1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_blueV1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_blueV10.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_blueV10@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_blueV11.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_blueV11@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_blueV12.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_blueV12@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_blueV13.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_blueV13@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_blueV14.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_blueV14@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_blueV15.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_blueV15@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_blueV16.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_blueV16@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_blueV2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_blueV2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_blueV3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_blueV3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_blueV4.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_blueV4@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_blueV5.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_blueV5@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_blueV6.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_blueV6@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_blueV7.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_blueV7@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_blueV8.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_blueV8@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_blueV9.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_blueV9@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_orangeV0.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_orangeV0@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_orangeV014.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_orangeV014@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_orangeV1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_orangeV1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_orangeV10.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_orangeV10@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_orangeV11.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_orangeV11@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_orangeV12.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_orangeV12@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_orangeV13.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_orangeV13@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_orangeV15.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_orangeV15@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_orangeV16.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_orangeV16@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_orangeV2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_orangeV2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_orangeV3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_orangeV3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_orangeV4.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_orangeV4@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_orangeV5.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_orangeV5@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_orangeV6.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_orangeV6@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_orangeV7.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_orangeV7@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_orangeV8.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_orangeV8@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/individual_orangeV9.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"individual_orangeV9@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/input_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"input_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/input_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"input_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/iocn_Screening_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"iocn_Screening_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/iocn_Screening_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"iocn_Screening_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/jmgl_ic_college.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"jmgl_ic_college@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/join_vip_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"join_vip_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/jshandle.dataset/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"data\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"jshandle.js\"\n    }\n  ]\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/jshandle.dataset/jshandle.js",
    "content": "\n$( document ).ajaxSend(function( event, request, settings )  {\n                          callNativeApp('ajaxSend',settings.data);\n                       });\n$( document ).ajaxSuccess(function( event, xhr, settings )  {\n                          data = document.cookie;\n                          callNativeApp ('ajaxSuccess',data);\n                        });\n\nwindow.resize(function( event ){\n              getDocumentSize();\n              });\nfunction getDocumentSize() {\n    window.webkit.messageHandlers.sizeNotification.postMessage({width: document.width, height: document.height});\n}\n\nfunction callNativeApp (cmd,data) {\n    \n    if(cmd == 'ajaxSend'){\n        try {\n            webkit.messageHandlers.ajaxSend.postMessage(data);\n        }\n        catch(err) {\n            console.log('The native context does not exist yet');\n        }\n    } else if(cmd == 'ajaxSuccess') {\n    \n        try {\n            webkit.messageHandlers.ajaxSuccess.postMessage(data);\n        }\n        catch(err) {\n            console.log('The native context does not exist yet');\n        }\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/l_aixinchuandi.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"l_aixinchuandi.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"l_aixinchuandi@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/l_shangxin.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"l_shangxin.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"l_shangxin@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/l_xin.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"l_xin.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"l_xin@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/lastLoginTip.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"lastLoginTip@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/leftside_shadow_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"leftside_shadow_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/lineShadow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"lineShadow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/line_horizeontal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"line_horizeontal@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/liveClose.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"liveClose.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": "RxXMLY/Assets.xcassets/icon_XMLY/livePlayingHistory.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"livePlayingHistory@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/livePlayingList.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"livePlayingList@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/livePlayingStatusLive.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"livePlayingStatusLive@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/liveRadioCellPause.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"liveRadioCellPause@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/liveRadioCellPlay.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"liveRadioCellPlay@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/liveRadioCellPoint.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"liveRadioCellPoint@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/liveRadioDropDownButtonBg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"liveRadioDropDownButtonBg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/liveRadioPlay_album_mask.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"liveRadioPlay_album_mask@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/liveRadioPlayingBack.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"liveRadioPlayingBack@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/liveRadioProvinceBg_High.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"liveRadioProvinceBg_High@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/liveRadioProvinceBg_Normal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"liveRadioProvinceBg_Normal@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/liveRadioSectionMore_High.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"liveRadioSectionMore_High@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/liveRadioSectionMore_Normal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"liveRadioSectionMore_Normal@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/liveRadio_activity_moreLive.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"liveRadio_activity_moreLive@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/liveRadio_album_mask480.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"liveRadio_album_mask480@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/liveRadio_beta.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"liveRadio_beta@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/liveRaido_album_mask.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"liveRaido_album_mask@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_bg_chat_other.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_bg_chat_other@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_bg_close.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_bg_close@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_bg_close2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_bg_close2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_bg_close_white.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_bg_close_white@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_bg_count.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_bg_count@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_bg_default.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_bg_default.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": "RxXMLY/Assets.xcassets/icon_XMLY/live_bg_gift.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_bg_gift@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_bg_gridmask.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_bg_gridmask@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_bg_imgmask.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_bg_imgmask@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_bg_mask.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_bg_mask@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_bg_shadow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_bg_shadow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_bg_tips.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_bg_tips@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_bg_tips1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_bg_tips1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_bg_triangle.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_bg_triangle@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_addmusic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_addmusic@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_admin_add.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_admin_add@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_admin_remove.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_admin_remove@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_adminlist.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_adminlist@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_call.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_call@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_call_online.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_call_online@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_call_online_00.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_call_online_00@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_call_online_01.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_call_online_01@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_call_online_03.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_call_online_03@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_checked.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_checked@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_close.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_close@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_comment.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_comment@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_confirm.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_confirm@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_delete.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_delete@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_emoji.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_emoji@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_end.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_end@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_followe.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_followe@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_followed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_followed@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_fullscreen.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_fullscreen@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_fullscreen_exit.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_fullscreen_exit@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_gallery.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_gallery@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_gift.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_gift@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_hangup.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_hangup@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_hide.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_hide@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_hit.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_hit@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_host_call.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_host_call@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_host_call_online.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_host_call_online@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_host_comment.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_host_comment@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_host_manage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_host_manage@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_host_menu.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_host_menu@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_host_micoff.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_host_micoff@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_host_micon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_host_micon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_host_mixer.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_host_mixer@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_host_music.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_host_music@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_host_photo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_host_photo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_host_sound.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_host_sound@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_host_topic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_host_topic@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_image.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_image@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_infohide.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_infohide@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_keyboard.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_keyboard@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_manage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_manage@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_menu.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_menu@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_mic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_mic@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_micoff.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_micoff@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_micon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_micon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_mixer.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_mixer@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_music.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_music@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_music_add.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_music_add@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_music_bgm.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_music_bgm@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_music_download.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_music_download@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_music_loop.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_music_loop@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_music_pause.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_music_pause@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_music_play.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_music_play@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_music_remove.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_music_remove@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_music_repeat.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_music_repeat@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_music_vol.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_music_vol@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_new.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_new@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_newmessage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_newmessage@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_next.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_next@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_notice.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_notice@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_pause.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_pause@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_photo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_photo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_play.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_play@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_prev.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_prev@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_replay.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_replay@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_rotate.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_rotate@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_saveImage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_saveImage@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_setting.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_setting@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_share.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_share@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_slide_hide.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_slide_hide@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_slide_show.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_slide_show@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_social_group_off.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_social_group_off@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_social_group_on.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_social_group_on@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_social_moment_off.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_social_moment_off@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_social_moment_on.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_social_moment_on@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_social_qq_off.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_social_qq_off@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_social_qq_on.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_social_qq_on@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_social_qzone_off.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_social_qzone_off@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_social_qzone_on.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_social_qzone_on@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_social_tyq_off.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_social_tyq_off@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_social_tyq_on.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_social_tyq_on@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_social_wechat_off.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_social_wechat_off@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_social_wechat_on.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_social_wechat_on@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_social_weibo_off.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_social_weibo_off@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_social_weibo_on.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_social_weibo_on@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_sound.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_sound@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_speaker.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_speaker@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_topic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_topic@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_unchecked.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_unchecked@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_btn_vol.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_btn_vol@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_gift_bg_pop.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_gift_bg_pop@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_gift_icon_down.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_gift_icon_down@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_gift_icon_right.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_gift_icon_right@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_gift_icon_selected.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_gift_icon_selected@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_anchor.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_anchor@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_arrow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_arrow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_arrow_right.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_arrow_right@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_badge_top1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_badge_top1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_badge_top2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_badge_top2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_badge_top3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_badge_top3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_count.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_count@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_date.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_date@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_defaultgift.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_defaultgift@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_diamond.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_diamond@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_follow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_follow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_gif_play.dataset/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"data\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_gif_play.json\"\n    }\n  ]\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_gif_play.dataset/live_ic_gif_play.json",
    "content": "{\"v\":\"4.6.10\",\"fr\":24,\"ip\":0,\"op\":48,\"w\":24,\"h\":24,\"nm\":\"live_ic_gif_play\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\"形状图层 4\",\"ks\":{\"o\":{\"a\":0,\"k\":100},\"r\":{\"a\":0,\"k\":0},\"p\":{\"a\":0,\"k\":[20.064,22.14,0]},\"a\":{\"a\":0,\"k\":[-287.393,120.67,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667,0.667,0.667],\"y\":[0.667,1,0.667]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0.333,0,0.333]},\"n\":[\"0p667_0p667_0p333_0p333\",\"0p667_1_0p333_0\",\"0p667_0p667_0p333_0p333\"],\"t\":0,\"s\":[100,65.549,100],\"e\":[100,168.549,100]},{\"i\":{\"x\":[0.667,0.667,0.667],\"y\":[0.667,1,0.667]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0.333,0,0.333]},\"n\":[\"0p667_0p667_0p333_0p333\",\"0p667_1_0p333_0\",\"0p667_0p667_0p333_0p333\"],\"t\":13,\"s\":[100,168.549,100],\"e\":[100,89.549,100]},{\"i\":{\"x\":[0.667,0.667,0.667],\"y\":[0.667,1,0.667]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0.333,0,0.333]},\"n\":[\"0p667_0p667_0p333_0p333\",\"0p667_1_0p333_0\",\"0p667_0p667_0p333_0p333\"],\"t\":25,\"s\":[100,89.549,100],\"e\":[100,167.549,100]},{\"i\":{\"x\":[0.667,0.667,0.667],\"y\":[0.667,1,0.667]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0.333,0,0.333]},\"n\":[\"0p667_0p667_0p333_0p333\",\"0p667_1_0p333_0\",\"0p667_0p667_0p333_0p333\"],\"t\":37,\"s\":[100,167.549,100],\"e\":[100,65.549,100]},{\"t\":48}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"rc\",\"d\":1,\"s\":{\"a\":0,\"k\":[4,11.973]},\"p\":{\"a\":0,\"k\":[0,0]},\"r\":{\"a\":0,\"k\":0},\"nm\":\"矩形路径 1\",\"mn\":\"ADBE Vector Shape - Rect\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.8,0.8,0.8,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"描边 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"填充 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-287.518,114.684],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"矩形 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":0,\"op\":48,\"st\":0,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\"形状图层 3\",\"ks\":{\"o\":{\"a\":0,\"k\":100},\"r\":{\"a\":0,\"k\":0},\"p\":{\"a\":0,\"k\":[12.126,22.14,0]},\"a\":{\"a\":0,\"k\":[-287.393,120.67,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667,0.667,0.667],\"y\":[0.667,1,0.667]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0.333,0,0.333]},\"n\":[\"0p667_0p667_0p333_0p333\",\"0p667_1_0p333_0\",\"0p667_0p667_0p333_0p333\"],\"t\":0,\"s\":[100,167.336,100],\"e\":[100,113.336,100]},{\"i\":{\"x\":[0.667,0.667,0.667],\"y\":[0.667,1,0.667]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0.333,0,0.333]},\"n\":[\"0p667_0p667_0p333_0p333\",\"0p667_1_0p333_0\",\"0p667_0p667_0p333_0p333\"],\"t\":9,\"s\":[100,113.336,100],\"e\":[100,164.336,100]},{\"i\":{\"x\":[0.667,0.667,0.667],\"y\":[0.667,1,0.667]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0.333,0,0.333]},\"n\":[\"0p667_0p667_0p333_0p333\",\"0p667_1_0p333_0\",\"0p667_0p667_0p333_0p333\"],\"t\":19,\"s\":[100,164.336,100],\"e\":[100,46.336,100]},{\"i\":{\"x\":[0.667,0.667,0.667],\"y\":[0.667,1,0.667]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0.333,0,0.333]},\"n\":[\"0p667_0p667_0p333_0p333\",\"0p667_1_0p333_0\",\"0p667_0p667_0p333_0p333\"],\"t\":34,\"s\":[100,46.336,100],\"e\":[100,167.336,100]},{\"t\":48}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"rc\",\"d\":1,\"s\":{\"a\":0,\"k\":[4,11.973]},\"p\":{\"a\":0,\"k\":[0,0]},\"r\":{\"a\":0,\"k\":0},\"nm\":\"矩形路径 1\",\"mn\":\"ADBE Vector Shape - Rect\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.8,0.8,0.8,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"描边 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"填充 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-287.518,114.684],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"矩形 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":0,\"op\":48,\"st\":0,\"bm\":0,\"sr\":1},{\"ddd\":0,\"ind\":3,\"ty\":4,\"nm\":\"形状图层 2\",\"ks\":{\"o\":{\"a\":0,\"k\":100},\"r\":{\"a\":0,\"k\":0},\"p\":{\"a\":0,\"k\":[4.064,22.14,0]},\"a\":{\"a\":0,\"k\":[-287.393,120.67,0]},\"s\":{\"a\":1,\"k\":[{\"i\":{\"x\":[0.667,0.667,0.667],\"y\":[1,0.693,0.667]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,0,0.333]},\"n\":[\"0p667_1_0p333_0\",\"0p667_0p693_0p333_0\",\"0p667_0p667_0p333_0p333\"],\"t\":0,\"s\":[100,98.434,100],\"e\":[100,127.099,100]},{\"i\":{\"x\":[0.667,0.667,0.667],\"y\":[1,1,0.667]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0,-0.143,0.333]},\"n\":[\"0p667_1_0p333_0\",\"0p667_1_0p333_-0p143\",\"0p667_0p667_0p333_0p333\"],\"t\":10,\"s\":[100,127.099,100],\"e\":[100,47.434,100]},{\"i\":{\"x\":[0.667,0.667,0.667],\"y\":[0.667,1,0.667]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0.333,0,0.333]},\"n\":[\"0p667_0p667_0p333_0p333\",\"0p667_1_0p333_0\",\"0p667_0p667_0p333_0p333\"],\"t\":23,\"s\":[100,47.434,100],\"e\":[100,143.434,100]},{\"i\":{\"x\":[0.667,0.667,0.667],\"y\":[0.667,1,0.667]},\"o\":{\"x\":[0.333,0.333,0.333],\"y\":[0.333,0,0.333]},\"n\":[\"0p667_0p667_0p333_0p333\",\"0p667_1_0p333_0\",\"0p667_0p667_0p333_0p333\"],\"t\":35,\"s\":[100,143.434,100],\"e\":[100,98.434,100]},{\"t\":48}]}},\"ao\":0,\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ty\":\"rc\",\"d\":1,\"s\":{\"a\":0,\"k\":[4,11.973]},\"p\":{\"a\":0,\"k\":[0,0]},\"r\":{\"a\":0,\"k\":0},\"nm\":\"矩形路径 1\",\"mn\":\"ADBE Vector Shape - Rect\"},{\"ty\":\"st\",\"c\":{\"a\":0,\"k\":[0.8,0.8,0.8,1]},\"o\":{\"a\":0,\"k\":100},\"w\":{\"a\":0,\"k\":0},\"lc\":1,\"lj\":1,\"ml\":4,\"nm\":\"描边 1\",\"mn\":\"ADBE Vector Graphic - Stroke\"},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[1,1,1,1]},\"o\":{\"a\":0,\"k\":100},\"r\":1,\"nm\":\"填充 1\",\"mn\":\"ADBE Vector Graphic - Fill\"},{\"ty\":\"tr\",\"p\":{\"a\":0,\"k\":[-287.518,114.684],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100],\"ix\":3},\"r\":{\"a\":0,\"k\":0,\"ix\":6},\"o\":{\"a\":0,\"k\":100,\"ix\":7},\"sk\":{\"a\":0,\"k\":0,\"ix\":4},\"sa\":{\"a\":0,\"k\":0,\"ix\":5},\"nm\":\"变换\"}],\"nm\":\"矩形 1\",\"np\":3,\"cix\":2,\"ix\":1,\"mn\":\"ADBE Vector Group\"}],\"ip\":0,\"op\":48,\"st\":0,\"bm\":0,\"sr\":1}]}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_infohide.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_infohide@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_infoshow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_infoshow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_music_added.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_music_added@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_music_cloud.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_music_cloud@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_music_palying.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_music_palying@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_music_pc.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_music_pc@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_mute.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_mute@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_position.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_position@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_profile_time.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_profile_time@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_ranking_down.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_ranking_down@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_ranking_keep.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_ranking_keep@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_ranking_new.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_ranking_new@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_ranking_top1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_ranking_top1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_ranking_top2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_ranking_top2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_ranking_top3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_ranking_top3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_ranking_up.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_ranking_up@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_sex_female.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_sex_female@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_sex_male.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_sex_male@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_sex_unknown.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_sex_unknown@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_sound_awkward.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_sound_awkward@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_sound_crow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_sound_crow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_sound_handclap.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_sound_handclap@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_sound_laugh.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_sound_laugh@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_sound_love.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_sound_love@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_sound_nice.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_sound_nice@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_sound_thumbdown.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_sound_thumbdown@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_sound_train.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_sound_train@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_total.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_total@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_v.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_v@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_ic_warning.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_ic_warning@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_anchor.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_anchor@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_avatar_ting.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_avatar_ting@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_cover.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_cover@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_default.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_default@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_end_list.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_end_list@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_home_status_onliving.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_home_status_onliving@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_home_topanchor.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_home_topanchor@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_honor_highlight.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_honor_highlight@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_line.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_line@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_live_list.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_live_list@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_loading.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_loading@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_loading2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_loading2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_nav_default.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_nav_default@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_no_chatgroup.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_no_chatgroup@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_offline.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_offline@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_redpacket.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_redpacket@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_redpacket_send.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_redpacket_send@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_replay_list.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_replay_list@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_right1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_right1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_right2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_right2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_right3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_right3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_status_onair.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_status_onair@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_status_onair_red.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_status_onair_red@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_status_soon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_status_soon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_status_trailer.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_status_trailer@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_streamend.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_streamend@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_texture.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_texture@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_texture_line.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_texture_line@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_tips_addmusic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_tips_addmusic@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_tips_group.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_tips_group@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_tips_liveinfo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_tips_liveinfo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_tips_music.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_tips_music@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_trailer_list.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_trailer_list@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_img_wealth_basic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_img_wealth_basic@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_menu_admin.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_menu_admin@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_menu_adminlist.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_menu_adminlist@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_menu_delete.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_menu_delete@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_menu_end.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_menu_end@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_menu_feedback.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_menu_feedback@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_menu_headphone.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_menu_headphone@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_menu_info.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_menu_info@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_menu_livelist.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_menu_livelist@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_menu_mute.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_menu_mute@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_menu_notice.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_menu_notice@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_menu_share.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_menu_share@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/live_radio_playing_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"live_radio_playing_bg.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": "RxXMLY/Assets.xcassets/icon_XMLY/local_play_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"local_play_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/log.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"log.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": "RxXMLY/Assets.xcassets/icon_XMLY/logicon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"logicon.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": "RxXMLY/Assets.xcassets/icon_XMLY/login_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"login_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/login_img_door.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"login_img_door@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/login_or.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"login_or@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/logo_laya.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"logo_laya@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/logo_recommend.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"logo_recommend@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/logo_xima.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"logo_xima@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/lostLottory.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"lostLottory@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/lottoryBgBlue.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"lottoryBgBlue@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/lottoryBgRed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"lottoryBgRed@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/lottoryBgWhite.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"lottoryBgWhite@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/lottoryBgYellow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"lottoryBgYellow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/lottoryExpired.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"lottoryExpired@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/lottoryIcon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"lottoryIcon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/luna_wps.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"luna_wps@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/mainLogo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"mainLogo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/mainLogo_MINI.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"mainLogo_MINI@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/mark_title.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"mark_title@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/meArrow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"meArrow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/meBg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"meBg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/meBought.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"meBought@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/meLine.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"meLine@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/meMesHL.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"meMesHL@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/meMesNor.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"meMesNor@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/meRecord.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"meRecord@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/meSetHL.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"meSetHL@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/meSetNor.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"meSetNor@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/meSoundEdit_topView_browser_default.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"meSoundEdit_topView_browser_default@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/meSoundEdit_topView_default.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"meSoundEdit_topView_default@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/meTicket.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"meTicket@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/meWallet.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"meWallet@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/meXB.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"meXB@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_album_delete.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_album_delete@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_album_edit.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_album_edit@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_celllogo_email.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_celllogo_email@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_celllogo_email_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_celllogo_email_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_celllogo_phone.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_celllogo_phone@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_celllogo_phone_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_celllogo_phone_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_celllogo_qq.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_celllogo_qq@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_celllogo_qq_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_celllogo_qq_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_celllogo_renren.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_celllogo_renren@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_celllogo_renren_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_celllogo_renren_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_celllogo_sina.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_celllogo_sina@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_celllogo_sina_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_celllogo_sina_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_celllogo_wechat.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_celllogo_wechat@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_celllogo_wechat_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_celllogo_wechat_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_fans_verifylogo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_fans_verifylogo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_more_delete.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_more_delete@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_more_download.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_more_download@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_more_edit.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_more_edit@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_more_replace.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_more_replace@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_my_device.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_my_device@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_new_sound.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_new_sound@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_relate_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_relate_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_CPS.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_CPS@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_account.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_account@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_achievement.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_achievement@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_anchor.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_anchor@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_beAnchor.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_beAnchor@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_boughttracks.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_boughttracks@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_clock.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_clock@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_college.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_college@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_comment.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_comment@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_contact.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_contact@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_coupon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_coupon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_device.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_device@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_favAlbum.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_favAlbum@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_feedback.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_feedback@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_findting.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_findting@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_game.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_game@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_identify.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_identify@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_liked.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_liked@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_more.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_more@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_myorder.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_myorder@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_nightmode.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_nightmode@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_notice_center.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_notice_center@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_playhis.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_playhis@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_plus.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_plus@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_points.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_points@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_program.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_program@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_refunds.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_refunds@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_setting.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_setting@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_sixin.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_sixin@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_social.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_social@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_store.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_store@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_union.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_union@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_usercenter.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_usercenter@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_zone.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_zone@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_setting_zonemsg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_setting_zonemsg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/me_unbindPhone.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"me_unbindPhone@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/messageCenter_icon_sixin_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"messageCenter_icon_sixin_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/message_icon_setting.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"message_icon_setting@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/message_icon_silence.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"message_icon_silence@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/message_no_history.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"message_no_history@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/metal_insert.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"metal_insert.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": "RxXMLY/Assets.xcassets/icon_XMLY/mini_lock_line.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"mini_lock_line@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/mini_lockbg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"mini_lockbg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/mini_skip_normal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"mini_skip_normal@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/mini_skip_pressed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"mini_skip_pressed@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/moreBriefBtn_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"moreBriefBtn_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/moreBriefBtn_s.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"moreBriefBtn_s@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/moreBrief_triangle.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"moreBrief_triangle@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/moreBtnFree.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"moreBtnFree@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/moreBtnMask.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"moreBtnMask@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/moreBtnPay.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"moreBtnPay@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/moreViewPrivateTalk.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"moreViewPrivateTalk@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/moreViewReplay.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"moreViewReplay@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/moreViewTop.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"moreViewTop@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/msgAuditInreview.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"msgAuditInreview@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/msgAuditReject.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"msgAuditReject@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/msuicheting.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"msuicheting@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/musicPersonImage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"musicPersonImage@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/myCenterFilterNormal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"myCenterFilterNormal@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/myCenterFilterSelected.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"myCenterFilterSelected@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/myCenterNoAlbum.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"myCenterNoAlbum@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/myCenterNoCmt.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"myCenterNoCmt@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/myCenterPayAlbumComment.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"myCenterPayAlbumComment@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/myCenterQA.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"myCenterQA@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/myCenterSortIconNormal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"myCenterSortIconNormal@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/myCenterSortIconSelected.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"myCenterSortIconSelected@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/myCenterSortSelected.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"myCenterSortSelected@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/my_bg_wdl.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"my_bg_wdl.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": "RxXMLY/Assets.xcassets/icon_XMLY/my_ic_feedback.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"my_ic_feedback@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/my_ic_more.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"my_ic_more@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/navidrop_arrow_down_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"navidrop_arrow_down_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/navidrop_arrow_down_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"navidrop_arrow_down_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/navidrop_arrow_up_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"navidrop_arrow_up_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/navidrop_arrow_up_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"navidrop_arrow_up_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/navidrop_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"navidrop_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/navigation_line.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"navigation_line@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/navigationbar_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"navigationbar_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/navigationbar_bg_64.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"navigationbar_bg_64@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/networkhelp.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"networkhelp.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": "RxXMLY/Assets.xcassets/icon_XMLY/newAlbum_AD_cover_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"newAlbum_AD_cover_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/newAlbum_AD_split.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"newAlbum_AD_split@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/newAlbum_VIP_mark.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"newAlbum_VIP_mark@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/newAlbum_comment_btn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"newAlbum_comment_btn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/newAlbum_commet_defualt_user.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"newAlbum_commet_defualt_user@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/newAlbum_cover_free.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"newAlbum_cover_free@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/newAlbum_cover_free_320.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"newAlbum_cover_free_320@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/newAlbum_cover_payment.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"newAlbum_cover_payment@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/newAlbum_cover_payment_320.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"newAlbum_cover_payment_320@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/newAlbum_empt_star.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"newAlbum_empt_star@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/newAlbum_end.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"newAlbum_end@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/newAlbum_free_downloadw.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"newAlbum_free_downloadw@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/newAlbum_full_star.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"newAlbum_full_star@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/newAlbum_half_star.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"newAlbum_half_star@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/newAlbum_intro_back.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"newAlbum_intro_back@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/newAlbum_lastplay_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"newAlbum_lastplay_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/newAlbum_pay_rss.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"newAlbum_pay_rss@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/newAlbum_pay_rss_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"newAlbum_pay_rss_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/newAlbum_pay_rssed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"newAlbum_pay_rssed@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/newAlbum_pay_rssed_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"newAlbum_pay_rssed_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/newAlbum_pay_shop.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"newAlbum_pay_shop@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/newAlbum_pay_shop_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"newAlbum_pay_shop_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/newAlbum_scroll_bottom.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"newAlbum_scroll_bottom@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/newAlbum_scroll_bottom_hight.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"newAlbum_scroll_bottom_hight@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/newUserMask.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"newUserMask@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/new_album_playCount.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"new_album_playCount@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/nextStep.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"nextStep@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/next_arrow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"next_arrow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/noCopyright.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"noCopyright@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/noDataCell.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"noDataCell@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/noData_VIP.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"noData_VIP@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/noData_consume.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"noData_consume@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/noData_freeting.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"noData_freeting@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/noData_recharge.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"noData_recharge@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/noData_subscription2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"noData_subscription2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/noData_zone_receive.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"noData_zone_receive@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/noMoreCmt.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"noMoreCmt@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/noSearchData.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"noSearchData@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/no_device.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"no_device@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/no_network.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"no_network@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/noread_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"noread_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/notShowPwd.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"notShowPwd@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/now_playing.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"now_playing.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": "RxXMLY/Assets.xcassets/icon_XMLY/npCoverMask.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"npCoverMask@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/npTabSponsor.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"npTabSponsor@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_QACmt.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_QACmt@2X.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_artistheader_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_artistheader_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_comment_btn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_comment_btn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_commentsummary_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_commentsummary_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_danmu_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_danmu_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_danmu_logo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_danmu_logo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_emoticon_delete_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_emoticon_delete_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_face_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_face_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_face_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_face_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_headview_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_headview_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_headview_bg_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_headview_bg_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_headview_following_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_headview_following_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_headview_nofollow_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_headview_nofollow_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_image_complete.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_image_complete@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_image_origin.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_image_origin@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_image_save.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_image_save@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_image_share.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_image_share@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_input_back_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_input_back_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_input_back_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_input_back_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_input_danmu.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_input_danmu@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_input_keyboard_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_input_keyboard_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_input_keyboard_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_input_keyboard_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_input_logo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_input_logo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_input_text_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_input_text_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_like_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_like_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_like_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_like_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_line.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_line@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_loading.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_loading@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_loading_failed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_loading_failed@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_loading_fresh.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_loading_fresh@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_logo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_logo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_lover_mark.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_lover_mark@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_loverheader_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_loverheader_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_lovers_count_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_lovers_count_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_lovers_count_shadow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_lovers_count_shadow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_loverview_arraw.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_loverview_arraw@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_menu_playlist.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_menu_playlist@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_more_album.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_more_album@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_more_down.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_more_down@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_more_history.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_more_history@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_more_public.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_more_public@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_more_replay.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_more_replay@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_more_report.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_more_report@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_more_share.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_more_share@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_more_sleep.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_more_sleep@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_more_wakeup.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_more_wakeup@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_more_wifi.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_more_wifi@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_pageicon3_1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_pageicon3_1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_pageicon3_2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_pageicon3_2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_pageicon3_3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_pageicon3_3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_pageicon_1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_pageicon_1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_pageicon_2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_pageicon_2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_pic_shadow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_pic_shadow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_picmask.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_picmask@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_playlist_cycle.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_playlist_cycle@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_playlist_order.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_playlist_order@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_playlist_outorder.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_playlist_outorder@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_playlist_reverse_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_playlist_reverse_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_playlist_single.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_playlist_single@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_playlist_sort_def.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_playlist_sort_def@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_playlist_sort_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_playlist_sort_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_playlist_sound_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_playlist_sound_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_playlist_sound_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_playlist_sound_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_pop_ds.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_pop_ds@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_pop_home.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_pop_home@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_pop_sixin.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_pop_sixin@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_pop_tiwen.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_pop_tiwen@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_sound_playtimes.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_sound_playtimes@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_sound_playtimes_b.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_sound_playtimes_b@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_toolbar_back_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_toolbar_back_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_toolbar_back_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_toolbar_back_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_toolbar_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_toolbar_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_toolbar_chatGroup.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_toolbar_chatGroup@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_toolbar_clock_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_toolbar_clock_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_toolbar_clock_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_toolbar_clock_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_toolbar_cm_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_toolbar_cm_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_toolbar_comment.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_toolbar_comment@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_toolbar_comment_none.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_toolbar_comment_none@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_toolbar_dm_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_toolbar_dm_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_toolbar_download_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_toolbar_download_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_toolbar_download_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_toolbar_download_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_toolbar_gift.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_toolbar_gift@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_toolbar_like_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_toolbar_like_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_toolbar_like_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_toolbar_like_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_toolbar_likenum_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_toolbar_likenum_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_toolbar_likenum_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_toolbar_likenum_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_toolbar_likenum_nv.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_toolbar_likenum_nv@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_toolbar_more_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_toolbar_more_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_toolbar_red.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_toolbar_red@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_toolbar_share_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_toolbar_share_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_toolbar_share_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_toolbar_share_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/np_user_more.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"np_user_more@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/o_bingun.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_bingun.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_bingun@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/o_dangao.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_dangao.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_dangao@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/o_dianying.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_dianying.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_dianying@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/o_fahongbao.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_fahongbao.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_fahongbao@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/o_feiji.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_feiji.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_feiji@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/o_fengshan.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_fengshan.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_fengshan@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/o_ganbei.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_ganbei.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_ganbei@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/o_hongsidai.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_hongsidai.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_hongsidai@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/o_huatong.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_huatong.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_huatong@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/o_kafei.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_kafei.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_kafei@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/o_lazhu.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_lazhu.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_lazhu@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/o_liwu.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_liwu.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_liwu@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/o_lvsidai.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_lvsidai.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_lvsidai@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/o_qiche.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_qiche.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_qiche@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/o_shixi.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_shixi.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_shixi@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/o_shouji.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_shouji.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_shouji@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/o_shoutao.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_shoutao.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_shoutao@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/o_weibo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_weibo.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_weibo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/o_weiguan.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_weiguan.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_weiguan@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/o_wennuanmaozi.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_wennuanmaozi.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_wennuanmaozi@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/o_xigua.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_xigua.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_xigua@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/o_yinyue.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_yinyue.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_yinyue@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/o_zhaoxiangji.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_zhaoxiangji.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_zhaoxiangji@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/o_zhong.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_zhong.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_zhong@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/o_zixingche.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_zixingche.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_zixingche@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/o_zuqiu.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_zuqiu.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"o_zuqiu@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/oauth_check.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"oauth_check@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/oauth_switch.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"oauth_switch@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/oauth_uncheck.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"oauth_uncheck@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/other_info_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"other_info_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/other_info_close.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"other_info_close@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paid_rec_activity_1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paid_rec_activity_1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paid_rec_activity_2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paid_rec_activity_2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paid_rec_album_border.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paid_rec_album_border@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paid_rec_album_cover.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paid_rec_album_cover@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paid_rec_album_high.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paid_rec_album_high@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paid_rec_album_rate.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paid_rec_album_rate@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paused.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paused@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_album_bottom.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_album_bottom@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_album_left.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_album_left@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_album_right.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_album_right@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_albumheader_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_albumheader_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_arrow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_arrow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_arrow_ic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_arrow_ic@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_arrow_up.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_arrow_up@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_audition.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_audition@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_banner.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_banner@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_box.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_box@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_boxselect.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_boxselect@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_btn_top.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_btn_top@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_btn_unfold.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_btn_unfold@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_bubble_ad_adorn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_bubble_ad_adorn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_bubble_ad_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_bubble_ad_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_button_bkg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_button_bkg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_close.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_close@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_coupon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_coupon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_coupon_empty.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_coupon_empty@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_coupon_more.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_coupon_more@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_coupon_nor.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_coupon_nor@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_cown.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_cown@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_device_btnbg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_device_btnbg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_dialoge.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_dialoge@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_downloadfail.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_downloadfail@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_explain.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_explain@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_fail.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_fail@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_fold_more_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_fold_more_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_gift_tips.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_gift_tips@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_giftarrow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_giftarrow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_iap_finish.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_iap_finish@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_iap_refresh.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_iap_refresh@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_img_line.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_img_line@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_intro.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_intro@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_ipa_tooth.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_ipa_tooth@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_loading.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_loading@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_mask_image.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_mask_image.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": "RxXMLY/Assets.xcassets/icon_XMLY/pay_nocomment.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_nocomment@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_nofreetrack.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_nofreetrack@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_nonewtrack.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_nonewtrack@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_outline_sound.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_outline_sound@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_outline_time.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_outline_time@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_play_icon_p1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_play_icon_p1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_play_icon_p2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_play_icon_p2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_play_icon_p3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_play_icon_p3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_red_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_red_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_redgift_empty.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_redgift_empty@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_redgift_share_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_redgift_share_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_refund.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_refund@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_refund_nor.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_refund_nor@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_restore.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_restore@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_state_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_state_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_success.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_success@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_success_big.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_success_big@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_tracksample.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_tracksample@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_trailer.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_trailer@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_unfolded_arrow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_unfolded_arrow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_uptop.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_uptop@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_vip.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_vip@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_vip_nor.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_vip_nor@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_warning.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_warning@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pay_wechart.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pay_wechart@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paycmt_addimage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paycmt_addimage@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paycmt_allstar.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paycmt_allstar@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paycmt_checkinfo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paycmt_checkinfo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paycmt_delcmt.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paycmt_delcmt@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paycmt_halfstar.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paycmt_halfstar@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paycmt_host.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paycmt_host@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paycmt_hosttriangle.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paycmt_hosttriangle@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paycmt_like.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paycmt_like@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paycmt_liked.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paycmt_liked@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paycmt_more.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paycmt_more@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paycmt_moreimg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paycmt_moreimg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paycmt_qq.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paycmt_qq@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paycmt_reply.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paycmt_reply@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paycmt_score_default.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paycmt_score_default@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paycmt_smile.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paycmt_smile@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paycmt_star.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paycmt_star@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paycmt_star_default.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paycmt_star_default@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paycmt_star_light.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paycmt_star_light@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paycmt_success.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paycmt_success@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paycmt_unhappy.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paycmt_unhappy@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paycmt_wechat.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paycmt_wechat@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paycmt_wechatf.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paycmt_wechatf@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/paycmt_write.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"paycmt_write@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/payment_mark_select.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"payment_mark_select@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/payment_mark_unselect.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"payment_mark_unselect@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/persentQQ.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"persentQQ@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/persentWechat.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"persentWechat@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_baiyang_b.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_baiyang_b@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_baiyang_w.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_baiyang_w@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_chunv_b.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_chunv_b@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_chunv_w.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_chunv_w@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_female_b.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_female_b@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_female_w.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_female_w@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_jinniu_b.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_jinniu_b@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_jinniu_w.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_jinniu_w@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_juxie_b.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_juxie_b@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_juxie_w.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_juxie_w@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_male_b.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_male_b@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_male_w.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_male_w@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_mojie_b.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_mojie_b@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_mojie_w.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_mojie_w@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_region_b.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_region_b@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_region_w.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_region_w@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_sheshou_b.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_sheshou_b@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_sheshou_w.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_sheshou_w@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_shizi_b.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_shizi_b@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_shizi_w.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_shizi_w@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_shuangyu_b.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_shuangyu_b@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_shuangyu_w.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_shuangyu_w@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_shuangzi_b.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_shuangzi_b@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_shuangzi_w.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_shuangzi_w@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_shuiping_b.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_shuiping_b@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_shuiping_w.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_shuiping_w@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_tiancheng_b.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_tiancheng_b@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_tiancheng_w.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_tiancheng_w@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_tianxie_b.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_tianxie_b@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/personal_tianxie_w.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"personal_tianxie_w@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/placeHolder.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"placeHolder.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": "RxXMLY/Assets.xcassets/icon_XMLY/playCoverBtn_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playCoverBtn_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playCoverBtn_s.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playCoverBtn_s@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playProcessBar.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playProcessBar@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playProcessBg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playProcessBg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playProcessCe.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playProcessCe@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playProcessDot_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playProcessDot_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playProcessPc.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playProcessPc@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playTimeBg_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playTimeBg_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playTimeBg_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playTimeBg_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/play_album_fav_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"play_album_fav_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/play_album_unfav_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"play_album_unfav_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/play_fast_back.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"play_fast_back@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/play_fast_forword.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"play_fast_forword@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/play_flag_wave_0.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"play_flag_wave_0@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/play_flag_wave_1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"play_flag_wave_1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/play_flag_wave_2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"play_flag_wave_2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/play_removead_ic_before.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"play_removead_ic_before@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/player_btn_comment.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"player_btn_comment@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/player_btn_fullsize.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"player_btn_fullsize.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": "RxXMLY/Assets.xcassets/icon_XMLY/player_popup_bg_shadow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"player_popup_bg_shadow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/player_popup_icon_indicator.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"player_popup_icon_indicator@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/player_popup_icon_x.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"player_popup_icon_x@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/player_popup_img_head.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"player_popup_img_head@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/player_popup_img_light.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"player_popup_img_light@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/player_popup_text_top1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"player_popup_text_top1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/player_popup_text_top2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"player_popup_text_top2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/player_popup_text_top3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"player_popup_text_top3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/player_popup_text_zzcg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"player_popup_text_zzcg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/player_popup_top1_bg_shadow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"player_popup_top1_bg_shadow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/player_popup_top1_img_head.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"player_popup_top1_img_head@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/player_popup_top1_img_light.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"player_popup_top1_img_light@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/player_popup_top2_bg_shadow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"player_popup_top2_bg_shadow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/player_popup_top2_img_head.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"player_popup_top2_img_head@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/player_popup_top2_img_light.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"player_popup_top2_img_light@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/player_popup_top3_bg_shadow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"player_popup_top3_bg_shadow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/player_popup_top3_img_head.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"player_popup_top3_img_head@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/player_popup_top3_img_light.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"player_popup_top3_img_light@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/player_vipad_arrow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"player_vipad_arrow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playing_tips_finger.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playing_tips_finger@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playing_tips_text.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playing_tips_text@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playingalbum_fav.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playingalbum_fav@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playingalbum_fav_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playingalbum_fav_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playingback.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playingback@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playingback_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playingback_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_bg_pop.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_bg_pop@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_bg_title.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_bg_title@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_+15s_normal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_+15s_normal@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_+15s_pressed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_+15s_pressed@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_-15s_normal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_-15s_normal@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_-15s_pressed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_-15s_pressed@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_2x_normal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_2x_normal@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_2x_pressed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_2x_pressed@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_barrage_normal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_barrage_normal@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_barrage_pressed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_barrage_pressed@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_comment_normal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_comment_normal@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_comment_pressed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_comment_pressed@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_down_black.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_down_black@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_down_white.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_down_white@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_down_white_HL.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_down_white_HL@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_download_normal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_download_normal@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_download_pressed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_download_pressed@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_dynamic_rhythm_p1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_dynamic_rhythm_p1.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": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_dynamic_rhythm_p2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_dynamic_rhythm_p2.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": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_dynamic_rhythm_p3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_dynamic_rhythm_p3.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": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_like_normal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_like_normal@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_like_pressed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_like_pressed@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_list.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_list@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_more_black.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_more_black@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_more_vertical.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_more_vertical@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_more_white.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_more_white@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_more_white_HL.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_more_white_HL@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_play.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_play@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_share_black.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_share_black@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_share_white.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_share_white@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_share_white_HL.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_share_white_HL@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_soundInfo_black.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_soundInfo_black@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_soundInfo_white.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_soundInfo_white@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_soundVideo_black.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_soundVideo_black@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_soundVideo_white.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_soundVideo_white@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_suspend.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_suspend@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/playpage_icon_timing.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"playpage_icon_timing@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/plu_fav.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"plu_fav@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/plu_header.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"plu_header@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/plu_logo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"plu_logo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/plu_mdev.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"plu_mdev@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/plu_medv_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"plu_medv_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pluto.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pluto@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/plutoMessage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"plutoMessage@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/plutoUpdate.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"plutoUpdate@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pluto_logo_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pluto_logo_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pluto_ring.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pluto_ring@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pop.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pop@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pop_bottom.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pop_bottom@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pop_sound_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pop_sound_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pop_sound_category_bottom.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pop_sound_category_bottom@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pop_sound_category_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pop_sound_category_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pop_sound_category_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pop_sound_category_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pop_sound_category_top.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pop_sound_category_top@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pop_sound_tag_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pop_sound_tag_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pop_sound_tag_bottom.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pop_sound_tag_bottom@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pop_sound_tag_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pop_sound_tag_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pop_sound_tag_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pop_sound_tag_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pop_sound_tag_top.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pop_sound_tag_top@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pop_top.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pop_top@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/popicon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"popicon.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": "RxXMLY/Assets.xcassets/icon_XMLY/popicon_history.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"popicon_history@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/popicon_local.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"popicon_local@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/popicon_play.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"popicon_play@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/popupCoupon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"popupCoupon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/post_comment_line.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"post_comment_line@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/presentAlbumBack.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"presentAlbumBack@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/presentAlbum_change.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"presentAlbum_change@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/presentBuySuccess.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"presentBuySuccess@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/presentHolder.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"presentHolder@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/presentMinus.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"presentMinus@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/presentMinusOrange.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"presentMinusOrange@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/presentNotEnough.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"presentNotEnough@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/presentPlus.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"presentPlus@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/presentPlusOrange.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"presentPlusOrange@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/presentbg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"presentbg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/previous_arrow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"previous_arrow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/profile_ic_Aplus.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"profile_ic_Aplus@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/profile_ic_Q&A.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"profile_ic_Q&A@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/profile_ic_Q&A_dis.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"profile_ic_Q&A_dis@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/profile_ic_fans.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"profile_ic_fans@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/profile_ic_group.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"profile_ic_group@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/profile_ic_moneprofile_ic_refund.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"profile_ic_moneprofile_ic_refund@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/profile_ic_money.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"profile_ic_money@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/profile_ic_money_dis.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"profile_ic_money_dis@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/profile_ic_nor.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"profile_ic_nor@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/profile_ic_sel.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"profile_ic_sel@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/profile_ic_share.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"profile_ic_share@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/profile_ic_star.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"profile_ic_star@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/profile_ic_topfans.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"profile_ic_topfans@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/promotelogo_dark.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"promotelogo_dark@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/promotelogo_light.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"promotelogo_light@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/promptBanner.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"promptBanner@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/promptNavi.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"promptNavi@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/pull_to_refresh_arrow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"pull_to_refresh_arrow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/purchased_bg_nocontent.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"purchased_bg_nocontent@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/purchased_ic_more.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"purchased_ic_more@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/push_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"push_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/push_close.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"push_close@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/push_open.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"push_open@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/quiet.dataset/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"data\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"quiet.caf\"\n    }\n  ]\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rank_tags_pickup.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rank_tags_pickup@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/reading_cat.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"reading_cat@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/reading_tips2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"reading_tips2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rebuy.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rebuy@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_bg_audio.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_bg_audio@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_bg_music.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_bg_music@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_bg_music2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_bg_music2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_bg_screen3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_bg_screen3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_bgimg_album.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_bgimg_album@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_bgimg_voice.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_bgimg_voice@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_btn_back.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_btn_back@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_btn_cancel.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_btn_cancel@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_btn_clip.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_btn_clip@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_btn_clip_control.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_btn_clip_control@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_btn_fontsize.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_btn_fontsize@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_btn_mic_off.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_btn_mic_off@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_btn_mic_on.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_btn_mic_on@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_btn_music_off.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_btn_music_off@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_btn_music_on.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_btn_music_on@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_btn_music_pause.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_btn_music_pause@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_btn_music_play.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_btn_music_play@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_btn_music_replace.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_btn_music_replace@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_btn_preview.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_btn_preview@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_btn_preview_control.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_btn_preview_control@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_btn_preview_control2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_btn_preview_control2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_btn_preview_pause.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_btn_preview_pause@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_btn_preview_play.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_btn_preview_play@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_btn_retry.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_btn_retry@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_btn_save.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_btn_save@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_btn_vol.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_btn_vol@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_btn_volcontrol.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_btn_volcontrol@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_dashed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_dashed@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_ic_mic_off.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_ic_mic_off@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_ic_mic_on.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_ic_mic_on@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_ic_music_add.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_ic_music_add@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_ic_music_off.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_ic_music_off@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_ic_music_on.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_ic_music_on@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_ic_tingyou_nor.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_ic_tingyou_nor@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_ic_tingyou_sel.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_ic_tingyou_sel@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_ic_vol.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_ic_vol@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_img_logo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_img_logo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_img_read1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_img_read1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_img_read2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_img_read2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_img_recoff.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_img_recoff@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_img_recon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_img_recon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_img_tips.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_img_tips@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_img_tips2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_img_tips2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_img_tips3.1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_img_tips3.1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_img_tips3.2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_img_tips3.2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_img_tips3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_img_tips3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_sd_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_sd_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_sd_img_highlight.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_sd_img_highlight@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rec_sd_img_light.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rec_sd_img_light@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/recommedDefault.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"recommedDefault@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/recommendlogo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"recommendlogo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/record_album_add.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"record_album_add@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/record_cancel_btn_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"record_cancel_btn_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/record_cancel_btn_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"record_cancel_btn_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/record_code_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"record_code_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/record_code_top_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"record_code_top_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/record_mark_check.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"record_mark_check@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/record_ok_btn_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"record_ok_btn_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/record_ok_btn_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"record_ok_btn_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/record_over.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"record_over.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": "RxXMLY/Assets.xcassets/icon_XMLY/record_photo_add.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"record_photo_add@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/record_share_tingfriend.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"record_share_tingfriend@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/record_share_tingfriend_hl.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"record_share_tingfriend_hl@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/record_soundReport.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"record_soundReport@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/record_tingfriend.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"record_tingfriend@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/record_tingfriend_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"record_tingfriend_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/refund_ic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"refund_ic@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/refund_ic_adopt.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"refund_ic_adopt@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/refund_ic_fail.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"refund_ic_fail@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/refund_ic_prompt.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"refund_ic_prompt@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/refund_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"refund_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/refund_icon_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"refund_icon_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/refund_tips.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"refund_tips@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/registerAndLogin_code_textField.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"registerAndLogin_code_textField@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/registerAndLogin_confirm_logo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"registerAndLogin_confirm_logo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/registerAndLogin_nickname_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"registerAndLogin_nickname_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/registerAndLogin_nickname_triangleLogo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"registerAndLogin_nickname_triangleLogo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/registerAndLogin_password_hide_textfield.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"registerAndLogin_password_hide_textfield@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/registerAndLogin_password_show_textfield.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"registerAndLogin_password_show_textfield@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/registerAndLogin_password_textField.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"registerAndLogin_password_textField@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/registerAndLogin_qq_button.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"registerAndLogin_qq_button@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/registerAndLogin_user_textField.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"registerAndLogin_user_textField@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/registerAndLogin_wechat_button.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"registerAndLogin_wechat_button@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/registerAndLogin_weibo_button.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"registerAndLogin_weibo_button@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/regview_tab_r.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"regview_tab_r@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/relatealbumtitle.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"relatealbumtitle@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/related_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"related_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/republish.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"republish@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rewardButtonImage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rewardButtonImage@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/reward_bronze.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"reward_bronze@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/reward_gold.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"reward_gold@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/reward_right.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"reward_right@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/reward_silver.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"reward_silver@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rf_pop_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rf_pop_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rock.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rock@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rockIcon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rockIcon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rock_back.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rock_back@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rock_connect.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rock_connect@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rock_small.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rock_small@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/rock_wps.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"rock_wps@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ruler_pause.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ruler_pause@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ruler_play.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ruler_play@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/scanArea.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"scanArea.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": "RxXMLY/Assets.xcassets/icon_XMLY/scanImage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"scanImage.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": "RxXMLY/Assets.xcassets/icon_XMLY/scan_scan.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"scan_scan@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/screen_close.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"screen_close@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/screen_feedback.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"screen_feedback@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/screen_share.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"screen_share@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sct_backhome.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sct_backhome@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sct_settingbtn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sct_settingbtn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sct_step1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sct_step1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sct_step2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sct_step2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sct_step3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sct_step3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sctshare_default.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sctshare_default.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": "RxXMLY/Assets.xcassets/icon_XMLY/search_album_download.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_album_download@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/search_album_downloadw.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_album_downloadw@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/search_album_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_album_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/search_back.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_back@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/search_back_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_back_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/search_bar_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_bar_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/search_btn_hl.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_btn_hl@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/search_btn_nl.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_btn_nl@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/search_btn_norm.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_btn_norm@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/search_category_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_category_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/search_correct_btn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_correct_btn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/search_detail_arrow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_detail_arrow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/search_filter.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_filter@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/search_filter_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_filter_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/search_filter_bg_arrow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_filter_bg_arrow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/search_filter_btn_sel.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_filter_btn_sel.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": "RxXMLY/Assets.xcassets/icon_XMLY/search_filter_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_filter_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/search_header_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_header_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/search_history_close.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_history_close@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/search_intent_category_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_intent_category_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/search_new_mark.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_new_mark@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/search_normal_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_normal_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/search_play.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_play@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/search_play_count.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_play_count.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": "RxXMLY/Assets.xcassets/icon_XMLY/search_tag_hot.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_tag_hot@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/search_tag_recommend.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_tag_recommend@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/search_tags.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_tags@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/search_tags_red.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_tags_red@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/search_textfield_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"search_textfield_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/secret.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"secret@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/seg_category_finish.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"seg_category_finish@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/seg_down.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"seg_down@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/seg_downloaded.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"seg_downloaded@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/seg_filter_down.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"seg_filter_down@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/seg_filter_pulldown_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"seg_filter_pulldown_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/seg_filter_pullup_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"seg_filter_pullup_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/seg_filter_up.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"seg_filter_up@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/seg_mask.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"seg_mask@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/seg_pulldown_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"seg_pulldown_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/seg_pullup_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"seg_pullup_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/seg_selected.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"seg_selected@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/seg_selectedAll.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"seg_selectedAll@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/seg_unselected.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"seg_unselected@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/seg_unselectedAll.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"seg_unselectedAll@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/seg_up.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"seg_up@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/segline.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"segline@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/segmentShadowLine.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"segmentShadowLine@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sendletter_fail_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sendletter_fail_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/setting_bt_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"setting_bt_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/setting_bt_tone.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"setting_bt_tone@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/setting_carmode.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"setting_carmode@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/setting_email.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"setting_email@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/setting_help.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"setting_help@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/setting_line.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"setting_line@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/setting_password.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"setting_password@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/setting_password_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"setting_password_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/setting_phone.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"setting_phone@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/setting_qq.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"setting_qq@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/setting_rate.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"setting_rate@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/setting_renren.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"setting_renren@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/setting_sina.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"setting_sina@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/setting_sm_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"setting_sm_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/setting_wechat.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"setting_wechat@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/shadow_albumView_header.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"shadow_albumView_header@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/shake.dataset/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"data\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"shake.wav\"\n    }\n  ]\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/shakeLottoryNPViewIcon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"shakeLottoryNPViewIcon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/shakeLottoryTipBg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"shakeLottoryTipBg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/share_QRcode.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"share_QRcode@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/share_btn_user.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"share_btn_user@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/share_btn_user_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"share_btn_user_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/share_btn_user_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"share_btn_user_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/share_code_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"share_code_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/share_code_default.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"share_code_default@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/share_code_icon_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"share_code_icon_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/share_code_mask_black.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"share_code_mask_black@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/share_copy.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"share_copy@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/share_default.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"share_default@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/share_group.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"share_group@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/share_html.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"share_html@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/share_loginIV.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"share_loginIV@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/share_qq.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"share_qq@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/share_qq_zone.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"share_qq_zone@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/share_renren.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"share_renren@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/share_save.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"share_save@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/share_sina_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"share_sina_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/share_sms_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"share_sms_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/share_tencent_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"share_tencent_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/share_tingfriend.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"share_tingfriend@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/share_toast_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"share_toast_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/share_triangle.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"share_triangle@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/share_weixin.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"share_weixin@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/share_weixin_friends.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"share_weixin_friends@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sharepop_cancel_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sharepop_cancel_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/shareting.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"shareting.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": "RxXMLY/Assets.xcassets/icon_XMLY/shouhuan.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"shouhuan@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/showPwd.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"showPwd@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/shuke.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"shuke@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/signview_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"signview_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/single_unfollow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"single_unfollow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/slidePath.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"slidePath@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/slide_hand.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"slide_hand@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/small_head_male_default.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"small_head_male_default@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sortTips.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sortTips@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sort_list.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sort_list@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/soundImage_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"soundImage_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/soundLB_info.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"soundLB_info@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/soundLB_video.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"soundLB_video@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_act.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_act@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_act_s.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_act_s@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_album.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_album@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_albumcover.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_albumcover@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_albumcover_large.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_albumcover_large@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_comments.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_comments@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_cover_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_cover_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_default.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_default@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_downloading.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_downloading@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_duration.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_duration@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_failed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_failed@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_feed_more.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_feed_more@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_feed_remove.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_feed_remove@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_feed_sticky.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_feed_sticky@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_feed_sticky_cancel.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_feed_sticky_cancel@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_feed_top.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_feed_top@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_likes.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_likes@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_likes_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_likes_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_lock.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_lock@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_paused.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_paused@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_play.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_play@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_playbtn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_playbtn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_playingbtn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_playingbtn.gif\",\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": "RxXMLY/Assets.xcassets/icon_XMLY/sound_playtimes.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_playtimes@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_processing.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_processing@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_progress_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_progress_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_progress_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_progress_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_repost.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_repost@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_sizes.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_sizes@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_state_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_state_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_tags.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_tags@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_tags_s.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_tags_s@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_uploading.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_uploading@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sound_waiting.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sound_waiting@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/splitLine.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"splitLine@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/splitLine_expired.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"splitLine_expired@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sponsorBtn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sponsorBtn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sponsorBtn4Cell.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sponsorBtn4Cell@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sponsorLogo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sponsorLogo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sponsorMore4Cell.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sponsorMore4Cell@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sponsorTop1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sponsorTop1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sponsorTop2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sponsorTop2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sponsorTop3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sponsorTop3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sr_cell_bg_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sr_cell_bg_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/star-on.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"star-on@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/start_all_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"start_all_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/start_all_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"start_all_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/style.dataset/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"data\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"style.css\"\n    }\n  ]\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/style.dataset/style.css",
    "content": "@charset \"UTF-8\";\nhtml {\n  color: #000;\n  background: #fff;\n  overflow-y: scroll;\n  -webkit-text-size-adjust: none;\n  -ms-text-size-adjust: none; }\n  html * {\n    outline: none;\n    -webkit-text-size-adjust: none;\n    -webkit-tap-highlight-color: transparent; }\n\nhtml, body {\n  font-family: sans-serif; }\n\n/* 内外边距通常让各个浏览器样式的表现位置不同 */\nbody, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, textarea, p, blockquote, th, td, hr, button, article, aside, details, figcaption, figure, footer, header, hgroup, nav, section {\n  margin: 0;\n  padding: 0; }\n\ninput, select, textarea {\n  font-size: 100%; }\n\n/* 去掉各 Table  cell 的边距并让其边重合 */\ntable {\n  border-collapse: collapse;\n  border-spacing: 0; }\n\n/* 去除默认边框 */\nfieldset, img {\n  border: 0; }\n\n/* 去掉 firefox 下此元素的边框 */\nabbr, acronym {\n  border: 0;\n  font-variant: normal; }\n\n/* 一致的 del 样式 */\ndel {\n  text-decoration: line-through; }\n\naddress, caption, cite, code, dfn, em, th, var {\n  font-style: normal;\n  font-weight: 500; }\n\n/* 去掉列表前的标识, li 会继承 */\nol, ul {\n  list-style: none; }\n\n/* 对齐是排版最重要的因素, 别让什么都居中 */\ncaption, th {\n  text-align: left; }\n\n/* 来自 yahoo, 让标题都自定义, 适应多个系统应用 */\nh1, h2, h3, h4, h5, h6 {\n  font-size: 100%;\n  font-weight: 500; }\n\n/* 鼠标悬停 */\na:hover {\n  text-decoration: underline; }\n\n/* 默认不显示下划线，保持页面简洁 */\nbody, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, textarea, p, blockquote, th, td, hr, button, article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {\n  margin: 0;\n  padding: 0; }\n\ninput, select, textarea {\n  font-size: 100%; }\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0; }\n\nfieldset, img {\n  border: 0; }\n\nabbr, acronym {\n  border: 0;\n  font-variant: normal; }\n\ndel {\n  text-decoration: line-through; }\n\naddress, caption, cite, code, dfn, em, th, var {\n  font-style: normal;\n  font-weight: 500; }\n\nol, ul {\n  list-style: none; }\n\ncaption, th {\n  text-align: left; }\n\nh1, h2, h3, h4, h5, h6 {\n  font-size: 100%;\n  font-weight: 500; }\n\nq:before, q:after {\n  content: ''; }\n\nsub, sup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline; }\n\nsup {\n  top: -0.5em; }\n\nsub {\n  bottom: -0.25em; }\n\na:hover {\n  text-decoration: underline; }\n\nins, a {\n  text-decoration: none; }\n\n.mgt-20 {\n  margin-top: 0.53333rem; }\n\n.mgt-15 {\n  margin-top: 0.4rem; }\n\n.mgb-15 {\n  margin-bottom: 0.4rem; }\n\n.mgb-20 {\n  margin-bottom: 0.53333rem; }\n\n.mgb-10 {\n  margin-bottom: 0.26667rem; }\n\n.em {\n  font-weight: bold; }\n\n.clear:after {\n  content: '';\n  display: block;\n  clear: both; }\n\n.clear {\n  zoom: 1; }\n\n.fr {\n  float: right; }\n\n.fl {\n  float: left; }\n\n.ellipsis {\n  overflow-x: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap; }\n\n.c09 {\n  color: #FF744D; }\n\n.j-card {\n  position: relative;\n  padding: 0.48rem;\n  margin-top: 0.29333rem;\n  overflow: hidden;\n  box-sizing: border-box;\n  font-size: 16px;\n  background-color: #fff; }\n  [data-dpr=\"2\"] .j-card {\n    font-size: 32px; }\n  [data-dpr=\"3\"] .j-card {\n    font-size: 48px; }\n  .j-card:first-of-type {\n    margin-top: 0; }\n  .j-card img {\n    width: 100%;\n    display: inline-block; }\n    .j-card img.placeHolder {\n      position: relative;\n      background-color: #cccccc; }\n      .j-card img.placeHolder::after {\n        content: 'XimalayaFM';\n        position: absolute;\n        top: 50%;\n        left: 50%;\n        transform: translate(-50%, -50%);\n        font-size: 24px;\n        color: #969696; }\n  .j-card .title {\n    margin-bottom: 0.4rem;\n    text-align: center; }\n    .j-card .title .txt {\n      position: relative;\n      line-height: 0.58667rem;\n      padding: 0 0.26667rem;\n      background: #fff;\n      color: black;\n      z-index: 1; }\n      .j-card .title .txt::before {\n        content: '';\n        z-index: -1;\n        left: -0.8rem;\n        right: -0.8rem;\n        top: 50%;\n        position: absolute;\n        height: 1px;\n        background: #e5e5e5; }\n  .j-card .sub-title {\n    margin: -0.4rem 0 0.4rem;\n    font-size: 14px;\n    text-align: center;\n    line-height: 0.58667rem;\n    font-weight: lighter;\n    color: #666; }\n    [data-dpr=\"2\"] .j-card .sub-title {\n      font-size: 28px; }\n    [data-dpr=\"3\"] .j-card .sub-title {\n      font-size: 42px; }\n  .j-card .join-group {\n    padding: 0.4rem;\n    display: -webkit-box;\n    display: -webkit-flex;\n    display: flex;\n    background-color: #f7f7f7; }\n    .j-card .join-group .head-pic {\n      width: 1.73333rem;\n      height: 1.73333rem;\n      margin-right: 0.26667rem;\n      border-radius: 50%;\n      background-size: 100%;\n      overflow: hidden; }\n    .j-card .join-group .tags {\n      margin: 0.21333rem 0; }\n    .j-card .join-group .tag {\n      margin-right: 0.18667rem;\n      padding: 0.06667rem 0.13333rem;\n      font-size: 9px;\n      font-weight: lighter;\n      text-align: center;\n      border-radius: 0.05333rem;\n      color: white; }\n      [data-dpr=\"2\"] .j-card .join-group .tag {\n        font-size: 18px; }\n      [data-dpr=\"3\"] .j-card .join-group .tag {\n        font-size: 27px; }\n    .j-card .join-group .tag-pay {\n      background-color: #FFCF3E; }\n      .j-card .join-group .tag-pay::before {\n        content: '付费专享'; }\n    .j-card .join-group .tag-num {\n      background-color: #5DCD90; }\n    .j-card .join-group .intro {\n      width: 3.54667rem;\n      font-size: 13px;\n      line-height: 0.34667rem;\n      color: #999; }\n      [data-dpr=\"2\"] .j-card .join-group .intro {\n        font-size: 26px; }\n      [data-dpr=\"3\"] .j-card .join-group .intro {\n        font-size: 39px; }\n  .j-card .group-title {\n    width: 5.46667rem;\n    line-height: 0.48rem;\n    height: 0.48rem;\n    font-size: 15px;\n    color: black; }\n    [data-dpr=\"2\"] .j-card .group-title {\n      font-size: 30px; }\n    [data-dpr=\"3\"] .j-card .group-title {\n      font-size: 45px; }\n  .j-card.comment-box .title {\n    margin: 0 auto; }\n  .j-card.comment-box .star-grade {\n    display: inline-block;\n    width: 60px;\n    height: 11px;\n    background-image: url(\"./star-off@3x.png\");\n    background-position: left center;\n    background-size: auto 100%;\n    background-repeat: repeat-x; }\n    [data-dpr=\"2\"] .j-card.comment-box .star-grade {\n      width: 120px;\n      height: 22px;\n      background-image: url(\"./star-off@2x.png\"); }\n    [data-dpr=\"3\"] .j-card.comment-box .star-grade {\n      width: 180px;\n      height: 33px;\n      background-image: url(\"./star-off@3x.png\"); }\n  .j-card.comment-box .star-graded {\n    display: block;\n    height: 100%;\n    width: 80%;\n    background-image: url(\"./star-on@3x.png\");\n    background-position: left center;\n    background-size: auto 100%;\n    background-repeat: repeat-x; }\n    [data-dpr=\"2\"] .j-card.comment-box .star-graded {\n      background-image: url(\"./star-on@2x.png\"); }\n    [data-dpr=\"3\"] .j-card.comment-box .star-graded {\n      background-image: url(\"./star-on@3x.png\"); }\n  .j-card.comment-box .star-bar {\n    font-size: 14px;\n    font-weight: lighter; }\n    [data-dpr=\"2\"] .j-card.comment-box .star-bar {\n      font-size: 28px; }\n    [data-dpr=\"3\"] .j-card.comment-box .star-bar {\n      font-size: 42px; }\n  .j-card.comment-box .user {\n    font-size: 12px;\n    font-weight: lighter; }\n    [data-dpr=\"2\"] .j-card.comment-box .user {\n      font-size: 24px; }\n    [data-dpr=\"3\"] .j-card.comment-box .user {\n      font-size: 36px; }\n    .j-card.comment-box .user .nickname {\n      line-height: 0.45333rem;\n      color: #666; }\n  .j-card.comment-box .userPic {\n    display: inline-block;\n    width: 0.58667rem;\n    height: 0.58667rem;\n    margin-left: 0.21333rem;\n    border-radius: 50%;\n    vertical-align: middle;\n    background-size: cover;\n    background-position: center center; }\n  .j-card .title-1 {\n    font-weight: bold;\n    line-height: 0.74667rem; }\n  .j-card .p1 {\n    line-height: 0.85333rem;\n    margin-bottom: 0.64rem;\n    color: #666;\n    font-weight: lighter; }\n    .j-card .p1:last-of-type {\n      margin-bottom: 0; }\n  .j-card .comment-item {\n    padding: 0.13333rem 0;\n    border-bottom: 1px solid #e5e5e5; }\n    .j-card .comment-item:last-of-type {\n      border: none; }\n  .j-card .comment-num {\n    text-align: center;\n    font-size: 12px;\n    color: #999; }\n    [data-dpr=\"2\"] .j-card .comment-num {\n      font-size: 24px; }\n    [data-dpr=\"3\"] .j-card .comment-num {\n      font-size: 36px; }\n    .j-card .comment-num::after {\n      content: '';\n      display: inline-block;\n      margin-left: 0.16rem;\n      width: 0.10667rem;\n      height: 0.21333rem;\n      background-image: url(\"./arrow_ic@3x.png\");\n      background-size: cover; }\n  .j-card .comment-content {\n    line-height: 1.5;\n    font-weight: lighter;\n    margin-bottom: 0.24rem; }\n  .j-card .load-more {\n    position: absolute;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    text-align: center; }\n    .j-card .load-more .mask {\n      height: 1.66667rem;\n      margin-bottom: -1px;\n      background-image: linear-gradient(-180deg, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.98) 100%); }\n    .j-card .load-more .load-txt {\n      padding: 1.09333rem 0 0.48rem;\n      line-height: 0.45333rem;\n      font-size: 12px;\n      background: #fff;\n      vertical-align: middle; }\n      [data-dpr=\"2\"] .j-card .load-more .load-txt {\n        font-size: 24px; }\n      [data-dpr=\"3\"] .j-card .load-more .load-txt {\n        font-size: 36px; }\n      .j-card .load-more .load-txt::after {\n        content: '';\n        display: inline-block;\n        width: 0.21333rem;\n        height: 0.10667rem;\n        margin-left: 0.16rem;\n        margin-top: -0.05333rem;\n        vertical-align: middle;\n        background-image: url(\"./unfolded_arrow@3x.png\");\n        background-size: cover;\n        background-position: center center; }\n\nbody, html {\n  background: #f7f7f7; }\n"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sublevel_tab_back_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sublevel_tab_back_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sublevel_tab_back_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sublevel_tab_back_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sublevel_tab_home_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sublevel_tab_home_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/sublevel_tab_home_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"sublevel_tab_home_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/suicheting.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"suicheting@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tabPlaceImage.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabPlaceImage@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tab_search.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tab_search@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tabbar_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tabbar_bg_shadow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_bg_shadow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tabbar_icon_Rss_normal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_icon_Rss_normal@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tabbar_icon_Rss_pressed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_icon_Rss_pressed@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tabbar_icon_find_normal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_icon_find_normal@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tabbar_icon_find_pressed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_icon_find_pressed@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tabbar_icon_hear_normal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_icon_hear_normal@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tabbar_icon_hear_pressed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_icon_hear_pressed@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tabbar_icon_home_normal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_icon_homepage_normal@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tabbar_icon_home_pressed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_icon_homepage_pressed@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tabbar_icon_mine_normal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_icon_my_normal@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tabbar_icon_mine_pressed.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_icon_my_pressed@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tabbar_np_loop.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_np_loop@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tabbar_np_normal.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_np_normal@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tabbar_np_play.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_np_play@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tabbar_np_playnon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_np_playnon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tabbar_np_playshadow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_np_playshadow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tabbar_np_shadow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tabbar_np_shadow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tableViewMask.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tableViewMask@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tag_all.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tag_all@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tag_default.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tag_default@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tagbar_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tagbar_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tagbar_sel.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tagbar_sel@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tagsViewLine.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tagsViewLine@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/testEnvironment.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"testEnvironment.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": "RxXMLY/Assets.xcassets/icon_XMLY/third_app_default.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"third_app_default@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ting.dataset/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"data\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ting\"\n    }\n  ]\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ting_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ting_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ting_sound_uploading.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ting_sound_uploading@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tingshubao.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tingshubao@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tingshubao_logo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tingshubao_logo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/titleBorder.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"titleBorder@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/titleBorder_gray.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"titleBorder_gray@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/title_ic_findfriend_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"title_ic_findfriend_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/title_ic_kf.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"title_ic_kf@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/title_ic_more_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"title_ic_more_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/title_ic_release_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"title_ic_release_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toast_arrow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toast_arrow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toast_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toast_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_clock_h_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_clock_h_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_clock_n_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_clock_n_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_danmu_close.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_danmu_close@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_danmu_h_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_danmu_h_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_danmu_n_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_danmu_n_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_history_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_history_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_history_h_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_history_h_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_history_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_history_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_history_n_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_history_n_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_like_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_like_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_like_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_like_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_loading_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_loading_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_loading_h_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_loading_h_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_loading_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_loading_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_loading_n_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_loading_n_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_more_h_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_more_h_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_more_n_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_more_n_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_next_d.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_next_d@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_next_d_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_next_d_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_next_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_next_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_next_h_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_next_h_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_next_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_next_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_next_n_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_next_n_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_pause_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_pause_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_pause_h_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_pause_h_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_pause_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_pause_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_pause_n_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_pause_n_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_play_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_play_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_play_h_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_play_h_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_play_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_play_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_play_n_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_play_n_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_playinglist_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_playinglist_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_playinglist_h_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_playinglist_h_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_playinglist_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_playinglist_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_playinglist_n_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_playinglist_n_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_prev_d.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_prev_d@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_prev_d_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_prev_d_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_prev_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_prev_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_prev_h_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_prev_h_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_prev_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_prev_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/toolbar_prev_n_p.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"toolbar_prev_n_p@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/top_addlike_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"top_addlike_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/top_download_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"top_download_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/top_filter.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"top_filter@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/top_history_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"top_history_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/top_logo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"top_logo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/top_message_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"top_message_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/top_search.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"top_search@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/top_search_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"top_search_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/trackBuy_alert_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"trackBuy_alert_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/track_album_cover_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"track_album_cover_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/track_album_cover_bg_mask.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"track_album_cover_bg_mask@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/track_alert_image.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"track_alert_image@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/traffic_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"traffic_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/traffic_close.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"traffic_close@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/trylisten_disable.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"trylisten_disable@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/trylisten_stop.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"trylisten_stop@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tsb_connect_mode.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tsb_connect_mode@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tyq_ic_addlist.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tyq_ic_addlist@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tyq_ic_addlist_s.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tyq_ic_addlist_s@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tyq_ic_more.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tyq_ic_more@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tyq_ic_release.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tyq_ic_release@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tyq_ic_weibo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tyq_ic_weibo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tyq_ic_weibo_s.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tyq_ic_weibo_s@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/tyq_notice_ic_check.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"tyq_notice_ic_check@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/uithread.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"uithread.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": "RxXMLY/Assets.xcassets/icon_XMLY/unUsingFreeThough.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"unUsingFreeThough@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/underscore.min.dataset/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  },\n  \"data\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"underscore.min.js\"\n    }\n  ]\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/unfolded_arrow.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"unfolded_arrow@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/unpublished.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"unpublished@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/unpublishedMore.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"unpublishedMore@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/up_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"up_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/upgrade_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"upgrade_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userBackHS.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userBackHS@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userBackHi.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userBackHi@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userBackNS.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userBackNS@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userBackNor.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userBackNor@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userBottomFol.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userBottomFol@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userBottomMes.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userBottomMes@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userBottomUnFol.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userBottomUnFol@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userEditCell.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userEditCell@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userEditH.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userEditH@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userEditNS.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userEditNS@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userEditNor.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userEditNor@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userGradeV0.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userGradeV0@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userGradeV1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userGradeV1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userGradeV10.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userGradeV10@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userGradeV2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userGradeV2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userGradeV3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userGradeV3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userGradeV4.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userGradeV4@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userGradeV5.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userGradeV5@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userGradeV6.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userGradeV6@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userGradeV7.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userGradeV7@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userGradeV8.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userGradeV8@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userGradeV9.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userGradeV9@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userMoreHS.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userMoreHS@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userMoreHi.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userMoreHi@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userMoreNS.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userMoreNS@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userMoreNor.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userMoreNor@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userRank.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userRank@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userShareHS.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userShareHS@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userShareHi.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userShareHi@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userShareNS.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userShareNS@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userShareNor.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userShareNor@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/userSponsor.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"userSponsor@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_Aquarius.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_Aquarius@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_Aries.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_Aries@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_Cancer.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_Cancer@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_Capricornus.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_Capricornus@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_Gemini.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_Gemini@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_Leo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_Leo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_Libra.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_Libra@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_Pisces.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_Pisces@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_QA.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_QA@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_Sagittarius.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_Sagittarius@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_Scorpio.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_Scorpio@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_Taurus.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_Taurus@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_VIP.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_VIP@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_Virgo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_Virgo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_edit_btn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_edit_btn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_edit_btn_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_edit_btn_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_edit_btn_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_edit_btn_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_fans.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_fans@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_female.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_female@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_focus_btn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_focus_btn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_focused_btn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_focused_btn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_head.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_head.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": "RxXMLY/Assets.xcassets/icon_XMLY/user_head_VIP_btn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_head_VIP_btn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_head_comment.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_head_comment@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_head_hotlineVIP_btn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_head_hotlineVIP_btn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_head_hotline_btn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_head_hotline_btn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_hind_btn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_hind_btn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_location.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_location@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_mail_btn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_mail_btn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_male.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_male@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_moreicon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_moreicon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_publish_btn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_publish_btn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_ranking 6.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_ranking 6@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/user_sponsor.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"user_sponsor@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/usingFreeThough.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"usingFreeThough@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/view_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"view_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/vip_get_btn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"vip_get_btn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/vip_guide_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"vip_guide_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/vip_guide_close.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"vip_guide_close@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/vip_icon.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"vip_icon@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/vip_ident_large.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"vip_ident_large@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/voicesearch__ic_mic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"voicesearch__ic_mic@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/voicesearch_bg_oval.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"voicesearch_bg_oval@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/voicesearch_btn_confirm_nor.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"voicesearch_btn_confirm_nor@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/voicesearch_btn_confirm_pre.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"voicesearch_btn_confirm_pre@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/voicesearch_btn_rec_nor.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"voicesearch_btn_rec_nor@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/voicesearch_btn_rec_pre.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"voicesearch_btn_rec_pre@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/voicesearch_img_loading.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"voicesearch_img_loading@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/voucher_close.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"voucher_close@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/voucher_horizontal_line.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"voucher_horizontal_line.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": "RxXMLY/Assets.xcassets/icon_XMLY/voucher_line.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"voucher_line@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/voucher_red.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"voucher_red@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/voucher_red_u.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"voucher_red_u@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/voucher_select.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"voucher_select@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/voucher_unselect.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"voucher_unselect@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/w_fuyun.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"w_fuyun.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"w_fuyun@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/w_luoye.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"w_luoye.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"w_luoye@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/w_shachenbao.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"w_shachenbao.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"w_shachenbao@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/w_taiyang.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"w_taiyang.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"w_taiyang@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/w_weifeng.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"w_weifeng.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"w_weifeng@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/w_xianhua.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"w_xianhua.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"w_xianhua@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/w_xiayu.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"w_xiayu.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"w_xiayu@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/w_xue.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"w_xue.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"w_xue@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/w_xueren.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"w_xueren.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"w_xueren@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/w_yueliang.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"w_yueliang.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"w_yueliang@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/wd_more_ic_clock.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wd_more_ic_clock@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/wd_more_ic_stopwatch.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wd_more_ic_stopwatch@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/web_btn_back.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"web_btn_back@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/web_btn_close.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"web_btn_close@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/wifi_bind.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifi_bind@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/wifi_binded.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifi_binded@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/wifi_connect_pic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifi_connect_pic@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/wifi_dis_connect_pic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifi_dis_connect_pic@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/wifi_nodevice.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifi_nodevice@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/wifi_nosuo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifi_nosuo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/wifi_psw.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifi_psw@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/wifi_psw_bg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifi_psw_bg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/wifi_psw_ok.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifi_psw_ok@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/wifi_retry_btn.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifi_retry_btn@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/wifi_suo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifi_suo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/wifibox_channel1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifibox_channel1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/wifibox_channel2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifibox_channel2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/wifibox_channel3.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifibox_channel3@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/wifibox_channel4.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifibox_channel4@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/wifibox_checkmark.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifibox_checkmark@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/wifibox_down.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifibox_down@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/wifibox_edit.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifibox_edit@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/wifibox_nextstep.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifibox_nextstep@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/wifibox_play.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifibox_play@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/wifibox_play_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifibox_play_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/wifibox_step1.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifibox_step1@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/wifibox_step2.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifibox_step2@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/wifibox_top.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifibox_top@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/wifilogo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"wifilogo@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/xim_eye_off.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"xim_eye_off@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/xim_eye_on.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"xim_eye_on@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/ximalaya_carlogo.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"ximalaya_carlogo.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": "RxXMLY/Assets.xcassets/icon_XMLY/xmToolBox.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"xmToolBox.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": "RxXMLY/Assets.xcassets/icon_XMLY/xm_download.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"xm_download.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": "RxXMLY/Assets.xcassets/icon_XMLY/xm_history.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"xm_history.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": "RxXMLY/Assets.xcassets/icon_XMLY/xm_popular.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"xm_popular.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": "RxXMLY/Assets.xcassets/icon_XMLY/xm_recommendation.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"xm_recommendation.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": "RxXMLY/Assets.xcassets/icon_XMLY/xm_subscription.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"xm_subscription.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": "RxXMLY/Assets.xcassets/icon_XMLY/xmtoolboxclose.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"xmtoolboxclose.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": "RxXMLY/Assets.xcassets/icon_XMLY/xmtoolboxtitle.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"xmtoolboxtitle.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": "RxXMLY/Assets.xcassets/icon_XMLY/xplay_cancel.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"xplay_cancel@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/yijiantingGuide.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"yijiantingGuide@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/yijiantingProcessBg.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"yijiantingProcessBg@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/yijiantingplayProcessPc.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"yijiantingplayProcessPc@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/yjtlisten_w.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"yjtlisten_w@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/yjtloading.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"yjtloading@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/yjtmask.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"yjtmask@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/yjtnext_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"yjtnext_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/yjtnext_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"yjtnext_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/yjtpause_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"yjtpause_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/yjtpause_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"yjtpause_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/yjtplay_h.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"yjtplay_h@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/yjtplay_n.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"yjtplay_n@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/yjtprocessTag.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"yjtprocessTag@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/yjtslogan.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"yjtslogan@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/zone_deletepic.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"zone_deletepic@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/删除.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"删除@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/声音iconhome_ic_banner_sound.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"声音iconhome_ic_banner_sound@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/播放home_ic_banner_paly_big.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"播放home_ic_banner_paly_big@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/播放标home_ic_banner_paly_small.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"播放标home_ic_banner_paly_small@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Assets.xcassets/icon_XMLY/流程.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"流程@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "RxXMLY/Classes/Common/Common.swift",
    "content": "//\n//  Common.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/14.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\n// 屏幕宽度\nlet kScreenH = UIScreen.main.bounds.height\n// 屏幕高度\nlet kScreenW = UIScreen.main.bounds.width\n//适配iPhoneX\nlet is_iPhoneX = (kScreenW == 375.0 && kScreenH == 812.0 ? true : false)\nlet kNavibarH: CGFloat = is_iPhoneX ? 88.0 : 64.0\nlet kTabbarH: CGFloat = is_iPhoneX ? 49.0+34.0 : 49.0\nlet kStatusbarH: CGFloat = is_iPhoneX ? 44.0 : 20.0\nlet iPhoneXBottomH: CGFloat = 34.0\nlet iPhoneXTopH: CGFloat = 24.0\n\n// MARK:- 常量\nstruct MetricGlobal {\n    static let padding: CGFloat = 10.0\n    static let margin: CGFloat = 10.0\n}\n\n// MARK:- 颜色方法\nfunc kRGBA (r:CGFloat, g:CGFloat, b:CGFloat, a:CGFloat) -> UIColor {\n    return UIColor (red: r/255.0, green: g/255.0, blue: b/255.0, alpha: a)\n}\n\n// MARK:- 常用按钮颜色\n// 颜色参考 http://www.sioe.cn/yingyong/yanse-rgb-16/\n\nlet kThemeWhiteColor = UIColor.hexColor(0xFFFFFF)\nlet kThemeWhiteSmokeColor = UIColor.hexColor(0xF5F5F5)\nlet kThemeMistyRoseColor = UIColor.hexColor(0xFFE4E1)  // 薄雾玫瑰\nlet kThemeGainsboroColor = UIColor.hexColor(0xF3F4F5)  // 亮灰色\nlet kThemeOrangeRedColor = UIColor.hexColor(0xFF4500)  // 橙红色\nlet kThemeLimeGreenColor = UIColor.hexColor(0x32CD32)  // 酸橙绿\nlet kThemeSnowColor = UIColor.hexColor(0xFFFAFA)\nlet kThemeLightGreyColor = UIColor.hexColor(0xD3D3D3)\nlet kThemeGreyColor = UIColor.hexColor(0xA9A9A9)\nlet kThemeTomatoColor = UIColor.hexColor(0xF7583B)\nlet kThemeDimGrayColor = UIColor.hexColor(0x696969)\nlet kThemeBlackColor = UIColor.hexColor(0x000000)\nlet kThemeBackgroundColor = UIColor.hexColor(0xF4F4F4)\n\n\n// MARK:- 自定义打印方法\nfunc HCLog<T>(_ message : T, file : String = #file, funcName : String = #function, lineNum : Int = #line) {\n    \n    #if DEBUG\n        \n        let fileName = (file as NSString).lastPathComponent\n        \n        print(\"\\(fileName):(\\(lineNum))-\\(message)\")\n        \n    #endif\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Common/CustomUI/HCBaseNavigationController/HCBaseNavigationController.swift",
    "content": "//\n//  HCBaseNavigationController.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/14.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nclass HCBaseNavigationController: UINavigationController, HCNavBackable {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        HCLog(\"init: \\(type(of: self))\")\n\n        // 设置导航栏样式\n        navigationBar.setBackgroundImage(UIImage.color(kThemeWhiteColor), for: UIBarPosition.any, barMetrics: .default)\n        navigationBar.shadowImage = UIImage()\n        \n        // 标题样式\n        let bar = UINavigationBar.appearance()\n        bar.titleTextAttributes = [\n            NSAttributedStringKey.foregroundColor : UIColor.black,\n            NSAttributedStringKey.font : UIFont.systemFont(ofSize: 18)\n        ]\n        \n        // 设置返回按钮的样式\n        navigationBar.tintColor = kThemeBlackColor     // 设置返回标识器的颜色\n        let barItem = UIBarButtonItem.appearance()\n        barItem.setTitleTextAttributes([NSAttributedStringKey.foregroundColor : kThemeBlackColor], for: .normal)  // 返回按钮文字样式\n    }\n    \n    deinit {\n        HCLog(\"deinit: \\(type(of: self))\")\n    }\n}\n\n// MARK:- 事件 (部分页面失效)\nextension HCBaseViewController {\n    \n    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {\n        super.touchesBegan(touches, with: event)\n        // 注销 键盘\n        view.endEditing(true)\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Common/CustomUI/HCBaseViewController/HCBaseViewController.swift",
    "content": "//\n//  HCBaseViewController.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/14.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport NSObject_Rx\n\nclass HCBaseViewController: UIViewController {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        HCLog(\"init: \\(type(of: self))\")\n\n        view.backgroundColor = kThemeGainsboroColor\n    }\n    \n    deinit {\n        HCLog(\"deinit: \\(type(of: self))\")\n    }\n}\n\n// MARK:- 事件 (部分页面失效)\nextension HCBaseNavigationController {\n    \n    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {\n        super.touchesBegan(touches, with: event)\n        // 注销 键盘\n        view.endEditing(true)\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Common/CustomUI/HCRefreshGifHeader/HCRefreshGifHeader.swift",
    "content": "\n//\n//  HCRefreshGifHeader.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/19.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport MJRefresh\n\nclass HCRefreshGifHeader: MJRefreshGifHeader {\n    \n    override func layoutSubviews() {\n        super.layoutSubviews()\n        \n        // 临时方案，改动最小，不破坏第三方库\n        self.stateLabel.isHidden = false\n        self.lastUpdatedTimeLabel.isHidden = true\n        self.gifView.contentMode = .center\n        self.mj_h = 80\n        self.gifView.mj_w = self.mj_w\n        self.gifView.top = self.top + 80.0\n        self.gifView.height = self.mj_h - 60.0\n        self.stateLabel.top = self.gifView.bottom\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Common/CustomUI/HCScrollBarView/HCScrollBarCell.swift",
    "content": "//\n//  HCScrollBarCell.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/16.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nclass HCScrollBarCell: UICollectionViewCell {\n\n    @IBOutlet weak var imageView: UIImageView!\n    \n    override func awakeFromNib() {\n        super.awakeFromNib()\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Common/CustomUI/HCScrollBarView/HCScrollBarCell.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"13196\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"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=\"13173\"/>\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=\"HCScrollBarCell\" customModule=\"RxXMLY\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"120\"/>\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=\"375\" height=\"120\"/>\n                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                <subviews>\n                    <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"CNh-ov-Xek\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"120\"/>\n                    </imageView>\n                </subviews>\n            </view>\n            <constraints>\n                <constraint firstItem=\"CNh-ov-Xek\" firstAttribute=\"top\" secondItem=\"gTV-IL-0wX\" secondAttribute=\"top\" id=\"ZJO-Gf-s9f\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"CNh-ov-Xek\" secondAttribute=\"bottom\" id=\"b51-yy-IIV\"/>\n                <constraint firstItem=\"CNh-ov-Xek\" firstAttribute=\"leading\" secondItem=\"gTV-IL-0wX\" secondAttribute=\"leading\" id=\"dBh-8g-pd2\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"CNh-ov-Xek\" secondAttribute=\"trailing\" id=\"h1y-oS-m09\"/>\n            </constraints>\n            <connections>\n                <outlet property=\"imageView\" destination=\"CNh-ov-Xek\" id=\"g0I-yW-qfo\"/>\n            </connections>\n        </collectionViewCell>\n    </objects>\n</document>\n"
  },
  {
    "path": "RxXMLY/Classes/Common/CustomUI/HCScrollBarView/HCScrollBarView.swift",
    "content": "//\n//  HCScrollBarView.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/16.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport TYCyclePagerView\nimport Kingfisher\n\nclass HCScrollBarView: UIView {\n    \n    var picArr = Variable<[String]>([])\n    \n    private let pagerView = TYCyclePagerView().then {\n        $0.isInfiniteLoop = true;\n        $0.autoScrollInterval = 3.0;\n    }\n    \n    private let pageControl = TYPageControl().then {\n        $0.currentPageIndicatorSize = CGSize(width: 8, height: 8)\n        $0.contentHorizontalAlignment = .right\n        $0.contentInset = UIEdgeInsetsMake(0, 0, 0, 16)\n    }\n    \n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        \n        initUI()\n        bindUI()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n}\n\nextension HCScrollBarView {\n    \n    \n    private func initUI() {\n        \n        // 轮播图\n        pagerView.addSubview(pageControl)\n        self.addSubview(pagerView)\n        \n        pagerView.snp.makeConstraints { (make) in\n            make.edges.equalToSuperview()\n        }\n        \n        pageControl.snp.makeConstraints { (make) in\n            make.height.equalTo(26)\n            make.bottom.equalToSuperview()\n            make.right.equalToSuperview().offset(-8)\n            make.left.equalToSuperview().offset(8)\n        }\n        \n        pagerView.register(UINib(nibName: String(describing: HCScrollBarCell.self), bundle: nil), forCellWithReuseIdentifier: String(describing: HCScrollBarCell.self))\n        pagerView.delegate = self\n        pagerView.dataSource = self\n    }\n\n    func bindUI() {\n        \n        // 刷新轮播图\n        picArr.asObservable().subscribe { (_) in\n            self.pagerView.reloadData()\n            self.pageControl.numberOfPages = self.picArr.value.count\n            }.disposed(by: rx.disposeBag)\n    }\n}\n\nextension HCScrollBarView: TYCyclePagerViewDataSource, TYCyclePagerViewDelegate {\n    \n    func numberOfItems(in pageView: TYCyclePagerView) -> Int {\n        return picArr.value.count\n    }\n    \n    func layout(for pageView: TYCyclePagerView) -> TYCyclePagerViewLayout {\n        \n        let layout = TYCyclePagerViewLayout()\n        layout.itemSize = CGSize(width: pagerView.frame.width, height: pagerView.frame.height)\n        layout.itemSpacing = 0\n        layout.itemHorizontalCenter = true\n        \n        return layout\n    }\n    \n    func pagerView(_ pagerView: TYCyclePagerView, cellForItemAt index: Int) -> UICollectionViewCell {\n        let cell = pagerView.dequeueReusableCell(withReuseIdentifier: \"HCScrollBarCell\", for: index) as! HCScrollBarCell\n        cell.imageView.kf.setImage(with: URL(string: picArr.value[index]))\n        return cell\n    }\n    \n    func pagerView(_ pageView: TYCyclePagerView, didScrollFrom fromIndex: Int, to toIndex: Int) {\n        pageControl.currentPage = toIndex\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Common/Extension/RxAlamofire+ObjectMapper.swift",
    "content": "//\n//  RxAlamofire+ObjectMapper.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/16.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport Foundation\nimport RxSwift\nimport RxAlamofire\nimport RxCocoa\nimport ObjectMapper\nimport SwiftyJSON\n\nextension ObservableType where E == Any {\n    public func hc_json(_ json : @escaping ((E) -> JSON)) -> Observable<Any> {\n        return flatMap { (result) -> Observable<Any> in\n            return Observable.just(json(result).object)\n        }\n    }\n    \n    // 将Json解析为Observable<Model>\n    public func mapObject<T: BaseMappable>(_ type: T.Type) -> Observable<T> {\n        return flatMap { json -> Observable<T> in\n            guard let object = Mapper<T>().map(JSONObject: json) else {\n                HCLog(\"ObjectMapper can't mapping Object\")\n                return Observable.error(NSError(domain: \"HC\", code: -1, userInfo: [NSLocalizedDescriptionKey : \"ObjectMapper can't mapping Object\"]))\n            }\n            return Observable.just(object)\n        }\n    }\n    // 将Json解析为 Observable<[Model]>\n    public func mapArray<T: BaseMappable>(_ type: T.Type) -> Observable<[T]> {\n        return flatMap { (json) -> Observable<[T]> in\n            guard let objectArr = Mapper<T>().mapArray(JSONObject: json) else {\n                HCLog(\"ObjectMapper can't mapping Array\")\n                return Observable.error(NSError(domain: \"HC\", code: -1, userInfo: [NSLocalizedDescriptionKey : \"ObjectMapper can't mapping objArray\"]))\n            }\n            return Observable.just(objectArr)\n        }\n    }\n}\n\n\n"
  },
  {
    "path": "RxXMLY/Classes/Common/Extension/String+GetSize.swift",
    "content": "//\n//  UIColor+HexColor.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/14.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nextension String {\n    \n    // MARK:- 获取字符串大小\n    func getSize(fontSize: CGFloat) -> CGSize {\n        let str = self as NSString\n        \n        let size = CGSize(width: UIScreen.main.bounds.width, height: CGFloat(MAXFLOAT))\n        return str.boundingRect(with: size, options: .usesLineFragmentOrigin, attributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: fontSize)], context: nil).size\n    }\n    \n    // MARK:- 获取字符串大小\n    func getSize(font: UIFont) -> CGSize {\n        let str = self as NSString\n        \n        let size = CGSize(width: UIScreen.main.bounds.width, height: CGFloat(MAXFLOAT))\n        return str.boundingRect(with: size, options: .usesLineFragmentOrigin, attributes: [NSAttributedStringKey.font: font], context: nil).size\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Common/Extension/UIColor+HexColor.swift",
    "content": "//\n//  UIColor+HexColor.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/14.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nextension UIColor {\n    \n    static func hexColor(_ hexColor : Int64) -> UIColor {\n        \n        let red = ((CGFloat)((hexColor & 0xFF0000) >> 16))/255.0;\n        let green = ((CGFloat)((hexColor & 0xFF00) >> 8))/255.0;\n        let blue = ((CGFloat)(hexColor & 0xFF))/255.0;\n        \n        return UIColor(red: red, green: green, blue: blue, alpha: 1)\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Common/Extension/UIImage+Color.swift",
    "content": "//\n//  UIImage+Color.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/14.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nextension UIImage {\n    public static func color(_ color: UIColor) -> UIImage {\n        \n        let rect = CGRect(x: 0.0, y: 0.0, width: 1.0, height: 1.0)\n        UIGraphicsBeginImageContextWithOptions(rect.size, false, UIScreen.main.scale)\n        let ctx = UIGraphicsGetCurrentContext()\n        ctx?.setFillColor(color.cgColor)\n        ctx?.fill(rect)\n        var image = UIGraphicsGetImageFromCurrentImageContext()!\n        UIGraphicsEndImageContext()\n        let imageData = UIImageJPEGRepresentation(image, 1.0)!\n        image = UIImage(data: imageData)!\n        return image\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Common/Extension/UINavigationBar+ChangeColor.swift",
    "content": "//\n//  UINavigationBar+ChangeColor.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/1/9.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\n// MARK:- 方法一\nextension UINavigationBar {\n    \n    // MARK:- RunTime\n    private struct NavigationBarKeys {\n        static var overlayKey = \"overlayKey\"\n    }\n    \n    var overlay: UIView? {\n        get {\n            return objc_getAssociatedObject(self, &NavigationBarKeys.overlayKey) as? UIView\n        }\n        set {\n            objc_setAssociatedObject(self, &NavigationBarKeys.overlayKey, newValue as UIView?, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC\n            )\n        }\n    }\n    \n    // MARK:- 接口\n    func Mg_setBackgroundColor(backgroundColor: UIColor) {\n        if overlay == nil {\n            self.setBackgroundImage(UIImage(), for: UIBarMetrics.default)\n            overlay = UIView.init(frame: CGRect.init(x: 0, y: 0, width: bounds.width, height: bounds.height+20))\n            overlay?.isUserInteractionEnabled = false\n            overlay?.autoresizingMask = UIViewAutoresizing.flexibleWidth\n        }\n        overlay?.backgroundColor = backgroundColor\n        subviews.first?.insertSubview(overlay!, at: 0)\n    }\n    \n    \n    func Mg_setTranslationY(translationY: CGFloat) {\n        transform = CGAffineTransform.init(translationX: 0, y: translationY)\n    }\n    \n    func Mg_setElementsAlpha(alpha: CGFloat) {\n        for (_, element) in subviews.enumerated() {\n            if element.isKind(of: NSClassFromString(\"UINavigationItemView\") as! UIView.Type) ||\n                element.isKind(of: NSClassFromString(\"UINavigationButton\") as! UIButton.Type) ||\n                element.isKind(of: NSClassFromString(\"UINavBarPrompt\") as! UIView.Type)\n            {\n                element.alpha = alpha\n            }\n            \n            if element.isKind(of: NSClassFromString(\"_UINavigationBarBackIndicatorView\") as! UIView.Type) {\n                element.alpha = element.alpha == 0 ? 0 : alpha\n            }\n        }\n        \n        items?.forEach({ (item) in\n            if let titleView = item.titleView {\n                titleView.alpha = alpha\n            }\n            for BBItems in [item.leftBarButtonItems, item.rightBarButtonItems] {\n                BBItems?.forEach({ (barButtonItem) in\n                    if let customView = barButtonItem.customView {\n                        customView.alpha = alpha\n                    }\n                })\n            }\n        })\n    }\n    \n    /// viewWillDisAppear调用\n    func Mg_reset() {\n        setBackgroundImage(nil, for: UIBarMetrics.default)\n        overlay?.removeFromSuperview()\n        overlay = nil\n    }\n}\n\n// MARK:- 方法二\nextension UINavigationBar {\n    \n    // MARK:- 接口\n    /**\n     *  隐藏导航栏下的横线，背景色置空 viewWillAppear调用\n     */\n    func star() {\n        let shadowImg: UIImageView? = self.findNavLineImageViewOn(view: self)\n        shadowImg?.isHidden = true\n        self.backgroundColor = nil\n    }\n    \n    /**\n     在func scrollViewDidScroll(_ scrollView: UIScrollView)调用\n     @param color 最终显示颜色\n     @param scrollView 当前滑动视图\n     @param value 滑动临界值，依据需求设置\n     */\n    func change(_ color: UIColor, with scrollView: UIScrollView, andValue value: CGFloat) {\n        if scrollView.contentOffset.y < -value{\n            // 下拉时导航栏隐藏，无所谓，可以忽略\n            self.isHidden = true\n        } else {\n            self.isHidden = false\n            // 计算透明度\n            let alpha: CGFloat = scrollView.contentOffset.y / value > 1.0 ? 1 : scrollView.contentOffset.y / value\n            //设置一个颜色并转化为图片\n            let image: UIImage? = imageFromColor(color: color.withAlphaComponent(alpha))\n            self.setBackgroundImage(image, for: .default)\n        }\n    }\n    \n    /**\n     *  还原导航栏  viewWillDisAppear调用\n     */\n    func reset() {\n        let shadowImg = findNavLineImageViewOn(view: self)\n        shadowImg?.isHidden = false\n        self.setBackgroundImage(nil,for: .default)\n    }\n    \n    // MARK:- 其他内部方法\n    //寻找导航栏下的横线  （递归查询导航栏下边那条分割线）\n    fileprivate func findNavLineImageViewOn(view: UIView) -> UIImageView? {\n        if (view.isKind(of: UIImageView.classForCoder())  && view.bounds.size.height <= 1.0) {\n            return view as? UIImageView\n        }\n        for subView in view.subviews {\n            let imageView = findNavLineImageViewOn(view: subView)\n            if imageView != nil {\n                return imageView\n            }\n        }\n        return nil\n    }\n    \n    // 通过\"UIColor\"返回一张“UIImage”\n    fileprivate func imageFromColor(color: UIColor) -> UIImage {\n        //创建1像素区域并开始图片绘图\n        let rect = CGRect(x: 0, y: 0, width: 1, height: 1)\n        UIGraphicsBeginImageContext(rect.size)\n        \n        //创建画板并填充颜色和区域\n        let context = UIGraphicsGetCurrentContext()\n        context!.setFillColor(color.cgColor)\n        context!.fill(rect)\n        \n        //从画板上获取图片并关闭图片绘图\n        let image = UIGraphicsGetImageFromCurrentImageContext()\n        UIGraphicsEndImageContext()\n        \n        return image!\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Common/Extension/UIView+Corner.swift",
    "content": "//\n//  UIView+Corner.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/15.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nextension UIView {\n    \n    // MARK:- 裁剪圆角\n    func clipCorner(direction: UIRectCorner, radius: CGFloat) {\n        \n        let cornerSize = CGSize(width: radius, height: radius)\n        let maskPath = UIBezierPath(roundedRect: bounds, byRoundingCorners: direction, cornerRadii: cornerSize)\n        let maskLayer = CAShapeLayer()\n        maskLayer.frame = bounds\n        maskLayer.path = maskPath.cgPath\n        layer.addSublayer(maskLayer)\n        layer.mask = maskLayer\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Common/Extension/UIView+Frame.swift",
    "content": "//\n//  UIView+Frame.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/14.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\n/// Extends CGRect with helper properties for positioning and setting dimensions\nextension CGRect: ExpressibleByStringLiteral {\n    \n    /// The top coordinate of the rect.\n    public var top: CGFloat {\n        get {\n            return origin.y\n        }\n        set(value) {\n            origin.y = value\n        }\n    }\n    \n    // The left-side coordinate of the rect.\n    public var left: CGFloat {\n        get {\n            return origin.x\n        }\n        set(value) {\n            origin.x = value\n        }\n    }\n    \n    // The bottom coordinate of the rect. Setting this will change origin.y of the rect according to\n    // the height of the rect.\n    public var bottom: CGFloat {\n        get {\n            return origin.y + size.height\n        }\n        set(value) {\n            origin.y = value - size.height\n        }\n    }\n    \n    // The right-side coordinate of the rect. Setting this will change origin.x of the rect according to\n    // the width of the rect.\n    public var right: CGFloat {\n        get {\n            return origin.x + size.width\n        }\n        set(value) {\n            origin.x = value - size.width\n        }\n    }\n    \n    // The width of the rect.\n    public var width: CGFloat {\n        get {\n            return size.width\n        }\n        set(value) {\n            size.width = value\n        }\n    }\n    \n    // The height of the rect.\n    public var height: CGFloat {\n        get {\n            return size.height\n        }\n        set(value) {\n            size.height = value\n        }\n    }\n    \n    // The center x coordinate of the rect.\n    public var centerX: CGFloat {\n        get {\n            return origin.x + size.width / 2\n        }\n        set (value) {\n            origin.x = value - size.width / 2\n        }\n    }\n    \n    // The center y coordinate of the rect.\n    public var centerY: CGFloat {\n        get {\n            return origin.y + size.height / 2\n        }\n        set (value) {\n            origin.y = value - size.height / 2\n        }\n    }\n    \n    // The center of the rect.\n    public var center: CGPoint {\n        get {\n            return CGPoint(x: centerX, y: centerY)\n        }\n        set (value) {\n            centerX = value.x\n            centerY = value.y\n        }\n    }\n    \n    public typealias ExtendedGraphemeClusterLiteralType = StringLiteralType\n    \n    public init(stringLiteral value: StringLiteralType) {\n        self.init()\n        let rect: CGRect\n        if value[value.startIndex] != \"{\" {\n            let comp = value.components(separatedBy: \",\")\n            if comp.count == 4 {\n                rect = CGRectFromString(\"{{\\(comp[0]),\\(comp[1])}, {\\(comp[2]), \\(comp[3])}}\")\n            } else {\n                rect = CGRect.zero\n            }\n        } else {\n            rect = CGRectFromString(value)\n        }\n        \n        self.size = rect.size\n        self.origin = rect.origin\n    }\n    \n    public init(extendedGraphemeClusterLiteral value: ExtendedGraphemeClusterLiteralType) {\n        self.init(stringLiteral: value)\n    }\n    \n    public typealias UnicodeScalarLiteralType = StringLiteralType\n    \n    public init(unicodeScalarLiteral value: UnicodeScalarLiteralType) {\n        self.init(stringLiteral: value)\n    }\n}\n\nextension CGPoint: ExpressibleByStringLiteral {\n    public typealias ExtendedGraphemeClusterLiteralType = StringLiteralType\n    \n    public init(stringLiteral value: StringLiteralType) {\n        self.init()\n        \n        let point: CGPoint\n        if value[value.startIndex] != \"{\" {\n            point = CGPointFromString(\"{\\(value)}\")\n        } else {\n            point = CGPointFromString(value)\n        }\n        self.x = point.x\n        self.y = point.y\n    }\n    \n    public init(extendedGraphemeClusterLiteral value: ExtendedGraphemeClusterLiteralType) {\n        self.init(stringLiteral: value)\n    }\n    \n    public typealias UnicodeScalarLiteralType = StringLiteralType\n    \n    public init(unicodeScalarLiteral value: UnicodeScalarLiteralType) {\n        self.init(stringLiteral: value)\n    }\n}\n\nextension UIView {\n    \n    /// The top coordinate of the UIView.\n    public var top: CGFloat {\n        get {\n            return frame.top\n        }\n        set(value) {\n            var frame = self.frame\n            frame.top = value\n            self.frame = frame\n        }\n    }\n    \n    /// The left coordinate of the UIView.\n    public var left: CGFloat {\n        get {\n            return frame.left\n        }\n        set(value) {\n            var frame = self.frame\n            frame.left = value\n            self.frame = frame\n        }\n    }\n    \n    /// The bottom coordinate of the UIView.\n    public var bottom: CGFloat {\n        get {\n            return frame.bottom\n        }\n        set(value) {\n            var frame = self.frame\n            frame.bottom = value\n            self.frame = frame\n        }\n    }\n    \n    /// The right coordinate of the UIView.\n    public var right: CGFloat {\n        get {\n            return frame.right\n        }\n        set(value) {\n            var frame = self.frame\n            frame.right = value\n            self.frame = frame\n        }\n    }\n    \n    // The width of the UIView.\n    public var width: CGFloat {\n        get {\n            return frame.width\n        }\n        set(value) {\n            var frame = self.frame\n            frame.width = value\n            self.frame = frame\n        }\n    }\n    \n    // The height of the UIView.\n    public var height: CGFloat {\n        get {\n            return frame.height\n        }\n        set(value) {\n            var frame = self.frame\n            frame.height = value\n            self.frame = frame\n        }\n    }\n    \n    /// The horizontal center coordinate of the UIView.\n    public var centerX: CGFloat {\n        get {\n            return frame.centerX\n        }\n        set(value) {\n            var frame = self.frame\n            frame.centerX = value\n            self.frame = frame\n        }\n    }\n    \n    /// The vertical center coordinate of the UIView.\n    public var centerY: CGFloat {\n        get {\n            return frame.centerY\n        }\n        set(value) {\n            var frame = self.frame\n            frame.centerY = value\n            self.frame = frame\n        }\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Common/JsonTemplate.txt",
    "content": "{\n    \"code\": \"43_440000_4403\",\n    \"list\": [{\n    \"bottomHasMore\": true,\n    \"hasMore\": true,\n    \"list\": [{\n    \"data\": [{\n    \"adId\": 41892,\n    \"adType\": 0,\n    \"buttonShowed\": false,\n    \"clickAction\": -1,\n    \"clickTokens\": [\"inIEgatIFLVnTqKaWrGVNt/F5qd4/UPMEuxGzAyUFIIMP4I7JKEg9ROkh3k45vQO\", \"EmH6Tly0XTA6Az9RI4j/0s89FsE333MqFiB8GbST7bYMP4I7JKEg9ROkh3k45vQO\", \"J42B2rewA3tqvPhwdaoqqtd8xfm/zo69QiIcIIzZuxcMP4I7JKEg9ROkh3k45vQO\"],\n    \"clickType\": 1,\n    \"cover\": \"http://fdfs.xmcdn.com/group36/M00/62/01/wKgJUlozZ-zACrrjAAIeynG4BQg008.jpg\",\n    \"description\": \"\",\n    \"displayType\": 1,\n    \"isAd\": false,\n    \"isInternal\": 1,\n    \"isLandScape\": false,\n    \"isShareFlag\": false,\n    \"link\": \"http://ad.ximalaya.com/adrecord?sdn=H4sIAAAAAAAAAKtWykhNTEktUrLKK83J0VFKzs_PzkyF8QoSixJzU0tSi4qVrKqVElM8S1JzPVOUrJRMDC0sjZRqawGgcac5PwAAAA&ad=41892&xmly=uiwebview\",\n    \"name\": \"\",\n    \"openlinkType\": 0,\n    \"realLink\": \"iting://open?msg_type=13&album_id=8225829\",\n    \"showTokens\": [\"B8W2CTPeKNlhRwRpQQl3+pfGBAKcdSw31R/cMpSQi94MP4I7JKEg9ROkh3k45vQO\", \"CpGU2xkE7lN+W6My8OT342a677hQtMwkrph+szoSoFwMP4I7JKEg9ROkh3k45vQO\", \"0KK0zVovY5nS0sd1oiuy4swCRd7bqaHuBodzkD/A238MP4I7JKEg9ROkh3k45vQO\", \"JhRWTadKClFkY2g9km84p8/X4H97k38TrwlHziQYIxcMP4I7JKEg9ROkh3k45vQO\", \"nMIShpz4zBEeeq7vFipX4byOMqA7GCUCs9OT4zYi0JkMP4I7JKEg9ROkh3k45vQO\"],\n    \"targetId\": -1,\n    \"thirdClickStatUrls\": []\n    }, {\n    \"adId\": 41977,\n    \"adType\": 0,\n    \"buttonShowed\": false,\n    \"clickAction\": -1,\n    \"clickTokens\": [\"LdzXfN8cYQi0UES0tLoNYOBFNm6yXQBCwv0+jS54Ay8ZOOgWny8yDFPK3qzypI3I\", \"JCQ4KjZOVqGMVtGY6dfHo9Z35n886kRwOcw3bAVL+UAZOOgWny8yDFPK3qzypI3I\", \"xcxcTZXXA0dAX4M5SLo8OLOfddJzo6la90caXN7yYssMP4I7JKEg9ROkh3k45vQO\"],\n    \"clickType\": 1,\n    \"cover\": \"http://fdfs.xmcdn.com/group37/M01/52/7D/wKgJoFozOUvRDVrPAAHctJwzbxo532.jpg\",\n    \"description\": \"\",\n    \"displayType\": 1,\n    \"isAd\": false,\n    \"isInternal\": 1,\n    \"isLandScape\": false,\n    \"isShareFlag\": false,\n    \"link\": \"http://ad.ximalaya.com/adrecord?sdn=H4sIAAAAAAAAAKtWykhNTEktUrLKK83J0VFKzs_PzkyF8QoSixJzU0tSi4qVrKqVElM8S1JzPVOUrJRMDC3NzZVqawFW7BV6PwAAAA&ad=41977&xmly=uiwebview\",\n    \"name\": \"\",\n    \"openlinkType\": 0,\n    \"realLink\": \"iting://open?msg_type=36&id=1617&content_type=2\",\n    \"showTokens\": [\"LkdIbDXj6kDSUJGpLhj/u4lShDAT8TY48QC3B1EIaKAZOOgWny8yDFPK3qzypI3I\", \"qPYKNY15S9DXnNrrg3GRfG0tA6TJD5Wp0AOvwxVEsjgZOOgWny8yDFPK3qzypI3I\", \"nw1K2TlX05XbObuFVIFBEGdxdjcrXvdrP7QlP40E3lQZOOgWny8yDFPK3qzypI3I\", \"CDITeYl/QVmG6Gsgdh+X4Efw7bNlUS7Jl+2Dpj4e/9IZOOgWny8yDFPK3qzypI3I\", \"aA/m7aAlZBWvle4WUSJiuKaNlgzpHvbxHThKU2OnwjkZOOgWny8yDFPK3qzypI3I\"],\n    \"targetId\": -1,\n    \"thirdClickStatUrls\": []\n    }, {\n    \"adId\": 41871,\n    \"adType\": 0,\n    \"buttonShowed\": false,\n    \"clickAction\": -1,\n    \"clickTokens\": [\"M1ILOJWcGH8MaaKRj/Ckyfdp7cYNOIF06Qm2pIv7PPYZOOgWny8yDFPK3qzypI3I\", \"X3omaq4Sd82HkxPo7P0TLBPx12cNYZqOGes8KaUmCb0ZOOgWny8yDFPK3qzypI3I\", \"OKqilBDwLhsMKfKukAvgKu/oRsa93L8fs0Gn+S0vNrsZOOgWny8yDFPK3qzypI3I\"],\n    \"clickType\": 1,\n    \"cover\": \"http://fdfs.xmcdn.com/group36/M03/5C/52/wKgJUlozSIOh7RNHAAFgRhA_-4I806.jpg\",\n    \"description\": \"\",\n    \"displayType\": 1,\n    \"isAd\": true,\n    \"isInternal\": 1,\n    \"isLandScape\": false,\n    \"isShareFlag\": false,\n    \"link\": \"http://ad.ximalaya.com/adrecord?sdn=H4sIAAAAAAAAAKtWykhNTEktUrLKK83J0VFKzs_PzkyF8QoSixJzU0tSi4qVrKqVElM8S1JzPVOUrJRMDC3MDZVqawEvYCKUPwAAAA&ad=41871&xmly=uiwebview\",\n    \"name\": \"\",\n    \"openlinkType\": 0,\n    \"realLink\": \"iting://open?msg_type=11&track_id=62641785\",\n    \"showTokens\": [\"yi1b1BM6dD1SNQkN1aXKa1bpe8IJzb6SjcxtasvbkEcZOOgWny8yDFPK3qzypI3I\", \"fG1tXrLTOw80a4Yrx0O8y9w8lsG4RBLFvUMOSxzwhcgZOOgWny8yDFPK3qzypI3I\", \"vX15FV6EGh9nzYb75f8zY9Z35n886kRwOcw3bAVL+UAZOOgWny8yDFPK3qzypI3I\", \"eyppeQHIvk2J0lYIJO56wWuZ1Msd/5BsqcXt+9UL/9oZOOgWny8yDFPK3qzypI3I\", \"f9qjaUy0r5peZWffKsRI+msRiau26sl2ZcbRrV8bRvcZOOgWny8yDFPK3qzypI3I\"],\n    \"targetId\": -1,\n    \"thirdClickStatUrls\": []\n    }, {\n    \"adId\": 41982,\n    \"adType\": 0,\n    \"buttonShowed\": false,\n    \"clickAction\": -1,\n    \"clickTokens\": [\"iqBI0l0KGDyKkekFaO7bCw6klmWMuLjytM6zMCSSOkUMP4I7JKEg9ROkh3k45vQO\", \"5YUgLv+9gtvvjTOqG2o5vxe8vjvzp3FQWeH/Q+JPByEMP4I7JKEg9ROkh3k45vQO\", \"C4CVqAskqKoaOe/7ieapea6mVPeS13zRzI8yzz4hcFgMP4I7JKEg9ROkh3k45vQO\"],\n    \"clickType\": 1,\n    \"cover\": \"http://fdfs.xmcdn.com/group36/M0A/6C/D6/wKgJUlozo_SgneVnAAHRxV-mE7A595.jpg\",\n    \"description\": \"\",\n    \"displayType\": 1,\n    \"isAd\": false,\n    \"isInternal\": 1,\n    \"isLandScape\": false,\n    \"isShareFlag\": false,\n    \"link\": \"http://ad.ximalaya.com/adrecord?sdn=H4sIAAAAAAAAAKtWykhNTEktUrLKK83J0VFKzs_PzkyF8QoSixJzU0tSi4qVrKqVElM8S1JzPVOUrJRMDC0tjJRqawG1i5vPPwAAAA&ad=41982&xmly=uiwebview\",\n    \"name\": \"\",\n    \"openlinkType\": 0,\n    \"realLink\": \"iting://open?msg_type=13&album_id=10709180\",\n    \"showTokens\": [\"A8eXi7yWRk4p9wXSsj8xOaSVAPGgICsWW1Q6ulM/APoMP4I7JKEg9ROkh3k45vQO\", \"GBvsqkiDhNgFO+/DvFRinCiwTro+LSr4e6IGbGQ63VEMP4I7JKEg9ROkh3k45vQO\", \"NwXrz6oKpBoeLCPZHy5CH51Q2RZ4dViL+yOtGJnH+QEMP4I7JKEg9ROkh3k45vQO\", \"w0CTHnNalJjV12g7VkJJXBsa2tSKLyC/5IXON2B7RPkMP4I7JKEg9ROkh3k45vQO\", \"Xvp9eUBZDq+WlojiL3fd88tSfWKqIqsqto+6QH1DPKQMP4I7JKEg9ROkh3k45vQO\"],\n    \"targetId\": -1,\n    \"thirdClickStatUrls\": []\n    }, {\n    \"adId\": 41984,\n    \"adType\": 0,\n    \"buttonShowed\": false,\n    \"clickAction\": -1,\n    \"clickTokens\": [\"zOEluvusjG2ndz7sc3+D8GGFH4EvOpue04TpF7jFTaEMP4I7JKEg9ROkh3k45vQO\", \"o3kHSZajDK4EJC5+sUPBx0Kawcy0yExPLvk8YLLsGnEMP4I7JKEg9ROkh3k45vQO\", \"5A5W7MUTHOfjDiD68mmIgAgOxaekzYr7XsIAW3ewNzUMP4I7JKEg9ROkh3k45vQO\"],\n    \"clickType\": 1,\n    \"cover\": \"http://fdfs.xmcdn.com/group37/M0A/5C/10/wKgJoVozpEbw1fFvAAIipu5Vstg283.jpg\",\n    \"description\": \"\",\n    \"displayType\": 1,\n    \"isAd\": false,\n    \"isInternal\": 1,\n    \"isLandScape\": false,\n    \"isShareFlag\": false,\n    \"link\": \"http://ad.ximalaya.com/adrecord?sdn=H4sIAAAAAAAAAKtWykhNTEktUrLKK83J0VFKzs_PzkyF8QoSixJzU0tSi4qVrKqVElM8S1JzPVOUrJRMDC0tTJRqawFp1PDqPwAAAA&ad=41984&xmly=uiwebview\",\n    \"name\": \"\",\n    \"openlinkType\": 0,\n    \"realLink\": \"iting://open?msg_type=13&album_id=11438377\",\n    \"showTokens\": [\"iF1eZH1xFQk6meQGSb5oKar0M9259npt14YcCl/exXMMP4I7JKEg9ROkh3k45vQO\", \"lp1cOmt/k2IS8rMnRLpKsdRttKsg1LTtK6TgjEs1ioQMP4I7JKEg9ROkh3k45vQO\", \"+N6lCqj8dNJZHEHSdNxobQwTBNPy/MJGE6pbBIr2FtkMP4I7JKEg9ROkh3k45vQO\", \"w1K9ME9rQqECwRisinik1BPWFNaPaPDeEUZey0NzVcQMP4I7JKEg9ROkh3k45vQO\", \"3cn28SyyQmJWfTJrQURUPxaP+MYskQIdExHmlGVJKt4MP4I7JKEg9ROkh3k45vQO\"],\n    \"targetId\": -1,\n    \"thirdClickStatUrls\": []\n    }, {\n    \"adId\": 41802,\n    \"adType\": 0,\n    \"buttonShowed\": false,\n    \"clickAction\": -1,\n    \"clickTokens\": [\"ekTeLgIit1SBxQ2HJX+UFXP8Ki/YUF8DxipjeoRWyDAMP4I7JKEg9ROkh3k45vQO\", \"AcaXCAq0bjtI3/64E8vAnZxQVeZ3HmgUtFWt34q6dSoMP4I7JKEg9ROkh3k45vQO\", \"ova3mliRb7PZkWOOqbT/3LHvo/t2Rwq3IZ0PWoDn1xkMP4I7JKEg9ROkh3k45vQO\"],\n    \"clickType\": 1,\n    \"cover\": \"http://fdfs.xmcdn.com/group36/M02/45/67/wKgJUloyjBqT1uKTAAFJgwC7bk8023.jpg\",\n    \"description\": \"\",\n    \"displayType\": 1,\n    \"isAd\": true,\n    \"isInternal\": 0,\n    \"isLandScape\": false,\n    \"isShareFlag\": true,\n    \"link\": \"http://ad.ximalaya.com/adrecord?sdn=H4sIAAAAAAAAAKtWykhNTEktUrLKK83J0VFKzs_PzkyF8QoSixJzU0tSi4qVrKqVElM8S1JzPVOUrJRMDC0MjJRqawHRE7c0PwAAAA&ad=41802&xmly=uiwebview\",\n    \"name\": \"\",\n    \"openlinkType\": 0,\n    \"realLink\": \"http://activity.camera360.com/marketing/index.html?fromOrigin=ximalaya\",\n    \"shareData\": {\n    \"isExternalUrl\": true\n    },\n    \"showTokens\": [\"rCVjaxBvdkADAtV6l2ImClwP1x6e9J0g7QvxK3DO/tcMP4I7JKEg9ROkh3k45vQO\", \"bVI/yufXLuDiMDOW/epM24Hwq5gr8es9SoudNYMnLk4MP4I7JKEg9ROkh3k45vQO\", \"xoaLKAKWjN7t2e6jOCr5FMbKERLABlL1yzNWgJf5drgMP4I7JKEg9ROkh3k45vQO\", \"IOQHeqw0xJ1uVn3yKuRaR9D1naA6nXzSVeiWv9LHK4AMP4I7JKEg9ROkh3k45vQO\", \"Lps92hunlWcFibl+MTgDW13Xbcko1FCJTa+X+/atQBoMP4I7JKEg9ROkh3k45vQO\"],\n    \"targetId\": -1,\n    \"thirdClickStatUrls\": []\n    }, {\n    \"adId\": 42052,\n    \"adType\": 0,\n    \"buttonShowed\": false,\n    \"clickAction\": -1,\n    \"clickTokens\": [\"Es0ugDCIBlnv/En0IcqMhrqsR3EcS8H9xqSul1tHTM8MP4I7JKEg9ROkh3k45vQO\", \"AM51Ci3wmYWR77XEW8QLKtOvRQr5+DbAna+q0Nphtb8MP4I7JKEg9ROkh3k45vQO\", \"srcWNJwuKfOFGcGqfteOCsxzbfH9bmXdj/j4XolZI3kZOOgWny8yDFPK3qzypI3I\"],\n    \"clickType\": 1,\n    \"cover\": \"http://fdfs.xmcdn.com/group37/M05/62/4D/wKgJoVoz0IyjonIUAAHMtON6XWA622.jpg\",\n    \"description\": \"\",\n    \"displayType\": 1,\n    \"isAd\": true,\n    \"isInternal\": 0,\n    \"isLandScape\": false,\n    \"isShareFlag\": true,\n    \"link\": \"http://ad.ximalaya.com/adrecord?sdn=H4sIAAAAAAAAAKtWykhNTEktUrLKK83J0VFKzs_PzkyF8QoSixJzU0tSi4qVrKqVElM8S1JzPVOUrJRMjAxMjZRqawFRBOwhPwAAAA&ad=42052&xmly=uiwebview\",\n    \"name\": \"\",\n    \"openlinkType\": 0,\n    \"realLink\": \"https://h5.m.taobao.com/awp/core/detail.htm?id=552652777246\",\n    \"shareData\": {\n    \"isExternalUrl\": true\n    },\n    \"showTokens\": [\"VAvcWQQJMrFFhBQRPyCewdFf6FhQ/IW5cCzX+V3a+zoMP4I7JKEg9ROkh3k45vQO\", \"YJxKswLEgSxUquJbxebYgLaEjWj/2QkgT1VR7Lmb1ucMP4I7JKEg9ROkh3k45vQO\", \"C/kIkCE4CRd0fnKJXPgDqUy/odp1tTkW8mR7i72OPhAMP4I7JKEg9ROkh3k45vQO\", \"1xXMB824GTWBbS6I/0lo36Uhtfu3JeNwQtQyFzLIDnoMP4I7JKEg9ROkh3k45vQO\", \"bOKf3hi6CpjAT8HxEEzS5Dzh0n8nmXI9SEArwsFazFMMP4I7JKEg9ROkh3k45vQO\"],\n    \"targetId\": -1,\n    \"thirdClickStatUrls\": []\n    }, {\n    \"adId\": 41896,\n    \"adType\": 0,\n    \"buttonShowed\": false,\n    \"clickAction\": -1,\n    \"clickTokens\": [\"i9TJZIcuuIpBv20ZT6XWTxSJxi+z25zdgX352BL2bCgZOOgWny8yDFPK3qzypI3I\", \"tBaYMBWwJa4ov3BawtqZAKgOvWHCLSa1glka+MSD7vEZOOgWny8yDFPK3qzypI3I\", \"BaLbPuHsThurtnt/5xdmAZlXQ+JVKrVVBLOfdYiTl2IZOOgWny8yDFPK3qzypI3I\"],\n    \"clickType\": 1,\n    \"cover\": \"http://fdfs.xmcdn.com/group37/M09/65/E3/wKgJoFoz51OTnL2xAAHrmrfEKlc062.jpg\",\n    \"description\": \"\",\n    \"displayType\": 1,\n    \"isAd\": false,\n    \"isInternal\": 1,\n    \"isLandScape\": false,\n    \"isShareFlag\": false,\n    \"link\": \"http://ad.ximalaya.com/adrecord?sdn=H4sIAAAAAAAAAKtWykhNTEktUrLKK83J0VFKzs_PzkyF8QoSixJzU0tSi4qVrKqVElM8S1JzPVOUrJRMDC0szZRqawH35sW2PwAAAA&ad=41896&xmly=uiwebview\",\n    \"name\": \"\",\n    \"openlinkType\": 0,\n    \"realLink\": \"iting://open?msg_type=13&album_id=8697460\",\n    \"showTokens\": [\"o+vQmvBON48GiQTxe2cwDy9+9mWOckMUzcRTLpb7nfgZOOgWny8yDFPK3qzypI3I\", \"5MA3R9goRSbA4lMB/W+4+ZxGHv4OTyOpt323fdxya2QZOOgWny8yDFPK3qzypI3I\", \"5PYhj7zu8c5rDrKtE+VP9qYRggQmWpI3iU1Kgh4i8zgZOOgWny8yDFPK3qzypI3I\", \"MltWMhrOb0FSOlX+pffvlP/ctcnxvmPudSMBDlmsNnEZOOgWny8yDFPK3qzypI3I\", \"yJXW4WU0K2pxeXoZ5kH8RtnDSn2ww8AUw+CLSw1b1k8ZOOgWny8yDFPK3qzypI3I\"],\n    \"targetId\": -1,\n    \"thirdClickStatUrls\": []\n    }, {\n    \"adId\": 41962,\n    \"adType\": 0,\n    \"buttonShowed\": false,\n    \"clickAction\": -1,\n    \"clickTokens\": [\"izCQzo2A46qR5LMzFvF4Kc0AwfC2fGx15heVubvh1noZOOgWny8yDFPK3qzypI3I\", \"Y+e+A/hENZpFyX09l+wLrj/EsJvQC48j10VH104KJ/QZOOgWny8yDFPK3qzypI3I\", \"E571KbbloWxDbuNEVK+kUJWSTNJheAmQXKIdbgSzCuMZOOgWny8yDFPK3qzypI3I\"],\n    \"clickType\": 1,\n    \"cover\": \"http://fdfs.xmcdn.com/group37/M07/5B/14/wKgJoFozmcaS4plRAAG1ya2hGY8277.jpg\",\n    \"description\": \"\",\n    \"displayType\": 1,\n    \"isAd\": false,\n    \"isInternal\": 1,\n    \"isLandScape\": false,\n    \"isShareFlag\": false,\n    \"link\": \"http://ad.ximalaya.com/adrecord?sdn=H4sIAAAAAAAAAKtWykhNTEktUrLKK83J0VFKzs_PzkyF8QoSixJzU0tSi4qVrKqVElM8S1JzPVOUrJRMDC3NjJRqawHUNatwPwAAAA&ad=41962&xmly=uiwebview\",\n    \"name\": \"\",\n    \"openlinkType\": 0,\n    \"realLink\": \"iting://open?msg_type=11&track_id=62642058\",\n    \"showTokens\": [\"wJB7uO3RWa8ywjSCKuGbzzXJ1X+iZMnSo1C5jLJ6TRYZOOgWny8yDFPK3qzypI3I\", \"YySawdtiJ9gfsI8D00xo3oKKAZsgMWEs8Og8MU/mywYZOOgWny8yDFPK3qzypI3I\", \"IvzpiDusGTAmZD8ooGsDO/CLq6wDAUfWdLeHIpNdPUMZOOgWny8yDFPK3qzypI3I\", \"qsL3z+18VGCShaQvuqPL8p6Ydx7BwiBqv4mua3zQWoMZOOgWny8yDFPK3qzypI3I\", \"5ZPWIZ2GbJbDAx2kHMfhdF3U8szIeeOPHN5yiaOPOhEZOOgWny8yDFPK3qzypI3I\"],\n    \"targetId\": -1,\n    \"thirdClickStatUrls\": []\n    }],\n    \"responseId\": 293445390347,\n    \"ret\": 0\n    }],\n    \"loopCount\": 0,\n    \"moduleType\": \"focus\",\n    \"showInterestCard\": false\n    }, {\n    \"bottomHasMore\": true,\n    \"hasMore\": true,\n    \"list\": [{\n    \"bubbleText\": \"\",\n    \"contentType\": \"html5\",\n    \"contentUpdatedAt\": 0,\n    \"coverPath\": \"http://fdfs.xmcdn.com/group34/M0A/54/B6/wKgJYVnypRfjrrvpAAA9l0GXd1w940.jpg\",\n    \"enableShare\": false,\n    \"id\": 1907,\n    \"isExternalUrl\": false,\n    \"sharePic\": \"\",\n    \"subtitle\": \"来自耶鲁、清华、北大、南大、长江商学院的严选好课\",\n    \"title\": \"大师课\",\n    \"url\": \"http://m.ximalaya.com/master-class/home.html?ts=1513415847580\"\n    }, {\n    \"bubbleText\": \"\",\n    \"contentType\": \"rank_all_category\",\n    \"contentUpdatedAt\": 0,\n    \"coverPath\": \"http://fdfs.xmcdn.com/group28/M06/A4/7A/wKgJSFlKDNuTm05iAAAbPYISwOY919.jpg\",\n    \"enableShare\": false,\n    \"id\": 1900,\n    \"isExternalUrl\": false,\n    \"sharePic\": \"\",\n    \"subtitle\": \"\",\n    \"title\": \"经典必听\",\n    \"url\": \"\"\n    }, {\n    \"bubbleText\": \"\",\n    \"contentType\": \"daily_listening\",\n    \"contentUpdatedAt\": 0,\n    \"coverPath\": \"http://fdfs.xmcdn.com/group31/M01/D9/47/wKgJSVmMCqiwsMGyAAASGOs-xcg545.jpg\",\n    \"enableShare\": false,\n    \"id\": 1924,\n    \"isExternalUrl\": false,\n    \"sharePic\": \"\",\n    \"subtitle\": \"\",\n    \"title\": \"每日必听\",\n    \"url\": \"\"\n    }, {\n    \"bubbleText\": \"\",\n    \"contentType\": \"html5\",\n    \"contentUpdatedAt\": 0,\n    \"coverPath\": \"http://fdfs.xmcdn.com/group37/M00/51/93/wKgJoFozLqWiCEuTAABsn-UccBI861.jpg\",\n    \"enableShare\": false,\n    \"id\": 2415,\n    \"isExternalUrl\": false,\n    \"sharePic\": \"\",\n    \"subtitle\": \"\",\n    \"title\": \"演员诞生\",\n    \"url\": \"http://m.ximalaya.com/s-activity/a_zjws/index.html?ts=1513415847580\"\n    }, {\n    \"bubbleText\": \"\",\n    \"contentType\": \"html5\",\n    \"contentUpdatedAt\": 0,\n    \"coverPath\": \"http://fdfs.xmcdn.com/group36/M06/60/FA/wKgJUlozYXqypm1PAAAzpVSMxas223.jpg\",\n    \"enableShare\": false,\n    \"id\": 4193,\n    \"isExternalUrl\": false,\n    \"sharePic\": \"\",\n    \"subtitle\": \"\",\n    \"title\": \"主播评选\",\n    \"url\": \"http://hybrid.ximalaya.com/anchor-vote/view/vote_home?ts=1513415847580\"\n    }, {\n    \"bubbleText\": \"\",\n    \"contentType\": \"html5\",\n    \"contentUpdatedAt\": 0,\n    \"coverPath\": \"http://fdfs.xmcdn.com/group36/M02/72/76/wKgJUlouihPT5EOSAABYqoLZtL4411.jpg\",\n    \"enableShare\": false,\n    \"id\": 4098,\n    \"isExternalUrl\": false,\n    \"sharePic\": \"\",\n    \"subtitle\": \"\",\n    \"title\": \"吐槽大会\",\n    \"url\": \"http://m.ximalaya.com/s-activity/a_tcdh/index.html?ts=1513415847580\"\n    }, {\n    \"bubbleText\": \"\",\n    \"contentType\": \"album_detail\",\n    \"contentUpdatedAt\": 0,\n    \"coverPath\": \"http://fdfs.xmcdn.com/group35/M07/A9/CA/wKgJnVoczJ-DPCm1AABB5nClrcs782.jpg\",\n    \"enableShare\": false,\n    \"id\": 2432,\n    \"isExternalUrl\": false,\n    \"properties\": {\n    \"albumId\": 11438153,\n    \"isPaid\": false\n    },\n    \"sharePic\": \"\",\n    \"subtitle\": \"\",\n    \"title\": \"郭德纲\",\n    \"url\": \"\"\n    }, {\n    \"bubbleText\": \"\",\n    \"contentType\": \"html5\",\n    \"contentUpdatedAt\": 0,\n    \"coverPath\": \"http://fdfs.xmcdn.com/group35/M07/A9/C8/wKgJnVoczI_iPzf8AAAXWcRAAfU809.jpg\",\n    \"enableShare\": false,\n    \"id\": 2562,\n    \"isExternalUrl\": false,\n    \"sharePic\": \"\",\n    \"subtitle\": \"\",\n    \"title\": \"天天好书\",\n    \"url\": \"http://m.ximalaya.com/book/home/1511433976483?ts=1513415847580\"\n    }, {\n    \"contentType\": \"local_listen\",\n    \"contentUpdatedAt\": 0,\n    \"coverPath\": \"http://fdfs.xmcdn.com/group28/M00/A6/10/wKgJXFlKDRuQlpcHAAAVErw7f2E306.jpg\",\n    \"enableShare\": false,\n    \"id\": 1913,\n    \"isExternalUrl\": false,\n    \"properties\": {\n    \"cityCode\": \"43_440000_4403\",\n    \"cityTitle\": \"听深圳\"\n    },\n    \"sharePic\": \"\",\n    \"subtitle\": \"\",\n    \"title\": \"听深圳\",\n    \"url\": \"\"\n    }, {\n    \"bubbleText\": \"\",\n    \"contentType\": \"one_click_listen\",\n    \"contentUpdatedAt\": 0,\n    \"coverPath\": \"http://fdfs.xmcdn.com/group30/M03/0E/21/wKgJWlnKKACzyL8gAAAaKrsLlFk144.jpg\",\n    \"enableShare\": false,\n    \"id\": 2346,\n    \"isExternalUrl\": false,\n    \"sharePic\": \"\",\n    \"subtitle\": \"\",\n    \"title\": \"一键听\",\n    \"url\": \"\"\n    }, {\n    \"contentType\": \"subject_list\",\n    \"contentUpdatedAt\": 0,\n    \"coverPath\": \"http://fdfs.xmcdn.com/group29/M00/A3/1F/wKgJWVlKDTTzs1MkAAAQ7zPqNrI988.jpg\",\n    \"enableShare\": false,\n    \"id\": 1918,\n    \"isExternalUrl\": false,\n    \"sharePic\": \"\",\n    \"subtitle\": \"\",\n    \"title\": \"听单\",\n    \"url\": \"\"\n    }, {\n    \"contentType\": \"html5\",\n    \"contentUpdatedAt\": 0,\n    \"coverPath\": \"http://fdfs.xmcdn.com/group29/M00/A3/27/wKgJXVlKDSfDVhXcAAAQnypsz54230.jpg\",\n    \"enableShare\": true,\n    \"id\": 2073,\n    \"isExternalUrl\": false,\n    \"sharePic\": \"http://fdfs.xmcdn.com/group29/M01/49/55/wKgJWVlDpQPTUCWyAAAW0TbHsPc133.jpg\",\n    \"subtitle\": \"\",\n    \"title\": \"小雅音箱\",\n    \"url\": \"https://kdt.im/VxtRFr\"\n    }, {\n    \"bubbleText\": \"\",\n    \"contentType\": \"album_detail\",\n    \"contentUpdatedAt\": 0,\n    \"coverPath\": \"http://fdfs.xmcdn.com/group37/M03/3C/30/wKgJoVoyRnbDXWhSAABPxRtrKIQ408.jpg\",\n    \"enableShare\": false,\n    \"id\": 4189,\n    \"isExternalUrl\": false,\n    \"properties\": {\n    \"albumId\": 11849616,\n    \"isPaid\": false\n    },\n    \"sharePic\": \"\",\n    \"subtitle\": \"\",\n    \"title\": \"国家宝藏\",\n    \"url\": \"\"\n    }, {\n    \"bubbleText\": \"\",\n    \"contentType\": \"html5\",\n    \"contentUpdatedAt\": 0,\n    \"coverPath\": \"http://fdfs.xmcdn.com/group31/M01/37/9F/wKgJX1mDA83A9fwLAAAgMbA9Dgg492.jpg\",\n    \"enableShare\": false,\n    \"id\": 2098,\n    \"isExternalUrl\": false,\n    \"sharePic\": \"\",\n    \"subtitle\": \"\",\n    \"title\": \"边听边读\",\n    \"url\": \"http://m.ximalaya.com/carnival/imgShare/199?ts=1513415847580\"\n    }, {\n    \"bubbleText\": \"\",\n    \"contentType\": \"album_category\",\n    \"contentUpdatedAt\": 0,\n    \"coverPath\": \"http://fdfs.xmcdn.com/group34/M05/E0/78/wKgJYFnyqh3DKj08AAAY3pjZZ3w648.jpg\",\n    \"enableShare\": false,\n    \"id\": 2410,\n    \"isExternalUrl\": false,\n    \"properties\": {\n    \"categoryId\": 33,\n    \"isPaid\": true\n    },\n    \"sharePic\": \"\",\n    \"subtitle\": \"\",\n    \"title\": \"精品\",\n    \"url\": \"\"\n    }],\n    \"loopCount\": 0,\n    \"moduleType\": \"square\",\n    \"showInterestCard\": false\n    }, {\n    \"bottomHasMore\": false,\n    \"hasMore\": true,\n    \"list\": [{\n    \"albumId\": 10985438,\n    \"categoryId\": 9,\n    \"infoType\": \"play_or_score\",\n    \"isDraft\": false,\n    \"isFinished\": 0,\n    \"isPaid\": false,\n    \"isVipFree\": false,\n    \"lastUptrackAt\": 1507507999000,\n    \"materialType\": \"album\",\n    \"pic\": \"http://fdfs.xmcdn.com/group34/M0B/A2/7F/wKgJYVnaY0Cyit8mAAAbgmguwEU972_mobile_large.jpg\",\n    \"playsCount\": 218284,\n    \"recSrc\": \"UCFJ2\",\n    \"recTrack\": \"gylV2A.1016\",\n    \"refundSupportType\": 0,\n    \"subtitle\": \" (45)\",\n    \"title\": \"宋美龄最后的日子\",\n    \"tracksCount\": 45\n    }, {\n    \"albumId\": 9929335,\n    \"categoryId\": 3,\n    \"infoType\": \"play_or_score\",\n    \"isDraft\": false,\n    \"isFinished\": 2,\n    \"isPaid\": false,\n    \"isVipFree\": false,\n    \"lastUptrackAt\": 1502936919000,\n    \"materialType\": \"album\",\n    \"pic\": \"http://fdfs.xmcdn.com/group30/M0B/AF/D7/wKgJXlmOhB_j8tdsAABpB9XTwPE835_mobile_large.jpg\",\n    \"playsCount\": 1598199,\n    \"recSrc\": \"UCFJ2\",\n    \"recTrack\": \"gylV2A.1016\",\n    \"refundSupportType\": 0,\n    \"subtitle\": \"再现了国民党去台高官的人生轨迹\",\n    \"title\": \"国民党去台高官大结局\",\n    \"tracksCount\": 45\n    }, {\n    \"albumId\": 9350191,\n    \"categoryId\": 3,\n    \"commentScore\": 4.5,\n    \"commentsCount\": 19,\n    \"discountedPrice\": 0.30,\n    \"displayDiscountedPrice\": \"0.30喜点/集\",\n    \"displayPrice\": \"0.40喜点/集\",\n    \"infoType\": \"play_or_score\",\n    \"isDraft\": false,\n    \"isFinished\": 0,\n    \"isPaid\": true,\n    \"isVipFree\": false,\n    \"lastUptrackAt\": 1500010892000,\n    \"materialType\": \"album\",\n    \"pic\": \"http://fdfs.xmcdn.com/group32/M07/6B/5F/wKgJS1n1P83jrVaaAAIkl8AajRQ813_mobile_large.jpg\",\n    \"playsCount\": 519676,\n    \"price\": 0.40,\n    \"priceTypeEnum\": 1,\n    \"priceUnit\": \"喜点/集\",\n    \"recSrc\": \"TCPP.145V4\",\n    \"recTrack\": \"gylV2A.1016\",\n    \"refundSupportType\": 0,\n    \"subtitle\": \"吕后的风流史、权谋史\",\n    \"title\": \"吕皇后秘史：吕后的风流与权谋\",\n    \"tracksCount\": 81\n    }, {\n    \"albumId\": 11099404,\n    \"categoryId\": 9,\n    \"infoType\": \"play_or_score\",\n    \"isDraft\": false,\n    \"isFinished\": 2,\n    \"isPaid\": false,\n    \"isVipFree\": false,\n    \"lastUptrackAt\": 1508822529000,\n    \"materialType\": \"album\",\n    \"pic\": \"http://fdfs.xmcdn.com/group34/M05/4C/32/wKgJYFnji6HC4MmiAABPKoe54LU068_mobile_large.jpg\",\n    \"playsCount\": 738405,\n    \"recSrc\": \"UCFJ2\",\n    \"recTrack\": \"gylV2A.1016\",\n    \"refundSupportType\": 0,\n    \"subtitle\": \"老瓦的Q群号：529578630，欢迎粉丝加入​\",\n    \"title\": \"蒋介石秘史\",\n    \"tracksCount\": 46\n    }, {\n    \"albumId\": 2819466,\n    \"categoryId\": 3,\n    \"infoType\": \"play_or_score\",\n    \"isDraft\": false,\n    \"isFinished\": 0,\n    \"isPaid\": false,\n    \"isVipFree\": false,\n    \"lastUptrackAt\": 1489417353000,\n    \"materialType\": \"album\",\n    \"pic\": \"http://fdfs.xmcdn.com/group15/M01/53/D8/wKgDaFW4We2iqeNAAAAr0sBQR4E095_mobile_large.jpg\",\n    \"playsCount\": 389143,\n    \"recSrc\": \"UCFJ2\",\n    \"recTrack\": \"gylV2A.1016\",\n    \"refundSupportType\": 0,\n    \"subtitle\": \"巨人（下）——三毛\",\n    \"title\": \"稻草人手记——三毛\",\n    \"tracksCount\": 19\n    }, {\n    \"adInfo\": {\n    \"adId\": 41766,\n    \"adType\": 0,\n    \"categoryId\": -1,\n    \"clickTokens\": [\"YwVZQoM0ct0yRqlWCQ5Ey2zXqd72H5Lv8J/j/pijPVAMP4I7JKEg9ROkh3k45vQO\", \"pGIz+HO1CjOIf5xpQJ15OhaJ02yptmIOHHcTw5Z8ieQMP4I7JKEg9ROkh3k45vQO\", \"K7Yyon38QPD0slmxEc8rZBH7gPbrYtwMDUQRiqnIO6kMP4I7JKEg9ROkh3k45vQO\"],\n    \"clickType\": 1,\n    \"cover\": \"\",\n    \"description\": \"挽回，就要从人性出发\",\n    \"keywordIds\": [-1],\n    \"link\": \"http://ad.ximalaya.com/adrecord?sdn=H4sIAAAAAAAAAKtWykhNTEktUrLKK83J0VFKzs_PzkyF8QoSixJzU0tSi4qVrKqVElM8S1JzPVOUrJRMDM3NzJRqawHzw8PFPwAAAA&ad=41766&xmly=uiwebview&rec_src=166V10&rec_track=r&cpcPrice=r5IoVoOG%2Fg8fFKy4kfjI4g%3D%3D\",\n    \"openlinkType\": 0,\n    \"order\": 6,\n    \"paid\": false,\n    \"positionName\": \"home_guess_you_like\",\n    \"promoteAlbumId\": 9580491,\n    \"realLink\": \"iting://open?msg_type=13&album_id=9580491\",\n    \"recSrc\": \"166V10\",\n    \"recTrack\": \"r\",\n    \"shareFlag\": false,\n    \"showTokens\": [\"fJPByyd+3gHQMDbW9vOJKsIFIJlHfq1aUSODCcPWfMMMP4I7JKEg9ROkh3k45vQO\", \"HLZCVIjDZ+Z495ns+3M2QhaJ02yptmIOHHcTw5Z8ieQMP4I7JKEg9ROkh3k45vQO\", \"peYoVbw4RjamDTtJdgHSlHe23n4UC7+AyQDfzIDqYT0MP4I7JKEg9ROkh3k45vQO\", \"c4wjTwSdlj5KboHP2MzAsXzcDjO6G8HMrJ6vxFki99gMP4I7JKEg9ROkh3k45vQO\", \"ZceAFSVms6enhPfeoSKM3Mw1LUzf2tmUoYOjgoTERx4MP4I7JKEg9ROkh3k45vQO\"],\n    \"subcategoryId\": -1,\n    \"thirdClickStatUrls\": [],\n    \"thirdShowStatUrls\": [],\n    \"thirdStatUrl\": \"\"\n    },\n    \"albumId\": 9580491,\n    \"categoryId\": 10,\n    \"infoType\": \"play_or_score\",\n    \"isDraft\": false,\n    \"isFinished\": 0,\n    \"isPaid\": false,\n    \"isVipFree\": false,\n    \"lastUptrackAt\": 1513309584000,\n    \"materialType\": \"album\",\n    \"pic\": \"http://fdfs.xmcdn.com/group36/M0B/0C/B2/wKgJUloqeSDj0W9TAAGHxW56gaQ88_mobile_large.jpeg\",\n    \"playsCount\": 949015,\n    \"refundSupportType\": 0,\n    \"subtitle\": \"让你更懂人性，更易挽回\",\n    \"title\": \"女性挽回爱情必听课\",\n    \"tracksCount\": 37\n    }],\n    \"loopCount\": 6,\n    \"moduleType\": \"guessYouLike\",\n    \"showInterestCard\": true\n    }, {\n    \"bottomHasMore\": false,\n    \"hasMore\": true,\n    \"list\": [{\n    \"albumId\": 6737591,\n    \"categoryId\": 6,\n    \"commentScore\": 4.9000000000000003552713678800500929355621337890625,\n    \"commentsCount\": 183,\n    \"discountedPrice\": 49.00,\n    \"displayDiscountedPrice\": \"49.00喜点\",\n    \"displayPrice\": \"49.00喜点\",\n    \"infoType\": \"play_or_score\",\n    \"isDraft\": false,\n    \"isFinished\": 2,\n    \"isPaid\": true,\n    \"isVipFree\": false,\n    \"lastUptrackAt\": 1487130859000,\n    \"materialType\": \"album\",\n    \"pic\": \"http://fdfs.xmcdn.com/group23/M07/89/72/wKgJNFijyQfAIZjBAACd_-M6pms486_mobile_large.jpg\",\n    \"playsCount\": 2589482,\n    \"price\": 49.00,\n    \"priceTypeEnum\": 2,\n    \"priceUnit\": \"喜点\",\n    \"recSrc\": \"TCPB.164V1\",\n    \"recTrack\": \"PayBestB.1001\",\n    \"refundSupportType\": 0,\n    \"subtitle\": \"凯叔改编：逗趣又内涵，西游记就该这么玩\",\n    \"title\": \"凯叔西游记【第四部全集】\",\n    \"tracksCount\": 24\n    }, {\n    \"albumId\": 6159621,\n    \"categoryId\": 6,\n    \"commentScore\": 4.9000000000000003552713678800500929355621337890625,\n    \"commentsCount\": 252,\n    \"discountedPrice\": 49.00,\n    \"displayDiscountedPrice\": \"49.00喜点\",\n    \"displayPrice\": \"49.00喜点\",\n    \"infoType\": \"play_or_score\",\n    \"isDraft\": false,\n    \"isFinished\": 2,\n    \"isPaid\": true,\n    \"isVipFree\": false,\n    \"lastUptrackAt\": 1481865625000,\n    \"materialType\": \"album\",\n    \"pic\": \"http://fdfs.xmcdn.com/group24/M0A/C9/E9/wKgJNVhTYejwoLSTAACNeIsKEb8817_mobile_large.jpg\",\n    \"playsCount\": 5299904,\n    \"price\": 49.00,\n    \"priceTypeEnum\": 2,\n    \"priceUnit\": \"喜点\",\n    \"recSrc\": \"TCPB.164V1\",\n    \"recTrack\": \"PayBestB.1001\",\n    \"refundSupportType\": 0,\n    \"subtitle\": \"凯叔演绎的儿童版西游记：逗趣+内涵\",\n    \"title\": \"凯叔西游记【第二部全集】\",\n    \"tracksCount\": 28\n    }, {\n    \"albumId\": 6676239,\n    \"categoryId\": 6,\n    \"commentScore\": 4.79999999999999982236431605997495353221893310546875,\n    \"commentsCount\": 206,\n    \"discountedPrice\": 49.00,\n    \"displayDiscountedPrice\": \"49.00喜点\",\n    \"displayPrice\": \"49.00喜点\",\n    \"infoType\": \"play_or_score\",\n    \"isDraft\": false,\n    \"isFinished\": 2,\n    \"isPaid\": true,\n    \"isVipFree\": false,\n    \"lastUptrackAt\": 1486627171000,\n    \"materialType\": \"album\",\n    \"pic\": \"http://fdfs.xmcdn.com/group24/M09/6F/4B/wKgJMFicGIXwci3sAACUtdwkAts988_mobile_large.jpg\",\n    \"playsCount\": 3626412,\n    \"price\": 49.00,\n    \"priceTypeEnum\": 2,\n    \"priceUnit\": \"喜点\",\n    \"recSrc\": \"TCPB.164V1\",\n    \"recTrack\": \"PayBestB.1001\",\n    \"refundSupportType\": 0,\n    \"subtitle\": \"凯叔改编：逗趣又内涵，西游记就该这么玩！\",\n    \"title\": \"凯叔西游记【第三部全集】\",\n    \"tracksCount\": 29\n    }],\n    \"loopCount\": 6,\n    \"moduleType\": \"paidCategory\",\n    \"showInterestCard\": false,\n    \"target\": {\n    \"categoryId\": 33\n    },\n    \"title\": \"精品\"\n    }, {\n    \"bottomHasMore\": false,\n    \"categoryId\": 3,\n    \"direction\": \"column\",\n    \"hasMore\": true,\n    \"keywords\": [{\n    \"categoryId\": 3,\n    \"categoryTitle\": \"有声书\",\n    \"keywordId\": 28,\n    \"keywordName\": \"推理\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 3\n    }, {\n    \"categoryId\": 3,\n    \"categoryTitle\": \"有声书\",\n    \"keywordId\": 232,\n    \"keywordName\": \"悬疑\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 3\n    }, {\n    \"categoryId\": 3,\n    \"categoryTitle\": \"有声书\",\n    \"keywordId\": 346,\n    \"keywordName\": \"女生最爱\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 3\n    }, {\n    \"categoryId\": 3,\n    \"categoryTitle\": \"有声书\",\n    \"keywordId\": 407,\n    \"keywordName\": \"官场商战\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 3\n    }, {\n    \"categoryId\": 3,\n    \"categoryTitle\": \"有声书\",\n    \"keywordId\": 238,\n    \"keywordName\": \"武侠\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 3\n    }, {\n    \"categoryId\": 3,\n    \"categoryTitle\": \"有声书\",\n    \"keywordId\": 237,\n    \"keywordName\": \"社科\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 3\n    }, {\n    \"categoryId\": 3,\n    \"categoryTitle\": \"有声书\",\n    \"keywordId\": 231,\n    \"keywordName\": \"言情\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 3\n    }, {\n    \"categoryId\": 3,\n    \"categoryTitle\": \"有声书\",\n    \"keywordId\": 233,\n    \"keywordName\": \"幻想\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 3\n    }, {\n    \"categoryId\": 3,\n    \"categoryTitle\": \"有声书\",\n    \"keywordId\": 235,\n    \"keywordName\": \"都市\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 3\n    }, {\n    \"categoryId\": 3,\n    \"categoryTitle\": \"有声书\",\n    \"keywordId\": 234,\n    \"keywordName\": \"历史\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 3\n    }, {\n    \"categoryId\": 3,\n    \"categoryTitle\": \"有声书\",\n    \"keywordId\": 236,\n    \"keywordName\": \"文学\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 3\n    }, {\n    \"categoryId\": 3,\n    \"categoryTitle\": \"有声书\",\n    \"keywordId\": 408,\n    \"keywordName\": \"经管\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 3\n    }],\n    \"list\": [{\n    \"albumId\": 11885644,\n    \"categoryId\": 3,\n    \"infoType\": \"play_or_score\",\n    \"isDraft\": false,\n    \"isFinished\": 0,\n    \"isPaid\": false,\n    \"isVipFree\": false,\n    \"lastUptrackAt\": 1513340880000,\n    \"materialType\": \"album\",\n    \"pic\": \"http://fdfs.xmcdn.com/group28/M09/70/F8/wKgJSFojmZ-zdPlUAAB4xykpc0w458_mobile_large.jpg\",\n    \"playsCount\": 93844,\n    \"recSrc\": \"f\",\n    \"recTrack\": \"r.20000\",\n    \"refundSupportType\": 0,\n    \"subtitle\": \"江湖人说江湖事\",\n    \"title\": \"肉叔说《江湖丛谈》\",\n    \"tracksCount\": 44\n    }, {\n    \"albumId\": 10712729,\n    \"categoryId\": 3,\n    \"infoType\": \"play_or_score\",\n    \"isDraft\": false,\n    \"isFinished\": 0,\n    \"isPaid\": false,\n    \"isVipFree\": false,\n    \"lastUptrackAt\": 1513333200000,\n    \"materialType\": \"album\",\n    \"pic\": \"http://fdfs.xmcdn.com/group31/M03/73/7D/wKgJX1nDpF6TojxyAARgiz1NMHQ359_mobile_large.png\",\n    \"playsCount\": 12274052,\n    \"recSrc\": \"f\",\n    \"recTrack\": \"r.20000\",\n    \"refundSupportType\": 0,\n    \"subtitle\": \"黑社会 特种兵 独闯江湖\",\n    \"title\": \"猛虎出笼（名扬版）\",\n    \"tracksCount\": 240\n    }, {\n    \"albumId\": 11919135,\n    \"categoryId\": 3,\n    \"commentScore\": 0,\n    \"commentsCount\": 0,\n    \"discountedPrice\": 0.20,\n    \"displayDiscountedPrice\": \"0.20喜点/集\",\n    \"displayPrice\": \"0.20喜点/集\",\n    \"infoType\": \"play_or_score\",\n    \"isDraft\": false,\n    \"isFinished\": 0,\n    \"isPaid\": true,\n    \"isVipFree\": false,\n    \"lastUptrackAt\": 1513375203000,\n    \"materialType\": \"album\",\n    \"pic\": \"http://fdfs.xmcdn.com/group31/M00/10/44/wKgJX1omBwOSyiHYAAJjxTmjdHw723_mobile_large.jpg\",\n    \"playsCount\": 24733,\n    \"price\": 0.20,\n    \"priceTypeEnum\": 1,\n    \"priceUnit\": \"喜点/集\",\n    \"recSrc\": \"f\",\n    \"recTrack\": \"r.20000\",\n    \"refundSupportType\": 0,\n    \"subtitle\": \"江湖八大门传人带你道尽江湖骗术\",\n    \"title\": \"鉴宝生财\",\n    \"tracksCount\": 34\n    }],\n    \"loopCount\": 6,\n    \"moduleType\": \"categoriesForShort\",\n    \"showInterestCard\": false,\n    \"target\": {\n    \"categoryId\": 3\n    },\n    \"title\": \"最热有声书\"\n    }, {\n    \"bottomHasMore\": false,\n    \"categoryId\": 9,\n    \"direction\": \"column\",\n    \"hasMore\": true,\n    \"keywords\": [{\n    \"categoryId\": 9,\n    \"categoryTitle\": \"历史\",\n    \"keywordId\": 270,\n    \"keywordName\": \"三国\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 9\n    }, {\n    \"categoryId\": 9,\n    \"categoryTitle\": \"历史\",\n    \"keywordId\": 85,\n    \"keywordName\": \"百家讲坛\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 9\n    }, {\n    \"categoryId\": 9,\n    \"categoryTitle\": \"历史\",\n    \"keywordId\": 91,\n    \"keywordName\": \"世界史\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 9\n    }, {\n    \"categoryId\": 9,\n    \"categoryTitle\": \"历史\",\n    \"keywordId\": 275,\n    \"keywordName\": \"民国\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 9\n    }, {\n    \"categoryId\": 9,\n    \"categoryTitle\": \"历史\",\n    \"keywordId\": 89,\n    \"keywordName\": \"名人传\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 9\n    }, {\n    \"categoryId\": 9,\n    \"categoryTitle\": \"历史\",\n    \"keywordId\": 271,\n    \"keywordName\": \"魏晋\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 9\n    }, {\n    \"categoryId\": 9,\n    \"categoryTitle\": \"历史\",\n    \"keywordId\": 86,\n    \"keywordName\": \"中国史\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 9\n    }, {\n    \"categoryId\": 9,\n    \"categoryTitle\": \"历史\",\n    \"keywordId\": 274,\n    \"keywordName\": \"明清\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 9\n    }, {\n    \"categoryId\": 9,\n    \"categoryTitle\": \"历史\",\n    \"keywordId\": 272,\n    \"keywordName\": \"隋唐\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 9\n    }, {\n    \"categoryId\": 9,\n    \"categoryTitle\": \"历史\",\n    \"keywordId\": 273,\n    \"keywordName\": \"宋元\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 9\n    }, {\n    \"categoryId\": 9,\n    \"categoryTitle\": \"历史\",\n    \"keywordId\": 268,\n    \"keywordName\": \"春秋战国\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 9\n    }, {\n    \"categoryId\": 9,\n    \"categoryTitle\": \"历史\",\n    \"keywordId\": 269,\n    \"keywordName\": \"秦汉\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 9\n    }],\n    \"list\": [{\n    \"albumId\": 10646371,\n    \"categoryId\": 9,\n    \"commentScore\": 4.9000000000000003552713678800500929355621337890625,\n    \"commentsCount\": 86,\n    \"discountedPrice\": 128.00,\n    \"displayDiscountedPrice\": \"128.00喜点\",\n    \"displayPrice\": \"128.00喜点\",\n    \"displayVipPrice\": \"121.60喜点\",\n    \"infoType\": \"play_or_score\",\n    \"isDraft\": false,\n    \"isFinished\": 0,\n    \"isPaid\": true,\n    \"isVipFree\": false,\n    \"lastUptrackAt\": 1513292400000,\n    \"materialType\": \"album\",\n    \"pic\": \"http://fdfs.xmcdn.com/group32/M08/E0/2D/wKgJS1nBKyCBR8kNAAIk51FF9i4945_mobile_large.jpg\",\n    \"playsCount\": 648166,\n    \"price\": 128.00,\n    \"priceTypeEnum\": 2,\n    \"priceUnit\": \"喜点\",\n    \"recSrc\": \"f\",\n    \"recTrack\": \"r.20000\",\n    \"refundSupportType\": 0,\n    \"subtitle\": \"高晓松眼中国内讲《资治通鉴》最好的学者\",\n    \"title\": \"姜鹏精读《资治通鉴》\",\n    \"tracksCount\": 50,\n    \"vipPrice\": 121.60\n    }, {\n    \"albumId\": 7192588,\n    \"categoryId\": 9,\n    \"infoType\": \"play_or_score\",\n    \"isDraft\": false,\n    \"isFinished\": 0,\n    \"isPaid\": false,\n    \"isVipFree\": false,\n    \"lastUptrackAt\": 1513240865000,\n    \"materialType\": \"album\",\n    \"pic\": \"http://fdfs.xmcdn.com/group27/M03/2E/B8/wKgJR1jL_hLCT8afAAR2h4UvEFg601_mobile_large.jpg\",\n    \"playsCount\": 3330089,\n    \"recSrc\": \"f\",\n    \"recTrack\": \"r.20000\",\n    \"refundSupportType\": 0,\n    \"subtitle\": \"以史为鉴，受益终身\",\n    \"title\": \"缺失的历史课\",\n    \"tracksCount\": 60\n    }, {\n    \"albumId\": 8291530,\n    \"categoryId\": 9,\n    \"infoType\": \"play_or_score\",\n    \"isDraft\": false,\n    \"isFinished\": 0,\n    \"isPaid\": false,\n    \"isVipFree\": false,\n    \"lastUptrackAt\": 1513165459000,\n    \"materialType\": \"album\",\n    \"pic\": \"http://fdfs.xmcdn.com/group28/M05/62/A0/wKgJSFkn-2TDJDTmAAPtFtS38Pk707_mobile_large.jpg\",\n    \"playsCount\": 60484,\n    \"refundSupportType\": 0,\n    \"subtitle\": \"南京大屠杀纪念：为真相而战斗的80年风雨路\",\n    \"title\": \"大锤说史\",\n    \"tracksCount\": 55\n    }],\n    \"loopCount\": 6,\n    \"moduleType\": \"categoriesForShort\",\n    \"showInterestCard\": false,\n    \"target\": {\n    \"categoryId\": 9\n    },\n    \"title\": \"历史\"\n    }, {\n    \"list\": [],\n    \"moduleType\": \"ad\",\n    \"showInterestCard\": false\n    }, {\n    \"bottomHasMore\": false,\n    \"hasMore\": true,\n    \"list\": [{\n    \"columnType\": 1,\n    \"contentType\": \"1\",\n    \"coverPath\": \"http://fdfs.xmcdn.com/group36/M08/94/D0/wKgJUlo0pwKTpWDIAAIfNlbfdc4460_mobile_small.jpg\",\n    \"footnote\": \"14张专辑\",\n    \"specialId\": 1610,\n    \"subtitle\": \"好的综艺节目一定是引起人最深处的情感共鸣，\\r\\n唤起你以为遗失了的那份纯真\",\n    \"title\": \"【周末必追】2017年最火的霸屏综艺\"\n    }, {\n    \"columnType\": 1,\n    \"contentType\": \"1\",\n    \"coverPath\": \"http://fdfs.xmcdn.com/group37/M01/5C/B3/wKgJoFozqfbzPidMAAF59m7yPIk748_mobile_small.jpg\",\n    \"footnote\": \"15张专辑\",\n    \"specialId\": 1611,\n    \"subtitle\": \"明星亲自当主播，与你分享他的生活点滴 华晨宇、佟大为、angelababy、丁当、陈楚生等当红明星卸下明星光环，以最真实的姿态，和你聊一聊心事\",\n    \"title\": \"明星和你聊心事·15档最真实的明星电台  \"\n    }, {\n    \"columnType\": 1,\n    \"contentType\": \"2\",\n    \"coverPath\": \"http://fdfs.xmcdn.com/group36/M07/1B/D7/wKgJUlox4bjxn6MdAACTn0-Xj3E231_mobile_small.jpg\",\n    \"footnote\": \"6首声音\",\n    \"specialId\": 1617,\n    \"subtitle\": \"\\r\\n 最近《咬文嚼字》杂志公布了2017年十大流行语，小编厚着脸皮要到了授权，一起来听听过去这一年，有哪些话成为了我们的日常口头禅\",\n    \"title\": \"2017年度流行语大盘点\"\n    }, {\n    \"columnType\": 1,\n    \"contentType\": \"2\",\n    \"coverPath\": \"http://fdfs.xmcdn.com/group30/M01/7A/92/wKgJXll6piHTA1xoAANc0E2MSSE576_mobile_small.jpg\",\n    \"footnote\": \"24首声音\",\n    \"specialId\": 1258,\n    \"subtitle\": \"当红主播马红漫博士又开讲啦！老马在28期节目中与你分享俞敏洪、雷军、董明珠等30位中国当代创业家的智慧人生\",\n    \"title\": \"舍得智慧讲堂丨一场成功人士的必修课\"\n    }],\n    \"loopCount\": 0,\n    \"moduleType\": \"playlist\",\n    \"showInterestCard\": false,\n    \"title\": \"精品听单\"\n    }, {\n    \"bottomHasMore\": false,\n    \"categoryId\": 10,\n    \"direction\": \"row\",\n    \"hasMore\": true,\n    \"keywords\": [{\n    \"categoryId\": 10,\n    \"categoryTitle\": \"情感生活\",\n    \"keywordId\": 308,\n    \"keywordName\": \"魅力养成\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 10\n    }, {\n    \"categoryId\": 10,\n    \"categoryTitle\": \"情感生活\",\n    \"keywordId\": 45,\n    \"keywordName\": \"恋爱技巧\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 10\n    }, {\n    \"categoryId\": 10,\n    \"categoryTitle\": \"情感生活\",\n    \"keywordId\": 49,\n    \"keywordName\": \"亲子感情\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 10\n    }, {\n    \"categoryId\": 10,\n    \"categoryTitle\": \"情感生活\",\n    \"keywordId\": 305,\n    \"keywordName\": \"个人成长\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 10\n    }, {\n    \"categoryId\": 10,\n    \"categoryTitle\": \"情感生活\",\n    \"keywordId\": 306,\n    \"keywordName\": \"品质生活\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 10\n    }, {\n    \"categoryId\": 10,\n    \"categoryTitle\": \"情感生活\",\n    \"keywordId\": 281,\n    \"keywordName\": \"心理健康\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 10\n    }, {\n    \"categoryId\": 10,\n    \"categoryTitle\": \"情感生活\",\n    \"keywordId\": 422,\n    \"keywordName\": \"婚姻家庭\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 10\n    }, {\n    \"categoryId\": 10,\n    \"categoryTitle\": \"情感生活\",\n    \"keywordId\": 50,\n    \"keywordName\": \"职场人际\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 10\n    }, {\n    \"categoryId\": 10,\n    \"categoryTitle\": \"情感生活\",\n    \"keywordId\": 46,\n    \"keywordName\": \"睡前夜话\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 10\n    }, {\n    \"categoryId\": 10,\n    \"categoryTitle\": \"情感生活\",\n    \"keywordId\": 380,\n    \"keywordName\": \"情绪压力\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 10\n    }],\n    \"list\": [{\n    \"albumId\": 11454188,\n    \"categoryId\": 10,\n    \"commentScore\": 5,\n    \"commentsCount\": 20,\n    \"discountedPrice\": 69.00,\n    \"displayDiscountedPrice\": \"69.00喜点\",\n    \"displayPrice\": \"99.00喜点\",\n    \"displayVipPrice\": \"65.55喜点\",\n    \"infoType\": \"play_or_score\",\n    \"isDraft\": false,\n    \"isFinished\": 0,\n    \"isPaid\": true,\n    \"isVipFree\": false,\n    \"lastUptrackAt\": 1513216067000,\n    \"materialType\": \"album\",\n    \"pic\": \"http://fdfs.xmcdn.com/group33/M02/04/B7/wKgJTFoDvlPQPvgXAAClxr2Y6Qs51_mobile_large.jpeg\",\n    \"playsCount\": 41128,\n    \"price\": 99.00,\n    \"priceTypeEnum\": 2,\n    \"priceUnit\": \"喜点\",\n    \"recSrc\": \"f\",\n    \"recTrack\": \"r.20000\",\n    \"refundSupportType\": 0,\n    \"subtitle\": \"【精品】同居三年你为什么人财两空？\",\n    \"title\": \"张敏律师讲婚姻:如何捍卫情与利\",\n    \"tracksCount\": 16,\n    \"vipPrice\": 65.55\n    }, {\n    \"albumId\": 354251,\n    \"categoryId\": 10,\n    \"infoType\": \"play_or_score\",\n    \"isDraft\": false,\n    \"isFinished\": 0,\n    \"isPaid\": false,\n    \"isVipFree\": false,\n    \"lastUptrackAt\": 1513180267000,\n    \"materialType\": \"album\",\n    \"pic\": \"http://fdfs.xmcdn.com/group23/M04/11/0E/wKgJNFgW0EiSjyZDAAGLbZx-Uiw917_mobile_large.jpg\",\n    \"playsCount\": 33460519,\n    \"recSrc\": \"f\",\n    \"recTrack\": \"r.20000\",\n    \"refundSupportType\": 0,\n    \"subtitle\": \"【精品】别急着结束一个人的生活\",\n    \"title\": \"青音情感电台\",\n    \"tracksCount\": 897\n    }, {\n    \"adInfo\": {\n    \"adId\": 35359,\n    \"adType\": 0,\n    \"categoryId\": 10,\n    \"clickTokens\": [\"V1bhpl2t1n3RTeKwe6fEyzZILmLmi9f7C4Ejvuj4vcjqIUTMQZdErKOYroHIBtIy\", \"VNPbayAqQMhBOpMhHnfQ2cTbNeC41zrBMosm/B11x8vqIUTMQZdErKOYroHIBtIy\", \"JmX4Sk93DtxqoUz1RvONOdsdq555qWvUxz3QEEnTNE/qIUTMQZdErKOYroHIBtIy\"],\n    \"clickType\": 1,\n    \"cover\": \"\",\n    \"description\": \"挽回爱人挽救婚姻治理婚外情\",\n    \"keywordIds\": [-1],\n    \"link\": \"http://ad.ximalaya.com/adrecord?sdn=H4sIAAAAAAAAAKtWykhNTEktUrLKK83J0VFKzs_PzkyF8QoSixJzU0tSi4qVrKqVElM8S1JzPVOUrJSMTY1NLZVqawFpxhu_PwAAAA&ad=35359&xmly=uiwebview&rec_src=166V10&rec_track=r&cpcPrice=iNUXGJX8K9jTYR4i4u3Kiw%3D%3D\",\n    \"openlinkType\": 0,\n    \"order\": 3,\n    \"paid\": false,\n    \"positionName\": \"home_category_card\",\n    \"promoteAlbumId\": 420730,\n    \"realLink\": \"iting://open?msg_type=13&album_id=420730\",\n    \"recSrc\": \"166V10\",\n    \"recTrack\": \"r\",\n    \"shareFlag\": false,\n    \"showTokens\": [\"0M7c8JfMdAPoPp/ZVhrgFFxUmbz3Y6FUNdVdQazaYS/qIUTMQZdErKOYroHIBtIy\", \"mgoIevCekCVjL8wetYTiAkEnCQURzc7HzLuRMUCobr7qIUTMQZdErKOYroHIBtIy\", \"DWK4Uh3oN0dfmf+P8Fnj4u7n4XwoYxMiCJ2zuryDLaLqIUTMQZdErKOYroHIBtIy\", \"YdcIF4PrG0qiUJCEkyvJ6gHcFf39AMJDi8Y8NXvYBU7qIUTMQZdErKOYroHIBtIy\", \"pA5TwaThsSwiJ1r0ERgNFtK8ax+QsjGAV6wcXa/lCdfqIUTMQZdErKOYroHIBtIy\"],\n    \"subcategoryId\": -1,\n    \"thirdClickStatUrls\": [],\n    \"thirdShowStatUrls\": [],\n    \"thirdStatUrl\": \"\"\n    },\n    \"albumId\": 420730,\n    \"categoryId\": 10,\n    \"infoType\": \"play_or_score\",\n    \"isDraft\": false,\n    \"isFinished\": 0,\n    \"isPaid\": false,\n    \"isVipFree\": false,\n    \"lastUptrackAt\": 1513303488000,\n    \"materialType\": \"album\",\n    \"pic\": \"http://fdfs.xmcdn.com/group36/M08/E9/7D/wKgJUlowyW_CtjSvAADvS3eHFgE686_mobile_large.jpg\",\n    \"playsCount\": 758893,\n    \"recSrc\": \"f\",\n    \"recTrack\": \"r.20000\",\n    \"refundSupportType\": 0,\n    \"subtitle\": \"有效管理婚外情的独家秘诀\",\n    \"title\": \"婚外情治理\",\n    \"tracksCount\": 364\n    }],\n    \"loopCount\": 6,\n    \"moduleType\": \"categoriesForLong\",\n    \"showInterestCard\": false,\n    \"target\": {\n    \"categoryId\": 10\n    },\n    \"title\": \"情感生活\"\n    }, {\n    \"bottomHasMore\": false,\n    \"categoryId\": 6,\n    \"direction\": \"column\",\n    \"hasMore\": true,\n    \"keywords\": [{\n    \"categoryId\": 6,\n    \"categoryTitle\": \"儿童\",\n    \"keywordId\": 155,\n    \"keywordName\": \"故事\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 6\n    }, {\n    \"categoryId\": 6,\n    \"categoryTitle\": \"儿童\",\n    \"keywordId\": 151,\n    \"keywordName\": \"科普\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 6\n    }, {\n    \"categoryId\": 6,\n    \"categoryTitle\": \"儿童\",\n    \"keywordId\": 154,\n    \"keywordName\": \"家教\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 6\n    }, {\n    \"categoryId\": 6,\n    \"categoryTitle\": \"儿童\",\n    \"keywordId\": 567,\n    \"keywordName\": \"绘本\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 6\n    }, {\n    \"categoryId\": 6,\n    \"categoryTitle\": \"儿童\",\n    \"keywordId\": 336,\n    \"keywordName\": \"卡通\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 6\n    }, {\n    \"categoryId\": 6,\n    \"categoryTitle\": \"儿童\",\n    \"keywordId\": 337,\n    \"keywordName\": \"儿歌\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 6\n    }, {\n    \"categoryId\": 6,\n    \"categoryTitle\": \"儿童\",\n    \"keywordId\": 150,\n    \"keywordName\": \"英语\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 6\n    }, {\n    \"categoryId\": 6,\n    \"categoryTitle\": \"儿童\",\n    \"keywordId\": 152,\n    \"keywordName\": \"国学\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 6\n    }, {\n    \"categoryId\": 6,\n    \"categoryTitle\": \"儿童\",\n    \"keywordId\": 569,\n    \"keywordName\": \"名著\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 6\n    }, {\n    \"categoryId\": 6,\n    \"categoryTitle\": \"儿童\",\n    \"keywordId\": 604,\n    \"keywordName\": \"小学教材\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 6\n    }],\n    \"list\": [{\n    \"albumId\": 6715154,\n    \"categoryId\": 6,\n    \"infoType\": \"play_or_score\",\n    \"isDraft\": false,\n    \"isFinished\": 0,\n    \"isPaid\": false,\n    \"isVipFree\": false,\n    \"lastUptrackAt\": 1513332001000,\n    \"materialType\": \"album\",\n    \"pic\": \"http://fdfs.xmcdn.com/group27/M02/71/CA/wKgJW1kAjp-D5eVYAAG7tjikXCY900_mobile_large.jpg\",\n    \"playsCount\": 9732817,\n    \"recSrc\": \"f\",\n    \"recTrack\": \"r.20000\",\n    \"refundSupportType\": 0,\n    \"subtitle\": \"心理学的角度打造实用、权威的育儿宝典\",\n    \"title\": \"超级育儿师-好妈妈从这里开始\",\n    \"tracksCount\": 127\n    }, {\n    \"albumId\": 11940288,\n    \"categoryId\": 6,\n    \"infoType\": \"play_or_score\",\n    \"isDraft\": false,\n    \"isFinished\": 0,\n    \"isPaid\": false,\n    \"isVipFree\": false,\n    \"lastUptrackAt\": 1513163345000,\n    \"materialType\": \"album\",\n    \"pic\": \"http://fdfs.xmcdn.com/group36/M08/60/04/wKgJUloopjrTBh8pAAEc86rdmXI174_mobile_large.jpg\",\n    \"playsCount\": 32241,\n    \"refundSupportType\": 0,\n    \"subtitle\": \"别嫌性教育太早，坏人不嫌孩子太小\",\n    \"title\": \"远离性侵，从性教育开始\",\n    \"tracksCount\": 4\n    }, {\n    \"albumId\": 10846734,\n    \"categoryId\": 6,\n    \"commentScore\": 4.29999999999999982236431605997495353221893310546875,\n    \"commentsCount\": 10,\n    \"discountedPrice\": 19.90,\n    \"displayDiscountedPrice\": \"19.90喜点\",\n    \"displayPrice\": \"19.90喜点\",\n    \"displayVipPrice\": \"18.91喜点\",\n    \"infoType\": \"play_or_score\",\n    \"isDraft\": false,\n    \"isFinished\": 0,\n    \"isPaid\": true,\n    \"isVipFree\": false,\n    \"lastUptrackAt\": 1506757370000,\n    \"materialType\": \"album\",\n    \"pic\": \"http://fdfs.xmcdn.com/group30/M09/A2/CC/wKgJWlnPaxng-_kcAAPC8GfM6J8973_mobile_large.jpg\",\n    \"playsCount\": 151329,\n    \"price\": 19.90,\n    \"priceTypeEnum\": 2,\n    \"priceUnit\": \"喜点\",\n    \"refundSupportType\": 0,\n    \"subtitle\": \"省去所有早教费的智商开发课\",\n    \"title\": \"年糕妈妈：宝宝怎么带更聪明\",\n    \"tracksCount\": 19,\n    \"vipPrice\": 18.91\n    }],\n    \"loopCount\": 6,\n    \"moduleType\": \"categoriesForLong\",\n    \"showInterestCard\": false,\n    \"target\": {\n    \"categoryId\": 6\n    },\n    \"title\": \"亲子时光\"\n    }, {\n    \"bottomHasMore\": false,\n    \"categoryId\": 12,\n    \"direction\": \"column\",\n    \"hasMore\": true,\n    \"keywords\": [{\n    \"categoryId\": 12,\n    \"categoryTitle\": \"相声评书\",\n    \"keywordId\": 561,\n    \"keywordName\": \"青曲茶馆\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 12\n    }, {\n    \"categoryId\": 12,\n    \"categoryTitle\": \"相声评书\",\n    \"keywordId\": 411,\n    \"keywordName\": \"单田芳\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 12\n    }, {\n    \"categoryId\": 12,\n    \"categoryTitle\": \"相声评书\",\n    \"keywordId\": 582,\n    \"keywordName\": \"刘兰芳\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 12\n    }, {\n    \"categoryId\": 12,\n    \"categoryTitle\": \"相声评书\",\n    \"keywordId\": 549,\n    \"keywordName\": \"单口相声\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 12\n    }, {\n    \"categoryId\": 12,\n    \"categoryTitle\": \"相声评书\",\n    \"keywordId\": 35,\n    \"keywordName\": \"名家评书\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 12\n    }, {\n    \"categoryId\": 12,\n    \"categoryTitle\": \"相声评书\",\n    \"keywordId\": 560,\n    \"keywordName\": \"相声江湖\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 12\n    }, {\n    \"categoryId\": 12,\n    \"categoryTitle\": \"相声评书\",\n    \"keywordId\": 420,\n    \"keywordName\": \"新锐笑将\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 12\n    }, {\n    \"categoryId\": 12,\n    \"categoryTitle\": \"相声评书\",\n    \"keywordId\": 30,\n    \"keywordName\": \"热门相声\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 12\n    }, {\n    \"categoryId\": 12,\n    \"categoryTitle\": \"相声评书\",\n    \"keywordId\": 556,\n    \"keywordName\": \"郭德纲\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 12\n    }],\n    \"list\": [{\n    \"albumId\": 11824025,\n    \"categoryId\": 12,\n    \"infoType\": \"play_or_score\",\n    \"isDraft\": false,\n    \"isFinished\": 0,\n    \"isPaid\": false,\n    \"isVipFree\": false,\n    \"lastUptrackAt\": 1511968400000,\n    \"materialType\": \"album\",\n    \"pic\": \"http://fdfs.xmcdn.com/group35/M00/BB/C1/wKgJnVoezo6iv8BOAAEFuF5Q8Po856_mobile_large.jpg\",\n    \"playsCount\": 443779,\n    \"recSrc\": \"f\",\n    \"recTrack\": \"r.20000\",\n    \"refundSupportType\": 0,\n    \"title\": \"传统单口相声 第五季\",\n    \"tracksCount\": 16\n    }, {\n    \"albumId\": 9742533,\n    \"categoryId\": 12,\n    \"infoType\": \"play_or_score\",\n    \"isDraft\": false,\n    \"isFinished\": 0,\n    \"isPaid\": false,\n    \"isVipFree\": false,\n    \"lastUptrackAt\": 1502969079000,\n    \"materialType\": \"album\",\n    \"pic\": \"http://fdfs.xmcdn.com/group31/M09/20/E2/wKgJSVmBiHCgQDh3AAApsFjA_e4761_mobile_large.jpg\",\n    \"playsCount\": 2579116,\n    \"recSrc\": \"f\",\n    \"recTrack\": \"r.20000\",\n    \"refundSupportType\": 0,\n    \"subtitle\": \"小岳岳，张力捧及更多德云社精彩节目！\",\n    \"title\": \"德云社相声全集\",\n    \"tracksCount\": 729\n    }, {\n    \"albumId\": 10817349,\n    \"categoryId\": 12,\n    \"commentScore\": 3.79999999999999982236431605997495353221893310546875,\n    \"commentsCount\": 6,\n    \"discountedPrice\": 18.88,\n    \"displayDiscountedPrice\": \"18.88喜点\",\n    \"displayPrice\": \"32.00喜点\",\n    \"displayVipPrice\": \"17.94喜点\",\n    \"infoType\": \"play_or_score\",\n    \"isDraft\": false,\n    \"isFinished\": 0,\n    \"isPaid\": true,\n    \"isVipFree\": false,\n    \"lastUptrackAt\": 1506514397000,\n    \"materialType\": \"album\",\n    \"pic\": \"http://fdfs.xmcdn.com/group30/M01/32/6A/wKgJWlnLY9CAaJ9BAAU_H1uqU2Q684_mobile_large.png\",\n    \"playsCount\": 94665,\n    \"price\": 32.00,\n    \"priceTypeEnum\": 2,\n    \"priceUnit\": \"喜点\",\n    \"refundSupportType\": 0,\n    \"subtitle\": \"一票难求的场次\",\n    \"title\": \"2017青曲社“十年一鉴”全国巡演三之票房火Boom爆\",\n    \"tracksCount\": 18,\n    \"vipPrice\": 17.94\n    }],\n    \"loopCount\": 6,\n    \"moduleType\": \"categoriesForLong\",\n    \"showInterestCard\": false,\n    \"target\": {\n    \"categoryId\": 12\n    },\n    \"title\": \"相声评书\"\n    }, {\n    \"list\": [],\n    \"moduleType\": \"ad\",\n    \"showInterestCard\": false\n    }, {\n    \"bottomHasMore\": false,\n    \"hasMore\": true,\n    \"list\": [{\n    \"actualEndAt\": 0,\n    \"actualStartAt\": 1513404183034,\n    \"categoryId\": 32,\n    \"categoryName\": \"情感\",\n    \"chatId\": 97063,\n    \"coverLarge\": \"http://fdfs.xmcdn.com/group36/M00/90/20/wKgJUlo0jGzRkzMnAAEbPHYKcDQ5206455_mobile_large\",\n    \"coverMiddle\": \"http://fdfs.xmcdn.com/group36/M00/90/20/wKgJUlo0jGzRkzMnAAEbPHYKcDQ5206455_mobile_meduim\",\n    \"coverSmall\": \"http://fdfs.xmcdn.com/group36/M00/90/20/wKgJUlo0jGzRkzMnAAEbPHYKcDQ5206455_mobile_small\",\n    \"description\": \"愿做你的暖心大白💝陪你一段清浅时光\\n话题:撩与喜欢有什么区别？\",\n    \"endAt\": 1513407600140,\n    \"id\": 348705,\n    \"name\": \"歪，敌方还有五秒钟到达战场~\",\n    \"nickname\": \"珍视_MC白院长\",\n    \"onlineCount\": 0,\n    \"playCount\": 1005,\n    \"recSrc\": \"live.165V3\",\n    \"recTrack\": \"liveV1.1023\",\n    \"roomId\": 23437,\n    \"startAt\": 1513404000140,\n    \"status\": 9,\n    \"uid\": 33660856\n    }, {\n    \"actualEndAt\": 0,\n    \"actualStartAt\": 1513413507047,\n    \"categoryId\": 49,\n    \"categoryName\": \"陪聊\",\n    \"chatId\": 92289,\n    \"coverLarge\": \"http://fdfs.xmcdn.com/group36/M0A/9D/6E/wKgJUlo01gehhVCTAADw3K1MoXY0968308_mobile_large\",\n    \"coverMiddle\": \"http://fdfs.xmcdn.com/group36/M0A/9D/6E/wKgJUlo01gehhVCTAADw3K1MoXY0968308_mobile_meduim\",\n    \"coverSmall\": \"http://fdfs.xmcdn.com/group36/M0A/9D/6E/wKgJUlo01gehhVCTAADw3K1MoXY0968308_mobile_small\",\n    \"description\": \"\",\n    \"endAt\": 1513418400956,\n    \"id\": 349384,\n    \"name\": \"【沉琳静月】百天啦！百天啦！\",\n    \"nickname\": \"Se7en_琳狐\",\n    \"onlineCount\": 0,\n    \"playCount\": 492,\n    \"roomId\": 17192,\n    \"startAt\": 1513414800956,\n    \"status\": 9,\n    \"uid\": 90776212\n    }, {\n    \"actualEndAt\": 0,\n    \"actualStartAt\": 1513410571133,\n    \"categoryId\": 49,\n    \"categoryName\": \"陪聊\",\n    \"chatId\": 100114,\n    \"coverLarge\": \"http://fdfs.xmcdn.com/group36/M04/9C/6B/wKgJUlo00AqQ6VY_AAL21oVrzMk726_mobile_large.jpg\",\n    \"coverMiddle\": \"http://fdfs.xmcdn.com/group36/M04/9C/6B/wKgJUlo00AqQ6VY_AAL21oVrzMk726_mobile_meduim.jpg\",\n    \"coverSmall\": \"http://fdfs.xmcdn.com/group36/M04/9C/6B/wKgJUlo00AqQ6VY_AAL21oVrzMk726_mobile_small.jpg\",\n    \"description\": \"粉丝群379109182，微博；鸿羽轩-阁\",\n    \"endAt\": 0,\n    \"id\": 349343,\n    \"name\": \"小叙片刻\",\n    \"nickname\": \"King_鸿羽轩\",\n    \"onlineCount\": 0,\n    \"playCount\": 180,\n    \"roomId\": 27682,\n    \"startAt\": 1513410570989,\n    \"status\": 9,\n    \"uid\": 95755100\n    }],\n    \"loopCount\": 3,\n    \"moduleType\": \"live\",\n    \"showInterestCard\": false,\n    \"title\": \"直播\"\n    }, {\n    \"bottomHasMore\": false,\n    \"categoryId\": 4,\n    \"direction\": \"column\",\n    \"hasMore\": true,\n    \"keywords\": [{\n    \"categoryId\": 4,\n    \"categoryTitle\": \"娱乐\",\n    \"keywordId\": 137,\n    \"keywordName\": \"方言秀\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 4\n    }, {\n    \"categoryId\": 4,\n    \"categoryTitle\": \"娱乐\",\n    \"keywordId\": 135,\n    \"keywordName\": \"八卦精选\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 4\n    }, {\n    \"categoryId\": 4,\n    \"categoryTitle\": \"娱乐\",\n    \"keywordId\": 421,\n    \"keywordName\": \"鬼故事\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 4\n    }, {\n    \"categoryId\": 4,\n    \"categoryTitle\": \"娱乐\",\n    \"keywordId\": 134,\n    \"keywordName\": \"脱口秀\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 4\n    }, {\n    \"categoryId\": 4,\n    \"categoryTitle\": \"娱乐\",\n    \"keywordId\": 136,\n    \"keywordName\": \"明星电台\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 4\n    }, {\n    \"categoryId\": 4,\n    \"categoryTitle\": \"娱乐\",\n    \"keywordId\": 133,\n    \"keywordName\": \"热门综艺\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 4\n    }, {\n    \"categoryId\": 4,\n    \"categoryTitle\": \"娱乐\",\n    \"keywordId\": 508,\n    \"keywordName\": \"段子笑话\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 4\n    }, {\n    \"categoryId\": 4,\n    \"categoryTitle\": \"娱乐\",\n    \"keywordId\": 138,\n    \"keywordName\": \"星座运势\",\n    \"keywordType\": 1,\n    \"materialType\": \"keyword\",\n    \"realCategoryId\": 4\n    }],\n    \"list\": [{\n    \"albumId\": 11486581,\n    \"categoryId\": 4,\n    \"infoType\": \"play_or_score\",\n    \"isDraft\": false,\n    \"isFinished\": 0,\n    \"isPaid\": false,\n    \"isVipFree\": false,\n    \"lastUptrackAt\": 1512716946000,\n    \"materialType\": \"album\",\n    \"pic\": \"http://fdfs.xmcdn.com/group32/M04/3C/66/wKgJS1oFUF_y3XsLAABv1Gek0vg629_mobile_large.jpg\",\n    \"playsCount\": 118306,\n    \"recSrc\": \"f\",\n    \"recTrack\": \"r.20000\",\n    \"refundSupportType\": 0,\n    \"subtitle\": \"方清平相声精选，每日更新\",\n    \"title\": \"方清平相声精选\",\n    \"tracksCount\": 103\n    }, {\n    \"albumId\": 11697761,\n    \"categoryId\": 4,\n    \"infoType\": \"play_or_score\",\n    \"isDraft\": false,\n    \"isFinished\": 0,\n    \"isPaid\": false,\n    \"isVipFree\": false,\n    \"lastUptrackAt\": 1513341442000,\n    \"materialType\": \"album\",\n    \"pic\": \"http://fdfs.xmcdn.com/group36/M0A/FF/4C/wKgJUloqWjPjL8cXAAHHZ5KuWTE095_mobile_large.jpg\",\n    \"playsCount\": 34914,\n    \"recSrc\": \"f\",\n    \"recTrack\": \"r.20000\",\n    \"refundSupportType\": 0,\n    \"subtitle\": \"7岁就精通高中物理的神童，长大后与爱因斯坦齐名！\",\n    \"title\": \"天才简史\",\n    \"tracksCount\": 6\n    }, {\n    \"albumId\": 11656098,\n    \"categoryId\": 4,\n    \"infoType\": \"play_or_score\",\n    \"isDraft\": false,\n    \"isFinished\": 0,\n    \"isPaid\": false,\n    \"isVipFree\": false,\n    \"lastUptrackAt\": 1512990016000,\n    \"materialType\": \"album\",\n    \"pic\": \"http://fdfs.xmcdn.com/group33/M00/F9/08/wKgJUVodOzmwhcJKAAcnhTRH1rs070_mobile_large.jpg\",\n    \"playsCount\": 100236,\n    \"recSrc\": \"f\",\n    \"recTrack\": \"r.20000\",\n    \"refundSupportType\": 0,\n    \"subtitle\": \"6个日本恐怖都市传说|鬼叔怪谈\",\n    \"title\": \"鬼叔怪谈\",\n    \"tracksCount\": 12\n    }],\n    \"loopCount\": 6,\n    \"moduleType\": \"categoriesForExplore\",\n    \"showInterestCard\": false,\n    \"target\": {\n    \"categoryId\": 4\n    },\n    \"title\": \"综艺娱乐\"\n    }, {\n    \"list\": [],\n    \"moduleType\": \"ad\",\n    \"showInterestCard\": false\n    }, {\n    \"list\": [],\n    \"moduleType\": \"recommendAlbum\",\n    \"showInterestCard\": false,\n    \"title\": \"为你推荐\"\n    }],\n    \"msg\": \"0\",\n    \"ret\": 0\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Common/Manager/HCURLNavigatorManager.swift",
    "content": "\n//\n//  HCURLNavigatorManager.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/1/10.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport URLNavigator\n\nlet navigatorShareInstance = HCURLNavigatorManager.shareInstance\n\nclass HCURLNavigatorManager {\n    \n    let navigator = Navigator()\n    \n    static let shareInstance = HCURLNavigatorManager()\n    private init() {\n        navigator.register(\"myapp://login\") { (_, _, _) in\n            return HCBaseNavigationController(rootViewController: HCLoginViewController())\n        }\n        navigator.register(\"myapp://setting\") { (_, _, _) in\n            return HCSettingViewController()\n        }\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Common/Protocol/HCCellStyleable/HCCellStyleable.swift",
    "content": "\n//\n//  HCCellStyleable.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/1/8.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport Then\nimport SnapKit\n\n// MARK:- 常量\nfileprivate struct Metric {\n    \n    static let margin: CGFloat = 10.0       // 边距\n    static let lineHeight: CGFloat = 0.5    // 细线高度\n}\n\npublic enum HCCellLineStyle : Int {\n    case `default`                   // 无横线\n    case none                   // 无横线\n    case full                   // 充满\n    case margin                 // 有左右边距\n    case marginLeft             // 有左边距\n    case marginRight            // 有右边距\n}\n\nprotocol HCCellStyleable {\n    \n}\n\nextension HCCellStyleable where Self : UITableViewCell {\n    \n    // MARK:- 横线\n    func bottomLine(style: HCCellLineStyle) -> UIView {\n        \n        // 创建组件\n        let bottomLine = UIView().then {\n            $0.backgroundColor = kThemeLightGreyColor\n        }\n        \n        // 添加组件\n        self.addSubview(bottomLine)\n\n        // 添加约束\n        bottomLine.snp.makeConstraints { (make) in\n            make.height.equalTo(Metric.lineHeight)\n            make.left.equalTo(self)\n            make.right.equalTo(self)\n            make.bottom.equalTo(self.snp.bottom).offset(-Metric.lineHeight)\n        }\n        \n        // 调整样式\n        switch style {\n        case .none:\n            bottomLine.isHidden = true\n            break\n        case .full:\n            bottomLine.isHidden = false\n            bottomLine.snp.updateConstraints({ (make) in\n                make.left.equalTo(0)\n            })\n            break\n        case .margin:\n            bottomLine.isHidden = false\n            bottomLine.snp.updateConstraints({ (make) in\n                make.left.equalTo(Metric.margin * 2)\n                make.right.equalTo(-Metric.margin * 2)\n            })\n            break\n        case .marginLeft:\n            bottomLine.isHidden = false\n            bottomLine.snp.updateConstraints({ (make) in\n                make.left.equalTo(Metric.margin * 2)\n            })\n            break\n        case .marginRight:\n            bottomLine.isHidden = false\n            bottomLine.snp.updateConstraints({ (make) in\n                make.right.equalTo(-Metric.margin * 2)\n            })\n            break\n        default:\n            break\n        }\n        return bottomLine\n    }\n}\n\nextension HCCellStyleable where Self : UICollectionViewCell {\n    \n    // MARK:- 横线\n    func topLine(style: HCCellLineStyle) -> UIView {\n        \n        // 创建组件\n        let topLine = UIView().then {\n            $0.backgroundColor = kThemeLightGreyColor\n        }\n        \n        // 添加组件\n        self.addSubview(topLine)\n        \n        // 添加约束\n        topLine.snp.makeConstraints { (make) in\n            make.height.equalTo(Metric.lineHeight)\n            make.left.equalTo(self)\n            make.right.equalTo(self)\n            make.top.equalTo(self.snp.top).offset(Metric.lineHeight)\n        }\n        \n        // 调整样式\n        switch style {\n        case .none:\n            topLine.isHidden = true\n            break\n        case .full:\n            topLine.isHidden = false\n            topLine.snp.updateConstraints({ (make) in\n                make.left.equalTo(0)\n            })\n            break\n        case .margin:\n            topLine.isHidden = false\n            topLine.snp.updateConstraints({ (make) in\n                make.left.equalTo(Metric.margin * 2)\n                make.right.equalTo(-Metric.margin * 2)\n            })\n            break\n        case .marginLeft:\n            topLine.isHidden = false\n            topLine.snp.updateConstraints({ (make) in\n                make.left.equalTo(Metric.margin * 2)\n            })\n            break\n        case .marginRight:\n            topLine.isHidden = false\n            topLine.snp.updateConstraints({ (make) in\n                make.right.equalTo(-Metric.margin * 2)\n            })\n            break\n        default:\n            break\n        }\n        return topLine\n    }\n\n    // MARK:- 横线\n    func bottomLine(style: HCCellLineStyle) -> UIView {\n        \n        // 创建组件\n        let bottomLine = UIView().then {\n            $0.backgroundColor = kThemeLightGreyColor\n        }\n        \n        // 添加组件\n        self.addSubview(bottomLine)\n        \n        // 添加约束\n        bottomLine.snp.makeConstraints { (make) in\n            make.height.equalTo(Metric.lineHeight)\n            make.left.equalTo(self)\n            make.right.equalTo(self)\n            make.bottom.equalTo(self.snp.bottom).offset(-Metric.lineHeight)\n        }\n        \n        // 调整样式\n        switch style {\n        case .none:\n            bottomLine.isHidden = true\n            break\n        case .full:\n            bottomLine.isHidden = false\n            bottomLine.snp.updateConstraints({ (make) in\n                make.left.equalTo(0)\n            })\n            break\n        case .margin:\n            bottomLine.isHidden = false\n            bottomLine.snp.updateConstraints({ (make) in\n                make.left.equalTo(Metric.margin * 2)\n                make.right.equalTo(Metric.margin * 2)\n            })\n            break\n        case .marginLeft:\n            bottomLine.isHidden = false\n            bottomLine.snp.updateConstraints({ (make) in\n                make.left.equalTo(Metric.margin * 2)\n            })\n            break\n        case .marginRight:\n            bottomLine.isHidden = false\n            bottomLine.snp.updateConstraints({ (make) in\n                make.right.equalTo(Metric.margin * 2)\n            })\n            break\n        default:\n            break\n        }\n        return bottomLine\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Common/Protocol/MJRefresh/HCRefreshable.swift",
    "content": "//\n//  HCRefreshable.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/16.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport Foundation\nimport RxSwift\nimport RxCocoa\nimport NSObject_Rx\nimport MJRefresh\n\nenum HCRefreshStatus {\n    case none\n    case beingHeaderRefresh\n    case endHeaderRefresh\n    case beingFooterRefresh\n    case endFooterRefresh\n    case noMoreData\n}\n\nprotocol OutputRefreshProtocol {\n\n    var refreshStatus : Variable<HCRefreshStatus> { get }\n}\nextension OutputRefreshProtocol {\n    func autoSetRefreshHeaderStatus(header: MJRefreshHeader?, footer: MJRefreshFooter?) -> Disposable {\n        return refreshStatus.asObservable().subscribe(onNext: { (status) in\n            switch status {\n            case .beingHeaderRefresh:\n                header?.beginRefreshing()\n            case .endHeaderRefresh:\n                header?.endRefreshing()\n            case .beingFooterRefresh:\n                footer?.beginRefreshing()\n            case .endFooterRefresh:\n                footer?.endRefreshing()\n            case .noMoreData:\n                footer?.endRefreshingWithNoMoreData()\n            default:\n                break\n            }\n        })\n    }\n}\n\nprotocol HCRefreshable {\n    \n}\n\nextension HCRefreshable where Self : UIViewController {\n    \n    \n    func initRefreshGifHeader(_ scrollView: UIScrollView, _ action: @escaping () -> Void) -> MJRefreshHeader {\n        \n        let header = HCRefreshGifHeader(refreshingBlock: { action() })\n        let iamges = [UIImage(named: \"pullToRefresh_0\")!,\n                     UIImage(named: \"pullToRefresh_1\")!,\n                     UIImage(named: \"pullToRefresh_2\")!,\n                     UIImage(named: \"pullToRefresh_3\")!,\n                     UIImage(named: \"pullToRefresh_4\")!,\n                     UIImage(named: \"pullToRefresh_5\")!,\n                     UIImage(named: \"pullToRefresh_6\")!,\n                     UIImage(named: \"pullToRefresh_6\")!,\n                     UIImage(named: \"pullToRefresh_7\")!,\n                     UIImage(named: \"pullToRefresh_8\")!,\n                     UIImage(named: \"pullToRefresh_9\") as Any]\n        \n        header?.setTitle(\"分享付费专辑，还可以赚钱哦\", for: .pulling)\n        header?.lastUpdatedTimeLabel.isHidden = true\n        header?.setImages(iamges, for: .pulling)\n        scrollView.mj_header = header\n        return scrollView.mj_header\n    }\n    \n    func initRefreshHeader(_ scrollView: UIScrollView, _ action: @escaping () -> Void) -> MJRefreshHeader {\n        scrollView.mj_header = MJRefreshNormalHeader(refreshingBlock: { action() })\n        return scrollView.mj_header\n    }\n    \n    func initRefreshFooter(_ scrollView: UIScrollView, _ action: @escaping () -> Void) -> MJRefreshFooter {\n        scrollView.mj_footer = MJRefreshAutoNormalFooter(refreshingBlock: { action() })\n        return scrollView.mj_footer\n    }\n}\n\nextension HCRefreshable where Self : UIScrollView {\n    \n    func initRefreshGifHeader(_ scrollView: UIScrollView, _ action: @escaping () -> Void) -> MJRefreshHeader {\n        \n        let header = HCRefreshGifHeader(refreshingBlock: { action() })\n        let iamges = [UIImage(named: \"pullToRefresh_0\")!,\n                      UIImage(named: \"pullToRefresh_1\")!,\n                      UIImage(named: \"pullToRefresh_2\")!,\n                      UIImage(named: \"pullToRefresh_3\")!,\n                      UIImage(named: \"pullToRefresh_4\")!,\n                      UIImage(named: \"pullToRefresh_5\")!,\n                      UIImage(named: \"pullToRefresh_6\")!,\n                      UIImage(named: \"pullToRefresh_6\")!,\n                      UIImage(named: \"pullToRefresh_7\")!,\n                      UIImage(named: \"pullToRefresh_8\")!,\n                      UIImage(named: \"pullToRefresh_9\") as Any]\n        header?.setTitle(\"分享付费专辑，还可以赚钱哦\", for: .pulling)\n        header?.lastUpdatedTimeLabel.isHidden = true\n        header?.setImages(iamges, for: .pulling)\n        scrollView.mj_header = header\n        return scrollView.mj_header\n    }\n\n    func initRefreshHeader(_ action: @escaping () -> Void) -> MJRefreshHeader {\n        mj_header = MJRefreshNormalHeader(refreshingBlock: { action() })\n        return mj_header\n    }\n    \n    func initRefreshFooter(_ action: @escaping () -> Void) -> MJRefreshFooter {\n        mj_footer = MJRefreshAutoNormalFooter(refreshingBlock: { action()})\n        return mj_footer\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Common/Protocol/UINavigationBar/HCNavBackable.swift",
    "content": "//\n//  HCNavBackable.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/14.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//  返回按钮\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport NSObject_Rx\n\nprotocol HCNavBackable {\n\n}\n\nextension HCNavBackable where Self : UIViewController {\n    \n    func back(onNext: @escaping ()->Void) {\n        \n        let item = UIBarButtonItem(image: UIImage(named: \"icon_back_h\"), style: .plain, target: nil, action: nil)\n        item.rx.tap.do(onNext: {\n            onNext()\n        }).subscribe().disposed(by: rx.disposeBag)\n        \n        if (navigationItem.leftBarButtonItems?.count ?? 0) == 0 {\n            navigationItem.leftBarButtonItems = [item]\n        } else {\n            var items: [UIBarButtonItem] = [] + navigationItem.leftBarButtonItems!\n            items.append(item)\n            navigationItem.leftBarButtonItems = items\n        }\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Common/Protocol/UINavigationBar/HCNavDownloadable.swift",
    "content": "//\n//  HCNavDownloadable.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/14.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//  下载按钮\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport NSObject_Rx\n\nprotocol HCNavDownloadable {\n    \n}\n\nextension HCNavDownloadable where Self : UIViewController {\n    \n    func download(onNext: @escaping ()->Void) {\n        \n        let item = UIBarButtonItem(image: UIImage(named: \"top_download_n\"), style: .plain, target: nil, action: nil)\n        item.rx.tap.do(onNext: {\n            onNext()\n        }).subscribe().disposed(by: rx.disposeBag)\n        \n        if (navigationItem.rightBarButtonItems?.count ?? 0) == 0 {\n            navigationItem.rightBarButtonItems = [item]\n        } else {\n            var items: [UIBarButtonItem] = [] + navigationItem.rightBarButtonItems!\n            items.append(item)\n            navigationItem.rightBarButtonItems = items\n        }        \n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Common/Protocol/UINavigationBar/HCNavHistoryable.swift",
    "content": "//\n//  HCNavHistoryable.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/14.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//  历史记录按钮\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport NSObject_Rx\n\nprotocol HCNavHistoryable {\n    \n}\n\nextension HCNavHistoryable where Self : UIViewController {\n    \n    func history(onNext: @escaping ()->Void) {\n        \n        let item = UIBarButtonItem(image: UIImage(named: \"top_history_n\"), style: .plain, target: nil, action: nil)\n        item.rx.tap.do(onNext: {\n            onNext()\n        }).subscribe().disposed(by: rx.disposeBag)\n        \n        if (navigationItem.rightBarButtonItems?.count ?? 0) == 0 {\n            navigationItem.rightBarButtonItems = [item]\n        } else {\n            var items: [UIBarButtonItem] = [] + navigationItem.rightBarButtonItems!\n            items.append(item)\n            navigationItem.rightBarButtonItems = items\n        }\n        \n        let fixedSpace = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)\n        fixedSpace.width = -20.0\n        navigationItem.rightBarButtonItems = [fixedSpace] + navigationItem.rightBarButtonItems!\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Common/Protocol/UINavigationBar/HCNavMessageable.swift",
    "content": "//\n//  HCNavMessageable.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/14.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//  消息按钮\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport NSObject_Rx\n\nprotocol HCNavMessageable {\n    \n}\n\nextension HCNavMessageable where Self : UIViewController {\n    \n    func message(onNext: @escaping ()->Void) {\n        \n        let item = UIBarButtonItem(image: UIImage(named: \"top_message_n\"), style: .plain, target: nil, action: nil)\n        item.rx.tap.do(onNext: {\n            onNext()\n        }).subscribe().disposed(by: rx.disposeBag)\n        \n        if (navigationItem.leftBarButtonItems?.count ?? 0) == 0 {\n            navigationItem.leftBarButtonItems = [item]\n        } else {\n            var items: [UIBarButtonItem] = [] + navigationItem.leftBarButtonItems!\n            items.append(item)\n            navigationItem.leftBarButtonItems = items\n        }\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Common/Protocol/UINavigationBar/HCNavSearchable.swift",
    "content": "//\n//  HCNavSearchable.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/14.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//  搜索图标\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport NSObject_Rx\n\nprotocol HCNavSearchable {\n    \n}\n\nextension HCNavSearchable where Self : UIViewController {\n    \n    func search(onNext: @escaping ()->Void) {\n        \n        let item = UIBarButtonItem(image: UIImage(named: \"icon_search_n\"), style: .plain, target: nil, action: nil)\n        item.rx.tap.do(onNext: {\n            onNext()\n        }).subscribe().disposed(by: rx.disposeBag)\n        \n        if (navigationItem.rightBarButtonItems?.count ?? 0) == 0 {\n            navigationItem.rightBarButtonItems = [item]\n        } else {\n            var items: [UIBarButtonItem] = [] + navigationItem.rightBarButtonItems!\n            items.append(item)\n            navigationItem.rightBarButtonItems = items\n        }\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Common/Protocol/UINavigationBar/HCNavSettingable.swift",
    "content": "//\n//  HCNavSettingable.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/14.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//  设置按钮\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport NSObject_Rx\n\nprotocol HCNavSettingable {\n    \n}\n\nextension HCNavSettingable where Self : UIViewController {\n    \n    func setting(onNext: @escaping ()->Void) {\n        \n        let item = UIBarButtonItem(image: UIImage(named: \"meSetNor\"), style: .plain, target: nil, action: nil)\n        item.rx.tap.do(onNext: {\n            onNext()\n        }).subscribe().disposed(by: rx.disposeBag)\n        \n        if (navigationItem.leftBarButtonItems?.count ?? 0) == 0 {\n            navigationItem.leftBarButtonItems = [item]\n        } else {\n            var items: [UIBarButtonItem] = [] + navigationItem.leftBarButtonItems!\n            items.append(item)\n            navigationItem.leftBarButtonItems = items\n        }\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Common/Protocol/UINavigationBar/HCNavTitleable.swift",
    "content": "//\n//  HCNavTitleable.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/16.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//  设置 导航栏标题视图\n\nimport UIKit\n\nprotocol HCNavTitleable {\n    \n}\n\nextension HCNavTitleable where Self : UIViewController {\n    \n    // MARK:- 导航栏 自定义标题 通用组件\n    func titleView(titleView : UIView) -> UIView {\n        \n        navigationItem.titleView = titleView\n        return titleView\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Common/Protocol/UINavigationBar/HCNavUniversalable.swift",
    "content": "//\n//  HCNavUniversalable.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/15.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//  通用组件集合\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport NSObject_Rx\n\n// MARK:- 常量\nfileprivate struct Metric {\n    \n    static let itemSize: CGFloat = 30.0\n}\n\n// MARK:- 导航栏 通用组件\nstruct HCNavigationBarItemMetric {\n    \n    // Left\n    static let back = HCNavigationBarItemModel(type: .back,\n                                        position: .left,\n                                        description: \"返回\",\n                                        imageNamed: \"icon_back_h\")\n    \n    static let downBack = HCNavigationBarItemModel(type: .back,\n                                               position: .left,\n                                               description: \"返回\",\n                                               imageNamed: \"playpage_icon_down_white\", highlightedImageNamed: \"playpage_icon_down_white_HL\")\n\n    static let message = HCNavigationBarItemModel(type: .message,\n                                           position: .left,\n                                           description: \"消息\",\n                                           imageNamed: \"top_message_n\")\n    \n    static let meMessage = HCNavigationBarItemModel(type: .message,\n                                           position: .left,\n                                           description: \"消息\",\n                                           imageNamed: \"meMesNor\")\n    \n    static let setting = HCNavigationBarItemModel(type: .setting,\n                                           position: .left,\n                                           description: \"设置\",\n                                           imageNamed: \"meSetNor\")\n\n    // Right\n    \n    static let share = HCNavigationBarItemModel(type: .share,\n                                                position: .right,\n                                                description: \"分享\",\n                                                imageNamed: \"playpage_icon_share_white\", highlightedImageNamed: \"playpage_icon_share_white_HL\")\n    \n    static let more = HCNavigationBarItemModel(type: .more,\n                                               position: .right,\n                                               description: \"工具\",\n                                               imageNamed: \"playpage_icon_more_white\", highlightedImageNamed: \"playpage_icon_more_white_HL\")\n    \n    static let history = HCNavigationBarItemModel(type: .history,\n                                           position: .right,\n                                           description: \"历史记录\",\n                                           imageNamed: \"top_history_n\")\n\n    static let download = HCNavigationBarItemModel(type: .download,\n                                            position: .right,\n                                            description: \"下载\",\n                                            imageNamed: \"top_download_n\")\n\n    static let search = HCNavigationBarItemModel(type: .search,\n                                          position: .right,\n                                          description: \"搜索\",\n                                          imageNamed: \"icon_search_n\")\n    \n    static let homeSearchBar = HCNavigationBarItemModel(type: .homeSearchBar,\n                                          position: .center,\n                                          description: \"首页搜索栏\",\n                                          imageNamed: \"\")\n    \n    static let mineAnchors = HCNavigationBarItemModel(type: .mineAnchors,\n                                             position: .right,\n                                             description: \"主播工作台\",\n                                             imageNamed: \"\")\n    \n    static let searchBar = HCNavigationBarItemModel(type: .searchBar(index: 0, desc: \"\"),\n                                                 position: .center,\n                                                 description: \"搜索页面\",\n                                                 imageNamed: \"\")\n    \n    // 登录页面-注册\n    static let loginRegister = HCNavigationBarItemModel(type: .title(index: 0, title: \"注册\"),\n                                          position: .right,\n                                          title: \"注册\",\n                                          description: \"登录页面-注册\")\n}\n\nprotocol HCNavUniversalable {\n    \n}\n\n// MARK:- 添加到视图的组件，需要自己主动设置位置\nextension HCNavUniversalable where Self : UIView {\n    \n    // MARK:- 导航栏 通用组件\n    func universal(model: HCNavigationBarItemModel, onNext: @escaping (_ model: HCNavigationBarItemModel)->Void) -> UIView {\n        \n        // 创建组件\n        let view = UIView().then {\n            $0.backgroundColor = .clear\n        }\n        let btn = UIButton().then {\n            // 设置属性\n            $0.contentMode = .scaleAspectFit\n            $0.setTitle(model.title, for: .normal)\n            $0.setBackgroundImage(UIImage(named: model.imageNamed), for: .normal)\n            // 处理点击事件\n            $0.rx.tapGesture().when(.recognized)\n                .subscribe({ _ in\n                    onNext(model)\n                }).disposed(by: rx.disposeBag)\n        }\n        \n        // 添加组件\n        view.addSubview(btn)\n        \n        self.addSubview(view)\n        \n        // 添加约束\n        // 此处必须指定一个大小\n        view.snp.makeConstraints { (make) in\n            make.width.height.equalTo(Metric.itemSize)\n            make.centerY.equalToSuperview()\n        }\n        \n        btn.snp.makeConstraints { (make) in\n            make.center.equalToSuperview()\n        }\n        \n        return view\n    }\n}\n\n// MARK:- 添加到控制器的组件，指定位置即可\nextension HCNavUniversalable where Self : UIViewController {\n    \n    // MARK:- 导航栏 通用组件\n    func universal(model: HCNavigationBarItemModel, onNext: @escaping (_ model: HCNavigationBarItemModel)->Void) {\n\n        var item: UIBarButtonItem\n        \n        if model.title != nil {\n            // 标题\n            item = UIBarButtonItem(title: model.title, style: .plain, target: nil, action: nil)\n            item.rx.tap.do(onNext: {\n                onNext(model)\n            }).subscribe().disposed(by: rx.disposeBag)\n\n        } else {\n            // 图标\n            let btn = UIButton(type: .custom)\n            btn.setBackgroundImage(UIImage(named: model.imageNamed), for: .normal)\n            if model.highlightedImageNamed.characters.count > 0 {\n                btn.setBackgroundImage(UIImage(named: model.highlightedImageNamed), for: .highlighted)\n            }\n            item = UIBarButtonItem(customView: btn)\n            btn.rx.tap.do(onNext: {\n                onNext(model)\n            }).subscribe().disposed(by: rx.disposeBag)        }\n        \n        switch model.position {\n            \n        case .left:\n            \n            if (navigationItem.leftBarButtonItems?.count ?? 0) == 0 {\n                navigationItem.leftBarButtonItems = [item]\n            } else {\n                var items: [UIBarButtonItem] = [] + navigationItem.leftBarButtonItems!\n                items.append(item)\n                navigationItem.leftBarButtonItems = items\n            }\n            break\n            \n        case .right:\n            \n            if (navigationItem.rightBarButtonItems?.count ?? 0) == 0 {\n                navigationItem.rightBarButtonItems = [item]\n            } else {\n                var items: [UIBarButtonItem] = [] + navigationItem.rightBarButtonItems!\n                items.append(item)\n                navigationItem.rightBarButtonItems = items\n            }\n            break\n            \n        default :\n            break\n        }\n    }\n    \n    // MARK:- 导航栏 通用组件\n    func universals(modelArr: [HCNavigationBarItemModel], onNext: @escaping (_ model: HCNavigationBarItemModel)->Void) {\n        \n        modelArr.enumerated().forEach { (index, element) in\n            \n            let temp = element\n            \n            self.universal(model: temp) { model in\n                \n                onNext(model)\n            }\n        }\n    }\n}\n\n// MARK:- 导航栏 通用组件 数据模型\nstruct HCNavigationBarItemModel {\n    \n    enum HCNavigationBarItemPosition {\n        case left\n        case center\n        case right\n    }\n    \n    enum HCNavigationBarItemType {\n        case back\n        case share\n        case more\n        case title(index: Int, title: String)\n        case message\n        case history\n        case download\n        case search\n        case setting\n        case homeSearchBar              // 首页搜索栏\n        case searchBar(index: Int, desc: String)      // 搜索页面 (1、2、3 分别表示 搜索栏、语音按钮、取消)\n        case mineAnchors                // 主播工作台\n    }\n    \n    var type: HCNavigationBarItemType\n    var position: HCNavigationBarItemPosition\n    var title: String?\n    var description: String\n    var imageNamed: String\n    var highlightedImageNamed: String\n\n    init(type: HCNavigationBarItemType, position: HCNavigationBarItemPosition, title: String, description: String) {\n        \n        self.type = type\n        self.position = position\n        self.title = title\n        self.description = description\n        self.imageNamed = \"\"\n        self.highlightedImageNamed = \"\"\n    }\n\n    init(type: HCNavigationBarItemType, position: HCNavigationBarItemPosition, description: String, imageNamed: String) {\n        \n        self.type = type\n        self.position = position\n        self.title = nil\n        self.description = description\n        self.imageNamed = imageNamed\n        self.highlightedImageNamed = \"\"\n    }\n    \n    init(type: HCNavigationBarItemType, position: HCNavigationBarItemPosition, description: String, imageNamed: String, highlightedImageNamed: String) {\n        \n        self.type = type\n        self.position = position\n        self.title = nil\n        self.description = description\n        self.imageNamed = imageNamed\n        self.highlightedImageNamed = highlightedImageNamed\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Common/Protocol/UIView/HCMineAnchorsable/HCMineAnchorsable.swift",
    "content": "//\n//  HCMineAnchorsable.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/14.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//  主播控制台\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport NSObject_Rx\nimport Then\nimport SnapKit\nimport RxGesture\n\n// MARK:- 常量\nfileprivate struct Metric {\n    \n    static let title: String = \"主播工作台\"\n    static let fontSize: CGFloat = 15.0\n}\n\nprotocol HCMineAnchorsable {\n    \n}\n\nextension HCMineAnchorsable where Self : UIView {\n    \n    // MARK:- 自定义组件\n    func mineAnchors(model: HCNavigationBarItemModel, onNext: @escaping (_ model: HCNavigationBarItemModel)->Void) -> (UIView, UIView) {\n        \n        // 创建组件\n        let view = UIView().then {\n            // 圆角\n            $0.backgroundColor = .clear\n            // 处理点击事件\n            $0.rx.tapGesture().when(.recognized)\n                .subscribe({ _ in\n                    onNext(model)\n                }).disposed(by: rx.disposeBag)\n        }\n        let backgroundView = UIView().then {\n            // 圆角\n            $0.backgroundColor = kThemeOrangeRedColor\n        }\n        let lab = UILabel().then {\n            $0.textColor = UIColor.black\n            $0.font = UIFont.systemFont(ofSize: Metric.fontSize)\n            $0.text = Metric.title\n        }\n        let icon = UIImageView().then {\n            $0.contentMode = .scaleAspectFit\n            $0.image = UIImage(named: \"PHGradeArrow\")\n        }\n        \n        // 添加组件\n        view.addSubview(backgroundView)\n        view.addSubview(lab)\n        view.addSubview(icon)\n        \n        self.addSubview(view)\n        \n        // 添加约束\n        backgroundView.snp.makeConstraints { (make) in\n            make.left.right.top.bottom.equalToSuperview()\n        }\n        \n        icon.snp.makeConstraints { (make) in\n            make.top.equalToSuperview().offset(MetricGlobal.margin)\n            make.right.equalToSuperview().offset(-MetricGlobal.margin)\n            make.centerY.equalToSuperview()\n        }\n        \n        lab.snp.makeConstraints { (make) in\n            make.right.equalTo(icon.snp.left).offset(-MetricGlobal.margin / 2)\n            make.centerY.equalTo(icon)\n            make.left.equalToSuperview().offset(MetricGlobal.margin)\n        }\n        \n        return (view, backgroundView)\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Common/Protocol/UIView/HCNibloadable/HCNibloadable.swift",
    "content": "//\n//  UIView+Nibloadable.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/17.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nprotocol NibLoadable { }\n\nextension NibLoadable where Self : UIView {\n    \n    static func loadFromNib(_ nibNmae :String? = nil) -> Self {\n        return Bundle.main.loadNibNamed(nibNmae ?? \"\\(self)\", owner: nil, options: nil)?.first as! Self\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Common/Protocol/UIView/HCSearchBarable/HCHomeSearchBarable.swift",
    "content": "//\n//  HCHomeSearchBarable.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/15.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//  首页导航栏 标题搜索\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport RxGesture\nimport NSObject_Rx\nimport Then\nimport SnapKit\n\n// MARK:- 常量\nfileprivate struct Metric {\n    \n    static let title: String = \"养生 | 健身 | 艾灸 | 国家宝藏 | 72小时情感急症室\"\n    static let fontSize: CGFloat = 13.0\n    \n    static let iconWidth: CGFloat = 20.0\n    static let searchBarWidth: CGFloat = kScreenW - MetricGlobal.margin * 16\n    static let searchBarHeight: CGFloat = 30.0\n}\n\nprotocol HCHomeSearchBarable {\n    \n}\n\nextension HCHomeSearchBarable where Self : UIView {\n    \n    // MARK:- 自定义组件\n    func searchBar(model: HCNavigationBarItemModel, onNext: @escaping (_ model: HCNavigationBarItemModel)->Void) -> UIView {\n        \n        // 创建组件\n        let view = UIView().then {\n            $0.backgroundColor = .clear\n        }\n        let backView = UIView().then {\n            $0.backgroundColor = kThemeGainsboroColor\n            $0.layer.cornerRadius = Metric.searchBarHeight / 2\n            // 处理点击事件\n            $0.rx.tapGesture().when(.recognized)\n                .subscribe({ _ in\n                    onNext(model)\n                }).disposed(by: rx.disposeBag)\n        }\n        let icon = UIImageView().then {\n            $0.contentMode = .scaleAspectFit\n            $0.image = UIImage(named: \"search_btn_norm\")\n        }\n        let lab = UILabel().then {\n            $0.textColor = kThemeGreyColor\n            $0.font = UIFont.systemFont(ofSize: Metric.fontSize)\n            $0.text = Metric.title\n        }\n        \n        // 添加组件\n        backView.addSubview(icon)\n        backView.addSubview(lab)\n        \n        view.addSubview(backView)\n        \n        self.addSubview(view)\n        \n        // 添加约束\n        view.snp.makeConstraints { (make) in\n            make.width.equalTo(Metric.searchBarWidth)\n            make.height.equalTo(Metric.searchBarHeight)\n        }\n        \n        backView.snp.makeConstraints { (make) in\n            make.left.right.top.bottom.equalToSuperview()\n        }\n        \n        icon.snp.makeConstraints { (make) in\n            make.width.equalTo(Metric.iconWidth)\n            make.left.equalToSuperview().offset(MetricGlobal.margin)\n            make.centerY.equalToSuperview()\n        }\n        \n        lab.snp.makeConstraints { (make) in\n            make.left.equalTo(icon.snp.right).offset(MetricGlobal.margin / 2)\n            make.centerY.equalTo(icon)\n            make.right.lessThanOrEqualToSuperview().offset(-MetricGlobal.margin)\n        }\n        \n        return view\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Common/Protocol/UIView/HCSearchBarable/HCSearchControllerable.swift",
    "content": "//\n//  HCSearchControllerable.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/15.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//  搜索页面 标题搜索\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport RxGesture\nimport NSObject_Rx\nimport Then\nimport SnapKit\n\n// MARK:- 常量\nfileprivate struct Metric {\n    \n    static let title: String = \"搜索专辑、主播、广播、声音、大吉大利，晚上吃鸡\"\n    static let labFontSize: CGFloat = 13.0\n    static let btnFontSize: CGFloat = 15.0\n    \n    static let searchBarWidth: CGFloat = kScreenW - MetricGlobal.margin * 2\n    static let searchBarHeight: CGFloat = 30.0\n\n    static let searchIconWidth: CGFloat = 30.0\n    static let recordIconWidth: CGFloat = 20.0\n    static let cancelBtnWidth: CGFloat = 40.0\n}\n\nprotocol HCSearchControllerable {\n    \n}\n\nextension HCSearchControllerable where Self : UIView {\n    \n    // MARK:- 自定义组件\n    func searchBar(model: HCNavigationBarItemModel, onNext: @escaping (_ model: HCNavigationBarItemModel)->Void) -> UIView {\n        \n        // 创建组件\n        let view = UIView().then {\n            $0.backgroundColor = .clear\n        }\n        let backView = UIView().then {\n            $0.backgroundColor = kThemeGainsboroColor\n            $0.layer.cornerRadius = Metric.searchBarHeight / 2\n        }\n        let icon = UIImageView().then {\n            $0.contentMode = .scaleAspectFit\n            $0.image = UIImage(named: \"search_btn_norm\")\n        }\n        let searchField = UITextField().then {\n            $0.clearButtonMode = .whileEditing\n            $0.becomeFirstResponder()           // 成为焦点\n            $0.tintColor = kThemeTomatoColor    // 光标颜色\n            $0.font = UIFont.systemFont(ofSize: Metric.labFontSize)\n            $0.placeholder = Metric.title\n            // 处理点击事件\n            $0.rx.tapGesture().when(.recognized)\n                .subscribe({ _ in\n                    var tModel = model\n                    tModel.type = .searchBar(index: 1, desc: \"输入框\")\n                    onNext(tModel)\n                }).disposed(by: rx.disposeBag)\n        }\n        let record = UIImageView().then {\n            // 设置属性\n            $0.contentMode = .scaleAspectFit\n            $0.image = UIImage(named: \"MCRecord\")\n\n            // 处理点击事件\n            $0.rx.tapGesture().when(.recognized)\n                .subscribe({ _ in\n                    var tModel = model\n                    tModel.type = .searchBar(index: 2, desc: \"录音按钮\")\n                    onNext(tModel)\n                }).disposed(by: rx.disposeBag)\n        }\n        \n        let cancel = UIButton().then {\n            // 设置属性\n            $0.setTitle(\"取消\", for: .normal)\n            $0.setTitleColor(kThemeDimGrayColor, for: .normal)\n            $0.setTitleColor(kThemeGreyColor, for: .highlighted)\n            $0.titleLabel?.font = UIFont.systemFont(ofSize: Metric.btnFontSize)\n            // 处理点击事件\n            $0.rx.tap.do(onNext: {\n                var tModel = model\n                tModel.type = .searchBar(index: 3, desc: \"取消按钮\")\n                onNext(tModel)\n            }).subscribe().disposed(by: rx.disposeBag)\n        }\n\n        // 添加组件\n        backView.addSubview(icon)\n        backView.addSubview(searchField)\n        backView.addSubview(record)\n\n        view.addSubview(backView)\n        view.addSubview(cancel)\n        \n        self.addSubview(view)\n        \n        // 添加约束\n        // 此处必须指定一个大小\n        view.snp.makeConstraints { (make) in\n            make.width.equalTo(Metric.searchBarWidth)\n            make.height.equalTo(Metric.searchBarHeight)\n        }\n        \n        backView.snp.makeConstraints { (make) in\n            make.left.top.bottom.equalToSuperview()\n            make.right.equalTo(cancel.snp.left).offset(-MetricGlobal.margin / 2)\n        }\n\n        cancel.snp.makeConstraints { (make) in\n            make.centerY.equalToSuperview()\n            make.width.equalTo(Metric.cancelBtnWidth)\n            make.right.equalToSuperview()\n        }\n        \n        icon.snp.makeConstraints { (make) in\n            make.width.equalTo(Metric.searchIconWidth)\n            make.left.equalToSuperview().offset(MetricGlobal.margin / 2)\n            make.centerY.equalToSuperview()\n        }\n        \n        searchField.snp.makeConstraints { (make) in\n            make.top.equalToSuperview().offset(MetricGlobal.margin / 4)\n            make.left.equalTo(icon.snp.right)\n            make.centerY.equalTo(icon)\n            make.right.lessThanOrEqualTo(record.snp.left)\n        }\n        \n        record.snp.makeConstraints { (make) in\n            make.centerY.equalTo(icon)\n            make.width.equalTo(Metric.recordIconWidth)\n            make.right.equalToSuperview().offset(-MetricGlobal.margin / 2)\n        }\n        \n        return view\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Common/Protocol/ViewModel/HCViewModelType.swift",
    "content": "//\n//  HCViewModelType.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/16.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nprotocol HCViewModelType {\n    \n    associatedtype Input\n    associatedtype Output\n    \n    func transform(input: Input) -> Output\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Common/RequestUrl.swift",
    "content": "//\n//  RequestUrl.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/14.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport Foundation\n\n\n// 首页 播放 播放详情\nlet kUrlGetPlayDetail = \"http://mobile.ximalaya.com/mobile/track/v2/playpage/47581915/ts-1517751452809?ac=WIFI&albumId=9996644&appid=0&device=iPhone&deviceId=49AF49CB-60ED-4CF5-84BD-21E9E016956E&network=WIFI&operator=3&scale=2&trackUid=12495477&uid=0&version=6.3.54&xt=1517751452809\"\n\n// 首页 推荐 下拉刷新\nlet kUrlGetRecommendList = \"http://mobwsa.ximalaya.com/discovery-firstpage/explore/ts-1513673738360?appid=0&categoryId=-2&channel=ios-b1&code=43_440000_4403&device=iPhone&deviceId=49AF49CB-60ED-4CF5-84BD-21E9E016956E&includeActivity=true&includeSpecial=true&network=WIFI&operator=3&scale=2&uid=0&version=6.3.45&xt=1513673738361\"\n\n// 首页 精品 下拉刷新\nlet kUrlGetBoutiqueList = \"http://mobwsa.ximalaya.com/mobile/discovery/v5/category/recommends/ts-1515906325392?appid=0&categoryId=33&contentType=album&device=iPhone&deviceId=49AF49CB-60ED-4CF5-84BD-21E9E016956E&network=WIFI&operator=3&scale=2&uid=0&version=6.3.45&xt=1515906325392\"\n\n// 首页 推荐 上拉加载\nlet kUrlGetRecommendPullList = \"http://mobile.ximalaya.com/mobile/discovery/v4/recommend/albums?appid=0&device=iPhone&deviceId=49AF49CB-60ED-4CF5-84BD-21E9E016956E&excludedAlbumIds=10985438%2C4576194%2C8273989%2C338785%2C10160333%2C289147%2C5938428%2C5509952%2C10817293%2C11608277%2C11626796%2C11728511%2C10646371%2C6434420%2C3703879%2C9580491%2C10105195%2C2833949%2C353456%2C11940288%2C10846734%2C4038879%2C238474%2C10817349%2C11486581%2C6982423%2C11774689&network=WIFI&operator=3\"\n\n"
  },
  {
    "path": "RxXMLY/Classes/Common/Tools/HCInputValidator.swift",
    "content": "//\n//  HCInputValidator.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/29.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nclass HCInputValidator: NSObject {\n\n    class func isValidEmail(email: String) -> Bool {\n        \n        let re = try? NSRegularExpression(pattern: \"^\\\\S+@\\\\S+\\\\.\\\\S+$\", options: .caseInsensitive)\n        \n        if let re = re {\n            let range = NSMakeRange(0, email.lengthOfBytes(using: String.Encoding.utf8))\n            let result = re.matches(in: email, options: .reportProgress, range: range)\n            return result.count > 0\n        }\n        \n        return false\n    }\n    \n    class func isvalidationPassword(password: String) -> Bool {\n        return password.characters.count >= 8\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Common/Tools/HCTimeTools.swift",
    "content": "//\n//  HCTimeTools.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/1/25.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nclass HCTimeTools: NSObject {\n\n    // MARK:- 秒转换成 00:00:00 格式\n    class func formatPlayTime(secounds: TimeInterval) -> String {\n        if secounds.isNaN {\n            return \"00:00\"\n        }\n        var minute = Int(secounds / 60)\n        let second = Int(secounds.truncatingRemainder(dividingBy: 60))\n        var hour = 0\n        if minute >= 60 {\n            hour = Int(minute / 60)\n            minute = minute - hour * 60\n            return String(format: \"%02d:%02d:%02d\", hour, minute, second)\n        }\n        return String(format: \"%02d:%02d\", minute, second)\n    }    \n}\n"
  },
  {
    "path": "RxXMLY/Classes/Common/play_synopsis.html",
    "content": "<head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n    <script type=\"text/javascript\">\n        function load() {\n            window.location.href = \"ready://\" + document.body.scrollHeight;\n        }\n    </script>\n</head>\n<body onload=\"load()\">\n    <div class=\"detailContent_intro\">\n        <div class=\"mid_intro\" style=\"display: none;\">\n            <article>\n                <p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;text-align:justify;hyphens:auto\" data-flag=\"normal\" lang=\"en\">每个人都希望一生能够做出伟大的，让自己骄傲，有成就感的事情。在现实生活中，很多人胸怀梦想，但却经不起现实的考验和折腾，最后被击溃、一撅不振。我们都希望自己能够变成百折不挠、屡败屡战，勇敢走向理想和目标的英雄。</p><span><br></span><p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;text-align:justify;hyphens:auto\" data-flag=\"normal\" lang=\"en\">这种人物是如何练成的呢？<strong style=\"color:#FC5832;word-break:break-all;font-family:Helvetica,Arial,sans-serif;font-weight: normal;\">我认为在他们身上主要有五个比较共同的特征——坚定的信念、强大的意志力、良好的人生态度、宽广的胸怀、充分的自信。</strong></p><span><br></span><p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;text-align:justify;hyphens:auto\" data-flag=\"normal\" lang=\"en\"><b><span data-flag=\"tag\" style=\"background:#FC5832;font-size:16px;color:#fff;padding:5px;margin:10px 0px;display:inline-block\">五大共同特征<b>让你百折不挠</b></span><span>&nbsp;</span></b></p><p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;text-align:justify;hyphens:auto\" data-flag=\"normal\" lang=\"en\"><b><span>1. </span></b><b>坚定的信念</b></p><p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;text-align:justify;hyphens:auto\" data-flag=\"normal\" lang=\"en\"><strong style=\"color:#FC5832;word-break:break-all;font-family:Helvetica,Arial,sans-serif;font-weight: normal;\">信念就是从内心对于一件事业坚定不移认可的状态。</strong>当你心中拥有信念后，你就能够坚定不移相信你必须去实现它，无论遇到什么困难。...</p><span style=\"display:none\" data-preview=\"true\"></span>\n            </article>\n            \n            <div><a class=\"arrow\" data-need-buy=\"false\" data-uid=\"92896537\">展开更多</a></div>\n            \n        </div>\n        <div class=\"rich_intro\" style=\"display: block;\">\n            \n            <article><p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;text-align:justify;hyphens:auto\" data-flag=\"normal\" lang=\"en\">每个人都希望一生能够做出伟大的，让自己骄傲，有成就感的事情。在现实生活中，很多人胸怀梦想，但却经不起现实的考验和折腾，最后被击溃、一撅不振。我们都希望自己能够变成百折不挠、屡败屡战，勇敢走向理想和目标的英雄。</p><span><br></span><p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;text-align:justify;hyphens:auto\" data-flag=\"normal\" lang=\"en\">这种人物是如何练成的呢？<strong style=\"color:#FC5832;word-break:break-all;font-family:Helvetica,Arial,sans-serif;font-weight: normal;\">我认为在他们身上主要有五个比较共同的特征——坚定的信念、强大的意志力、良好的人生态度、宽广的胸怀、充分的自信。</strong></p><span><br></span><p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;text-align:justify;hyphens:auto\" data-flag=\"normal\" lang=\"en\"><b><span data-flag=\"tag\" style=\"background:#FC5832;font-size:16px;color:#fff;padding:5px;margin:10px 0px;display:inline-block\">五大共同特征<b>让你百折不挠</b></span><span>&nbsp;</span></b></p><p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;text-align:justify;hyphens:auto\" data-flag=\"normal\" lang=\"en\"><b><span>1. </span></b><b>坚定的信念</b></p><p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;text-align:justify;hyphens:auto\" data-flag=\"normal\" lang=\"en\"><strong style=\"color:#FC5832;word-break:break-all;font-family:Helvetica,Arial,sans-serif;font-weight: normal;\">信念就是从内心对于一件事业坚定不移认可的状态。</strong>当你心中拥有信念后，你就能够坚定不移相信你必须去实现它，无论遇到什么困难。我们会发现，有宗教信仰的人心灵平静，态度坚定，会比一般人更加不怕失败。原因非常简单，他们相信他们的神给每一个人某种力量，并且这个力量告诉和引导他应该做什么事情，他也就更加容易处于坚定不移的状态。</p><span><br></span><p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;text-align:justify;hyphens:auto\" data-flag=\"normal\" lang=\"en\">在中国共产党成立后，共产党员都相信通过他们的努力，可以推翻旧社会，解放全中国，甚至解放全世界，让每一个人都过上幸福生活。让人民过上幸福生活、创造一个平等的民主社会就成了共产党员坚定的信念。</p><span><br></span><p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;text-align:justify;hyphens:auto\" data-flag=\"normal\" lang=\"en\">国共内战时期，牺牲了很多人，小说《红岩》中不怕死的江姐形象，就是忠于信念的典型代表；南非的曼德拉，坚定不移相信自己能够推翻南非种族隔离政策，入狱<span>27</span>年此心不改，这也是信念。</p><span><br></span><p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;text-align:justify;hyphens:auto\" data-flag=\"normal\" lang=\"en\"><b><span>2. </span></b><b>强大的意志力</b></p><p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;text-align:justify;hyphens:auto\" data-flag=\"normal\" lang=\"en\"><strong style=\"color:#FC5832;word-break:break-all;font-family:Helvetica,Arial,sans-serif;font-weight: normal;\">意志力是一个人战胜艰难困苦的精神力量。</strong>众所周知，一个意志力强大的人通常不轻易害怕失败。战场上，意志力特别强大的战士一般都会变成战斗英雄，因为他能够忍受战争的残酷和困苦，能在最艰苦的时候支撑起自己；运动员的意志也比较强大，因为他们从小训练，都是为了让体能和耐力达到极致状态。</p><span><br></span><p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;text-align:justify;hyphens:auto\" data-flag=\"normal\" lang=\"en\">在某种意义上，在农村生活的人会比在城市生活的人意志力更强大，因为他们从小到大生活相对来说比较艰苦，这种环境有利于意志的磨炼。意志力在某种意义上是能够锻炼出来的。比如现在很多<span>EMBA</span>、<span>MBA</span>的课程常常要求学生到戈壁去做挑战项目，比如徒步一百公里。对于来自城市，平时不怎么走路的人来说，突然走一百公里，确实很考验意志力。在过程中很多人走了不到<span>20</span>公里脚上就充满血泡，但是因为离目标还很远，所以不得不继续前进。</p><span><br></span><p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;text-align:justify;hyphens:auto\" data-flag=\"normal\" lang=\"en\">这样一来，他们不得不靠意志力支撑。未来再遇到艰难困苦，就会想起当初自己脚上充满血泡还坚持完成目标的场景。坚持下去的耐力和坚定不移的决心就会更加强大。所以提升自己的意志力，也是让自己变得强大的一个重要方法。</p><span><br></span><p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;text-align:justify;hyphens:auto\" data-flag=\"normal\" lang=\"en\"><b><span>3. </span></b><b>乐观的人生态度</b></p><p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;text-align:justify;hyphens:auto\" data-flag=\"normal\" lang=\"en\"><strong style=\"color:#FC5832;word-break:break-all;font-family:Helvetica,Arial,sans-serif;font-weight: normal;\">一种乐观的人生态度就是把生命中遇到的任何挫折和失败都看作是对自己的考验。</strong>所谓“天将降大任于斯人也，必将苦其心志劳其筋骨”。面对生命中的困顿，我们用一种乐观态度来对待，这样一来一切就会更容易忍受。因为你期待，虽然成功现在还没有显现，但如果坚持下去就会获得成功。</p><span><br></span><p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica, Arial, sans-serif;font-weight:normal;text-align:justify\" data-flag=\"normal\" lang=\"en\">另外一种乐观的人生态度就是不要太在乎别人的眼光和评价。实际上，我们常常活在别人的眼光中，在意别人的态度。比如别人是否看得起我们、对我们做的事情是否有意见、做的事情是否丢脸或者没有尊严等等。</p><span><br></span><p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;text-align:justify;hyphens:auto\" data-flag=\"normal\" lang=\"en\">如果你总是想得太多，以至于别人对你说任何一句话都会被你误解，进而内心产生自卑，这对于你人生发展是有很大负面影响的。大家都知道有一种牙膏叫做脱敏牙膏。以前我们刷牙的时候遇到冷水、热水，牙齿都会疼，但使用脱敏牙膏后，你对冷热就不会过于敏感，对于别人的看法适当脱敏，也是我们人生中的一种态度。</p><span><br></span><p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;text-align:justify;hyphens:auto\" data-flag=\"normal\" lang=\"en\"><strong style=\"color:#FC5832;word-break:break-all;font-family:Helvetica,Arial,sans-serif;font-weight: normal;\">不要过于在意别人的想法和感受，要想办法把自己的事情做好。</strong>当然前提条件是你不能去伤害和得罪别人。不论面对困难还是别人对自己的评价，态度上要潇洒一点。</p><span><br></span><p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;text-align:justify;hyphens:auto\" data-flag=\"normal\" lang=\"en\"><b><span>4. </span></b><b>宽广的胸怀</b></p><p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;text-align:justify;hyphens:auto\" data-flag=\"normal\" lang=\"en\">如果能够做到前面三点，那么我们的胸怀就已经很广阔了。<strong style=\"color:#FC5832;word-break:break-all;font-family:Helvetica,Arial,sans-serif;font-weight: normal;\">但是真正的胸怀是胸怀大志，心向远方，因此对于眼前的得失完全不会太在意。</strong>宽广的胸怀还意味着你能够包容别人对你的欺骗、不满、伤害，并且还能够与各种不同才能的人共同合作。不容人者也必然容不下天下。</p><span><br></span><p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;text-align:justify;hyphens:auto\" data-flag=\"normal\" lang=\"en\">容天下，就意味着你还希望通过自己的努力让天下更好，范仲淹的“先天下之忧而忧，后天下之乐而乐”，苏东坡被贬以后写下的“大江东去，浪淘尽”这都是一种胸怀的表现。宽广的胸怀意味着能够原谅世界上一切伤害你的人和事，专注于自己的人生目标，努力前行。</p><span><br></span><p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;text-align:justify;hyphens:auto\" data-flag=\"normal\" lang=\"en\"><b><span>5. </span></b><b>充分的自信</b></p><p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;text-align:justify;hyphens:auto\" data-flag=\"normal\" lang=\"en\"><strong style=\"color:#FC5832;word-break:break-all;font-family:Helvetica,Arial,sans-serif;font-weight: normal;\">我认为自信是经过历练的一种人生真实态度。</strong>当我们已经充分意识到了自己的短板，也能充分意识到自己的强项。当我们不断努力前行、知道自己未来必然取得某种成就，我们内心就有了一种自信。</p><span><br></span><p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;text-align:justify;hyphens:auto\" data-flag=\"normal\" lang=\"en\">就像毛泽东所写的“自信人生二百年，会当水击三千里”，我们不一定能活<span>200</span>年，但是一定要相信通过努力和专注，我们能够做出让自己和家人骄傲、让社会骄傲，甚至是局部意义上让世界变得更好的事情。有了这样的自信以后，我们在努力前行时，遇到任何的艰难困苦，都会认为这只是临时现象，因此会用更加强大的精神力量去积极面对。</p><span><br></span><p style=\"font-size:16px;color:#333333;line-height:30px;font-family:Helvetica,Arial,sans-serif;font-weight:normal;text-align:justify;hyphens:auto\" data-flag=\"normal\" lang=\"en\">所以，当一个人拥有了坚定的信念、强大的意志力、良好的人生态度、宽广的胸怀、充分的自信后，我们通过持续不断的上进和努力，一定能让自己的生命有不一样的光彩。</p></article>\n            <div><a class=\"arrow on\">收起</a></div>\n        </div>\n    </div>\n</body>\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Find/HCFindViewController.swift",
    "content": "//\n//  HCFindViewController.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/14.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nclass HCFindViewController: HCBaseViewController {\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        initEnableMudule()\n    }\n}\n\n// MARK:- 初始化协议\nextension HCFindViewController: HCNavUniversalable {\n    \n    // MARK:- 协议组件\n    private func initEnableMudule() {\n        \n        // 消息 搜索\n        let models = [HCNavigationBarItemMetric.message,\n                      HCNavigationBarItemMetric.search]\n        self.universals(modelArr: models) { (model) in HCLog(model.description) }\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/HCMainViewController.swift",
    "content": "//\n//  HCMainViewController.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/14.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport Then\n\n// MARK:- 全局变量\nvar mainViewController: HCMainViewController?\n\nclass HCMainViewController: UITabBarController {\n    \n    // 播放按钮\n    lazy var playView = HCTabbarPlayView()\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        self.delegate = self\n        mainViewController = self\n    \n        UITabBar.appearance().isTranslucent = false\n        UITabBar.appearance().barTintColor = kThemeWhiteColor\n        UITabBar.appearance().tintColor = kThemeTomatoColor\n        UITabBar.appearance().backgroundImage = UIImage.init()\n        UITabBar.appearance().shadowImage = UIImage.init()\n\n        // 没有效果\n        UITabBarItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor : kThemeBlackColor], for: .normal)\n        UITabBarItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor : kThemeTomatoColor], for: .selected)\n\n        self.tabBar.layer.shadowColor = kThemeGreyColor.cgColor\n        self.tabBar.layer.shadowOpacity = 0.8\n        self.tabBar.layer.shadowOffset = CGSize(width: 0, height: -1)\n        self.tabBar.layer.shadowRadius = 3\n\n        // 初始化子控制器\n        self.initSubViewControllers()\n        \n        // 初始化播放按钮\n        self.initPalyView()\n    }\n\n    override func viewWillLayoutSubviews() {\n        super.viewWillLayoutSubviews()\n        view.bringSubview(toFront: playView)\n    }\n}\n\n// MARK:- 初始化\nextension HCMainViewController {\n    \n    // MARK:- 是否显示播放按钮\n    func isHiddenPlayView(_ isHidden: Bool) {\n      \n        playView.isHidden = isHidden\n    }\n    \n    // MARK:- 初始化播放按钮\n    private func initPalyView() {\n        \n        view.addSubview(playView)\n        view.bringSubview(toFront: playView)\n\n        playView.playBtnClickedBlock = { [weak self] (isPlay) in\n            guard let `self` = self else { return }\n            self.jump2Paly()\n        }\n        \n        playView.snp.makeConstraints { (make) in\n            make.width.height.equalTo(HCTabbarPlayView.with())\n            make.centerX.equalToSuperview()\n            if is_iPhoneX {\n                make.bottom.equalToSuperview().offset(-MetricGlobal.padding / 2 - iPhoneXBottomH)\n            } else {\n                make.bottom.equalToSuperview().offset(-MetricGlobal.padding / 2)\n            }\n        }\n    }\n\n    // MARK:- 初始化控制器\n    private func initSubViewControllers() {\n        \n        let classNameArr = [\"Home\", \"Hear\", \"Find\", \"Mine\"]\n        let moduleNameArr = [\"首页\", \"我听\", \"发现\", \"我的\"]\n        \n        var tabArr: [UIViewController] = []\n        let projectName = self.getProjectName()\n        \n        for i in 0..<classNameArr.count {\n            \n            let clsName = classNameArr[i]\n            let lowStr = clsName.lowercased()\n            \n            let clsType = NSClassFromString(projectName+\"HC\"+clsName+\"ViewController\") as! UIViewController.Type\n            let vc = clsType.init()\n            vc.title = moduleNameArr[i]\n            \n            let image = UIImage(named: \"tabbar_icon_\" + lowStr + \"_normal\")\n            let selectedImage = UIImage(named: \"tabbar_icon_\" + lowStr + \"_pressed\")\n            \n            let item: UITabBarItem = UITabBarItem(title: nil, image: image, selectedImage: selectedImage)\n            item.imageInsets = UIEdgeInsets(top: 0, left: 0, bottom: -8, right: 0)\n            \n            vc.tabBarItem = item\n            let navVc = HCBaseNavigationController(rootViewController: vc)\n            tabArr.append(navVc)\n        }\n        let placeVC = UIViewController()\n        placeVC.view.backgroundColor = kThemeWhiteColor\n        \n        tabArr.insert(placeVC, at: 2)\n        \n        self.viewControllers = tabArr\n    }\n    \n    private func getProjectName() -> String {\n        guard let infoDict = Bundle.main.infoDictionary else {\n            return \".\"\n        }\n        let key = kCFBundleExecutableKey as String\n        guard let value = infoDict[key] as? String else {\n            return \".\"\n        }\n        return value + \".\"\n    }\n}\n\n// MARK:- 代理\nextension HCMainViewController: UITabBarControllerDelegate {\n    \n    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {\n    \n        if viewController == tabBarController.viewControllers![2] {\n            return false\n        }\n        return true\n    }\n    \n    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {\n    }\n}\n\n// MARK:- 控制器跳转\nextension HCMainViewController {\n    \n    // MARK:- 登录\n    func jump2Login() {\n        \n        let VC = HCBaseNavigationController(rootViewController: HCLoginViewController())\n        self.present(VC, animated: true, completion: nil)\n    }\n    \n    // MARK:- 播放\n    func jump2Paly() {\n        \n        let VC = HCBaseNavigationController(rootViewController: HCPlayViewController())\n        self.present(VC, animated: true, completion: nil)\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Hear/HCHearViewController.swift",
    "content": "//\n//  HCHearViewController.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/14.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nclass HCHearViewController: HCBaseViewController {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        initEnableMudule()\n    }\n}\n\n// MARK:- 初始化协议\nextension HCHearViewController: HCNavUniversalable {\n    \n    // MARK:- 协议组件\n    private func initEnableMudule() {\n        \n        // 消息 搜索\n        let models = [HCNavigationBarItemMetric.message,\n                      HCNavigationBarItemMetric.search]\n        self.universals(modelArr: models) { (model) in HCLog(model.description) }\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Boutique(精品)/FlowLayout/HCBoutiqueIndexFlowLayout.swift",
    "content": "//\n//  HCBoutiqueIndexFlowLayout.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/1/16.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nclass HCBoutiqueIndexFlowLayout: UICollectionViewFlowLayout {\n\n    override init() {\n        super.init()\n        \n        self.scrollDirection = .vertical\n        self.itemSize = HCBoutiqueIndexCell.itemSize()\n        self.minimumLineSpacing = 0.0\n        let margin = HCBoutiqueIndexCell.itemMargin()\n        self.sectionInset = UIEdgeInsetsMake(0, margin * 1.5, 0, margin * 1.5)\n    }\n        \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Boutique(精品)/FlowLayout/HCBoutiqueSingleIndexFlowLayout.swift",
    "content": "//\n//  HCBoutiqueSingleIndexFlowLayout.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/1/17.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nclass HCBoutiqueSingleIndexFlowLayout: UICollectionViewFlowLayout {\n    \n    override init() {\n        super.init()\n        \n        self.scrollDirection = .horizontal\n        self.itemSize = HCBoutiqueIndexCell.singleItemSize()\n        self.minimumLineSpacing = 0.0\n        let margin = HCBoutiqueIndexCell.itemMargin()\n        self.sectionInset = UIEdgeInsetsMake(0, margin * 1.5, 0, 0)\n    }\n    \n    init(_ scrollDirection: UICollectionViewScrollDirection) {\n        \n        super.init()\n        if scrollDirection == .horizontal {\n            \n            self.scrollDirection = scrollDirection\n            self.itemSize = HCBoutiqueIndexCell.singleItemSize()\n            self.minimumLineSpacing = 0.0\n            let margin = HCBoutiqueIndexCell.itemMargin()\n            self.sectionInset = UIEdgeInsetsMake(0, margin * 1.5, 0, 0)\n            \n        } else {\n            self.scrollDirection = scrollDirection\n            self.itemSize = HCBoutiqueIndexCell.itemSize()\n            self.minimumLineSpacing = 0.0\n            let margin = HCBoutiqueIndexCell.itemMargin()\n            self.sectionInset = UIEdgeInsetsMake(0, margin * 1.5, 0, margin * 1.5)\n        }\n    }\n\n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Boutique(精品)/HCBoutiqueViewController.swift",
    "content": "//\n//  HCBoutiqueViewController.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/1/14.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport RxDataSources\nimport MJRefresh\nimport ReusableKit\n\nclass HCBoutiqueViewController: UIViewController, HCRefreshable {\n    var refreshHeader: MJRefreshHeader!\n    \n    // ViewModel\n    private var viewModel = HCBoutiqueViewModel()\n    private var vmOutput: HCBoutiqueViewModel.HCBoutiqueOutput?\n    \n    // View\n    private var collectionView: UICollectionView!\n    private var boutiqueIndexHeader: HCBoutiqueIndexHeaderView?\n    private var headerView: UIView?\n    private var offsetTop: CGFloat = 0.0\n\n    // DataSuorce\n    var dataSource : RxCollectionViewSectionedReloadDataSource<HCBoutiqueSection>!\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        initUI()\n        bindUI()\n    }\n}\n\n// MARK:- 初始化部分\nextension HCBoutiqueViewController {\n    \n    private func initCollectionView() {\n        \n        let layout = HCRecommendFlowLayout()\n        let collectionView = UICollectionView(frame: view.bounds, collectionViewLayout: layout)\n        collectionView.backgroundColor = kThemeWhiteColor\n        collectionView.showsVerticalScrollIndicator = false\n        \n        view.addSubview(collectionView)\n        self.collectionView = collectionView\n        \n        collectionView.snp.makeConstraints { (make) in\n            make.left.top.right.bottom.equalToSuperview()\n        }\n        \n        // 设置代理\n        collectionView.rx.setDelegate(self).disposed(by: rx.disposeBag)\n        \n        // 注册cell\n        collectionView.register(Reusable.recommendCell)\n        collectionView.register(Reusable.recommendSingleCell)\n        collectionView.register(Reusable.recommendTopHeader, kind: SupplementaryViewKind.header)\n        collectionView.register(Reusable.recommendHeader, kind: SupplementaryViewKind.header)\n        collectionView.register(Reusable.boutiqueIndexHeader, kind: SupplementaryViewKind.header)\n        collectionView.register(Reusable.recommendFooter, kind: SupplementaryViewKind.footer)\n        collectionView.register(Reusable.boutiqueFooter, kind: SupplementaryViewKind.footer)\n    }\n    \n    private func initSingleHeaderView() {\n    \n        // 悬浮滚动条 (直接添加xib显示不出来)\n        let singleHeaderView = HCBoutiqueSingleHeaderView.loadFromNib()\n        singleHeaderView.frame = CGRect(x: 0, y: 0, width: kScreenW, height: HCBoutiqueSingleHeaderView.singleHeight())\n        \n        // 点击滚动到指定位置\n        singleHeaderView.didSelectItem = { [weak self] (model) in\n            guard let `self` = self else { return }\n            // 滚动到指定位置\n            let indexPath = IndexPath(row: 0, section: model.index)\n            let attr = self.collectionView.layoutAttributesForItem(at: indexPath)\n            if let rect = attr?.frame {\n                var newRect = rect\n                newRect.size = self.collectionView.frame.size\n                newRect.height = newRect.height - kNavibarH - 30 - 44\n                self.collectionView.scrollRectToVisible(newRect, animated: true)\n            }\n            \n            // 同步数据\n            self.boutiqueIndexHeader?.selectedModel = model\n            self.boutiqueIndexHeader?.collectionView.reloadData()\n        }\n        let headerView = UIView()\n        headerView.frame = singleHeaderView.bounds\n        headerView.addSubview(singleHeaderView)\n        self.headerView = headerView\n        view.addSubview(headerView)\n        view.bringSubview(toFront: headerView)\n    }\n    \n    private func initUI() {\n        \n        // 集合\n        initCollectionView()\n        \n        // 悬浮条\n        initSingleHeaderView()\n    }\n    \n    func bindUI() {\n        \n        dataSource = RxCollectionViewSectionedReloadDataSource<HCBoutiqueSection>(configureCell: { (ds, cv, indexPath, item) -> UICollectionViewCell in\n            \n            if indexPath.section == 0 {\n                \n                let cell = cv.dequeue(Reusable.recommendCell, for: indexPath)\n                // 属性有变化\n                var newItem = item\n                newItem.pic = item.coverMiddle\n              \n                cell.item = newItem\n                \n                return cell\n            }\n            \n            let cell = cv.dequeue(Reusable.recommendSingleCell, for: indexPath)\n            // 属性有变化\n            var newItem = item\n            newItem.pic = item.coverMiddle\n            newItem.subtitle = item.intro\n            newItem.playsCount = item.playsCounts\n            newItem.tracksCount = item.tracks\n            \n            cell.cellType = .read\n            cell.item = newItem\n\n            let dsSection = ds[indexPath.section]\n            \n            // 单元格 底部横线\n            if let maxIndex = dsSection.category?.list?.count, indexPath.row == maxIndex - 1 {\n                cell.bottomLine?.isHidden = false\n                cell.bottomLine?.snp.updateConstraints({ (make) in\n                    make.left.equalTo(MetricGlobal.margin * 1.5)\n                    make.right.equalTo(-MetricGlobal.margin * 1.5)\n                })\n            } else {\n                cell.bottomLine?.isHidden = false\n                cell.bottomLine?.snp.updateConstraints({ (make) in\n                    make.left.equalTo(cell.leftImgView.right)\n                })\n            }\n\n\n            return cell\n            \n        }, configureSupplementaryView: { (ds, cv, kind, indexPath) in\n            \n            let dsSection = ds[indexPath.section]\n            \n            if kind == UICollectionElementKindSectionHeader {\n                \n                // 滚动条头部\n                if indexPath.section == 0 {\n                    \n                    let recommendTopHeader = cv.dequeue(Reusable.recommendTopHeader, kind: .header, for: indexPath)\n                    recommendTopHeader.bottomView.isHidden = true\n                    recommendTopHeader.bottomViewTopCons.constant = -recommendTopHeader.bottomView.height\n                    let picArr = dsSection.focusList?.map({ (model) -> String in\n                        return model.cover\n                    }) ?? []\n                    recommendTopHeader.picArr.value = picArr\n                    recommendTopHeader.categoryModel.value = dsSection.category\n                    \n                    if let squareList = dsSection.squareList {\n                        recommendTopHeader.squareArr.value = squareList\n                    }\n                    \n                    return recommendTopHeader\n                }\n                    // 每日优选\n                else if indexPath.section == 1 {\n                    \n                    self.offsetTop = self.collectionView.layoutAttributesForItem(at: indexPath)?.frame.top ?? 0.0\n                    \n                    let boutiqueIndexHeader = cv.dequeue(Reusable.boutiqueIndexHeader, kind: .header, for: indexPath)\n                    // 加载数据\n                    if let indexArr = dsSection.indexList {\n                        boutiqueIndexHeader.boutiqueIndexArr.value = indexArr\n                        // 滚动条\n                        let singleHeaderView = self.headerView?.subviews.first as? HCBoutiqueSingleHeaderView\n                        singleHeaderView?.boutiqueIndexArr.value = indexArr\n                    }\n                    \n                    // 处理点击事件\n                    boutiqueIndexHeader.didSelectItem = { [weak self] (model) in\n                        guard let `self` = self else { return }\n                        // 滚动到指定位置\n                        let indexPath = IndexPath(row: 0, section: model.index)\n                        let attr = self.collectionView.layoutAttributesForItem(at: indexPath)\n                        if let rect = attr?.frame {\n                            var newRect = rect\n                            newRect.size = self.collectionView.frame.size\n                            newRect.height = newRect.height - kNavibarH - 30\n                            self.collectionView.scrollRectToVisible(newRect, animated: true)\n                        }\n                        \n                        // 滚动条 同步数据\n                        let singleHeaderView = self.headerView?.subviews.first as? HCBoutiqueSingleHeaderView\n                        singleHeaderView?.selectedModel =  model\n                        singleHeaderView?.collectionView.reloadData()\n                        \n                        DispatchQueue.main.async {\n                            singleHeaderView?.collectionView.scrollToItem(at: IndexPath(row: model.index - 1, section: 0), at: .centeredHorizontally, animated: true)\n                        }\n                    }\n                    self.boutiqueIndexHeader = boutiqueIndexHeader\n                    return boutiqueIndexHeader\n                }\n                    // 其他头部\n                else {\n                    \n                    let recommendHeader = cv.dequeue(Reusable.recommendHeader, kind: .header, for: indexPath)\n                    recommendHeader.categoryModel.value = dsSection.category\n                    \n                    return recommendHeader\n                }\n            } else {\n                \n                if indexPath.section == 10 {\n                    \n                    let boutiqueFooter = cv.dequeue(Reusable.boutiqueFooter, kind: .footer, for: indexPath)\n \n                    return boutiqueFooter\n                }\n                \n                let recommendFooter = cv.dequeue(Reusable.recommendFooter, kind: .footer, for: indexPath)\n                if indexPath.section == 0 {\n                    recommendFooter.topLine.isHidden = false\n                } else {\n                    recommendFooter.topLine.isHidden = true\n                }\n\n                return recommendFooter\n            }\n        })\n        \n        vmOutput = viewModel.transform(input: HCBoutiqueViewModel.HCBoutiqueInput())\n        \n        vmOutput?.sections.asDriver().drive(collectionView.rx.items(dataSource: dataSource)).disposed(by: rx.disposeBag)\n        \n        refreshHeader = initRefreshGifHeader(collectionView) { [weak self] in\n            self?.vmOutput?.requestCommand.onNext(true)\n        }\n        vmOutput?.autoSetRefreshHeaderStatus(header: refreshHeader, footer: nil).disposed(by: rx.disposeBag)\n        \n        // 刷新\n        refreshHeader.beginRefreshing()\n    }\n}\n\n// MARK:- 布局\nextension HCBoutiqueViewController: UICollectionViewDelegateFlowLayout {\n    \n    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {\n        \n        if indexPath.section == 0 {\n            \n            return HCRecommendCell.itemSize()\n        }\n        \n        return HCRecommendSingleCell.itemSize()\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {\n        \n        if section == 0 {\n        \n            return HCRecommendTopHeaderView.headerSize(type: .boutique)\n        } else if section == 1 {\n            \n            return HCBoutiqueIndexHeaderView.defaultHeaderSize()\n        }\n        \n        return HCRecommendHeaderView.minHeaderSize()\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize {\n        if section == 10 {\n            return HCBoutiqueFooterView.defaultHeaderSize()\n        }\n        return HCRecommendFooterView.footerSize()\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, shouldHighlightItemAt indexPath: IndexPath) -> Bool {\n        \n        if indexPath.section == 0 {\n            return false\n        }\n        return true\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, didHighlightItemAt indexPath: IndexPath) {\n        // HCRecommendSingleCell 设置高亮\n        let cell = collectionView.cellForItem(at: indexPath) as? HCRecommendSingleCell\n        cell?.contentView.backgroundColor = kThemeOrangeRedColor\n        cell?.bottomLine?.isHidden = true\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, didUnhighlightItemAt indexPath: IndexPath) {\n        \n        let cell = collectionView.cellForItem(at: indexPath) as? HCRecommendSingleCell\n        cell?.contentView.backgroundColor = kThemeWhiteColor\n        cell?.bottomLine?.isHidden = false\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {\n        if section == 0 {\n            return UIEdgeInsets(top: 0, left: MetricGlobal.margin * 1.5, bottom: 0, right: MetricGlobal.margin * 1.5)\n        }\n        return UIEdgeInsets.zero\n    }\n\n    func scrollViewDidScroll(_ scrollView: UIScrollView) {\n        HCLog(\"\\(scrollView.contentOffset) - \\(offsetTop)\")\n        // 减去 分页头部 滚动条徒步\n        let margin = offsetTop - HCHomeViewController.pagerBarHeight() - HCBoutiqueSingleHeaderView.singleHeight()\n        if scrollView.contentOffset.y > 0 &&\n            margin > 0 &&\n            scrollView.contentOffset.y >= margin {\n            self.headerView?.isHidden = false\n        } else {\n            self.headerView?.isHidden = true\n        }\n    }\n}\n\nprivate enum Reusable {\n    \n    static let recommendCell = ReusableCell<HCRecommendCell>(nibName: \"HCRecommendCell\")\n    \n    static let recommendSingleCell = ReusableCell<HCRecommendSingleCell>(nibName: \"HCRecommendSingleCell\")\n    \n    static let recommendTopHeader = ReusableView<HCRecommendTopHeaderView>(identifier: \"HCRecommendTopHeaderView\", nibName: \"HCRecommendTopHeaderView\")\n    \n    static let recommendHeader = ReusableView<HCRecommendHeaderView>(identifier: \"HCRecommendHeaderView\", nibName: \"HCRecommendHeaderView\")\n    \n    static let recommendFooter = ReusableView<HCRecommendFooterView>(identifier: \"HCRecommendFooterView\", nibName: \"HCRecommendFooterView\")\n    \n    static let boutiqueIndexHeader = ReusableView<HCBoutiqueIndexHeaderView>(identifier: \"HCBoutiqueIndexHeaderView\", nibName: \"HCBoutiqueIndexHeaderView\")\n    \n    static let boutiqueFooter = ReusableView<HCBoutiqueFooterView>(identifier: \"HCBoutiqueFooterView\", nibName: \"HCBoutiqueFooterView\")\n}\n\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Boutique(精品)/Model/HCBoutiqueIndexModel.swift",
    "content": "\n//\n//  HCBoutiqueIndexModel.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/1/15.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nstruct HCBoutiqueIndexModel {\n\n    var title = \"\"\n    var index = 0\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Boutique(精品)/Model/HCBoutiqueModel.swift",
    "content": "//\n//  HCBoutiqueModel.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/1/14.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//  首页-精品\n\nimport Foundation\nimport ObjectMapper\n\n/**\n \n ret : 0\n keywords\n categoryContents\n hasRecommendedZones : false\n focusImages\n msg : \"成功\"\n serverMilliseconds : 1515906325501\n \n */\n\nstruct HCBoutiqueModel: Mappable {\n    \n    init?(map: Map) {\n        \n    }\n    \n    mutating func mapping(map: Map) {\n        \n        ret <- map[\"ret\"]\n        hasRecommendedZones <- map[\"hasRecommendedZones\"]\n        msg <- map[\"msg\"]\n        serverMilliseconds <- map[\"serverMilliseconds\"]\n        \n        keywordList <- map[\"keywords.list\"]\n        categoryList <- map[\"categoryContents.list\"]\n        squareList <- map[\"categoryContents.list.3.list\"]\n        focusList <- map[\"focusImages.data\"]\n    }\n    \n    var ret = 0\n    var hasRecommendedZones = false\n    var msg = \"成功\"    \n    var serverMilliseconds: UInt32 = 0\n    \n    var keywordList: [HCKeywardsModel]?\n    var squareList: [HCSquareModel]?\n    var focusList: [HCFocusModel]?\n    var categoryList: [HCCategoryModel]?\n}\n\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Boutique(精品)/View/Cell/HCBoutiqueIndexCell.swift",
    "content": "//\n//  HCBoutiqueIndexCell.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/1/16.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport ReusableKit\n\nfileprivate struct Metric {\n    \n    static let margin : CGFloat = 10\n    static let height : CGFloat = 38\n    static let column: CGFloat = 5\n    static let singleColumn: CGFloat = 4.5\n}\n\nclass HCBoutiqueIndexCell: UICollectionViewCell {\n\n    @IBOutlet weak var titleLab: UILabel!\n    @IBOutlet weak var bottomLine: UIView!\n    \n    override func awakeFromNib() {\n        super.awakeFromNib()\n        bottomLine.backgroundColor = kThemeOrangeRedColor\n    }\n    \n    static func itemMargin() -> CGFloat {\n        \n        return Metric.margin\n    }\n    \n    static func itemSize() -> CGSize {\n        // 结合 FlowLayout 设置\n        let width = (kScreenW - Metric.margin * (Metric.column - 1 + 3)) / Metric.column\n        \n        return CGSize(width: width, height: Metric.height)\n    }\n    \n    static func singleItemSize() -> CGSize {\n        // 结合 FlowLayout 设置\n        let width = (kScreenW - Metric.margin * (Metric.singleColumn - 1 + 1.5)) / Metric.singleColumn\n        \n        return CGSize(width: width, height: Metric.height)\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Boutique(精品)/View/Cell/HCBoutiqueIndexCell.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"13196\" 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=\"13173\"/>\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=\"HCBoutiqueIndexCell\" customModule=\"RxXMLY\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"60\" height=\"35\"/>\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=\"60\" height=\"35\"/>\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=\"gAh-2I-KhI\">\n                        <rect key=\"frame\" x=\"12.5\" y=\"9.5\" width=\"35.5\" height=\"17\"/>\n                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                        <nil key=\"textColor\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"l6v-db-jBz\">\n                        <rect key=\"frame\" x=\"10\" y=\"34\" width=\"40\" height=\"1\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" constant=\"0.5\" id=\"NFa-fX-W29\"/>\n                        </constraints>\n                    </view>\n                </subviews>\n            </view>\n            <constraints>\n                <constraint firstItem=\"l6v-db-jBz\" firstAttribute=\"centerX\" secondItem=\"gTV-IL-0wX\" secondAttribute=\"centerX\" id=\"Ji3-EF-kym\"/>\n                <constraint firstItem=\"gAh-2I-KhI\" firstAttribute=\"centerX\" secondItem=\"gTV-IL-0wX\" secondAttribute=\"centerX\" id=\"Leg-Sf-U9i\"/>\n                <constraint firstItem=\"l6v-db-jBz\" firstAttribute=\"leading\" secondItem=\"gTV-IL-0wX\" secondAttribute=\"leading\" constant=\"10\" id=\"ckX-Gi-dzP\"/>\n                <constraint firstItem=\"gAh-2I-KhI\" firstAttribute=\"centerY\" secondItem=\"gTV-IL-0wX\" secondAttribute=\"centerY\" id=\"tqY-gY-KV7\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"l6v-db-jBz\" secondAttribute=\"bottom\" constant=\"0.5\" id=\"w1Q-Im-KT1\"/>\n            </constraints>\n            <connections>\n                <outlet property=\"bottomLine\" destination=\"l6v-db-jBz\" id=\"UnJ-OG-BI4\"/>\n                <outlet property=\"titleLab\" destination=\"gAh-2I-KhI\" id=\"ZuH-Sx-ufs\"/>\n            </connections>\n        </collectionViewCell>\n    </objects>\n</document>\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Boutique(精品)/View/HCBoutiqueFooterView.swift",
    "content": "//\n//  HCBoutiqueFooterView.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/1/15.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport ReusableKit\n\nfileprivate struct Metric {\n    \n    static let defaultHeight : CGFloat = 10.0\n}\n\nclass HCBoutiqueFooterView: UICollectionReusableView, NibLoadable {\n\n    override func awakeFromNib() {\n        super.awakeFromNib()        \n    }\n    \n    static func defaultHeaderSize() -> CGSize {\n        \n        return CGSize(width: kScreenW, height: Metric.defaultHeight)\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Boutique(精品)/View/HCBoutiqueFooterView.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"13196\" 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=\"13173\"/>\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=\"HCBoutiqueFooterView\" customModule=\"RxXMLY\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"10\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <viewLayoutGuide key=\"safeArea\" id=\"vUN-kp-3ea\"/>\n        </view>\n    </objects>\n</document>\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Boutique(精品)/View/HCBoutiqueIndexHeaderView.swift",
    "content": "//\n//  HCBoutiqueIndexHeaderView.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/1/15.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport RxDataSources\nimport ReusableKit\n\nfileprivate struct Metric {\n    \n    static let defaultHeight : CGFloat = 135.0\n}\n\nfileprivate enum Reusable {\n    static let boutiqueIndexCell = ReusableCell<HCBoutiqueIndexCell>(nibName: \"HCBoutiqueIndexCell\")\n}\n\nclass HCBoutiqueIndexHeaderView: UICollectionReusableView {\n\n    @IBOutlet weak var topView: UIView!\n    @IBOutlet weak var bottomLine: UIView!\n    @IBOutlet weak var collectionView: UICollectionView!\n    @IBOutlet weak var bottomView: UIView!\n    @IBOutlet weak var bottomLeftLab: UILabel!\n    @IBOutlet weak var bottomRightView: UIView!\n        \n    // MARK:- 成功回调\n    typealias AddBlock = (_ indexModel: HCBoutiqueIndexModel)->Void\n    var didSelectItem: AddBlock? = {\n        (_) in return\n    }\n    \n    var boutiqueIndexArr = Variable<[HCBoutiqueIndexModel]>([])\n    var modelArr: [HCBoutiqueIndexModel] = []\n    var selectedModel: HCBoutiqueIndexModel?\n    \n    override func awakeFromNib() {\n        super.awakeFromNib()\n        \n        initUI()\n        bindUI()\n    }\n    \n    static func defaultHeaderSize() -> CGSize {\n        \n        return CGSize(width: kScreenW, height: Metric.defaultHeight)\n    }\n}\n\nextension HCBoutiqueIndexHeaderView {\n    \n    private func initUI() {\n        \n        topView.backgroundColor = kThemeWhiteColor\n        bottomLine.backgroundColor = kThemeLightGreyColor\n        collectionView.collectionViewLayout = HCBoutiqueIndexFlowLayout()\n        collectionView.register(Reusable.boutiqueIndexCell)\n    }\n    \n    private func bindUI() {\n        \n        boutiqueIndexArr.asObservable().subscribe(onNext: { [weak self] (boutiqueIndexArr) in\n            guard let `self` = self else { return }\n            self.modelArr = boutiqueIndexArr\n            if self.selectedModel == nil {\n               self.selectedModel = boutiqueIndexArr.first\n            }\n            self.collectionView.reloadData()\n        }).disposed(by: rx.disposeBag)\n    }\n}\n\n// MARK:- 代理\nextension HCBoutiqueIndexHeaderView: UICollectionViewDataSource, UICollectionViewDelegate {\n    \n    func numberOfSections(in collectionView: UICollectionView) -> Int {\n        \n        return 2\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {\n        \n        return self.modelArr.count / 2\n    }\n        \n    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {\n        \n        let cell = collectionView.dequeue(Reusable.boutiqueIndexCell, for: indexPath)\n        let index = self.modelArr.count / 2 * indexPath.section + indexPath.row\n        let model = self.modelArr[index]\n        if model.index == selectedModel?.index {\n            cell.bottomLine.isHidden = false\n        } else {\n            cell.bottomLine.isHidden = true\n        }\n        cell.titleLab.text = model.title\n        \n        return cell\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {\n        \n        let index = self.modelArr.count / 2 * indexPath.section + indexPath.row\n        let model = self.modelArr[index]\n        // 回调\n        didSelectItem?(model)\n        // 刷新样式\n        guard selectedModel?.index != model.index else { return }\n        selectedModel = model\n        collectionView.reloadData()\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Boutique(精品)/View/HCBoutiqueIndexHeaderView.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"13196\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"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=\"13173\"/>\n        <capability name=\"Aspect ratio constraints\" minToolsVersion=\"5.1\"/>\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=\"HCBoutiqueIndexHeaderView\" customModule=\"RxXMLY\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"135\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Fdg-kZ-LZq\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"10\" width=\"375\" height=\"80\"/>\n                    <subviews>\n                        <collectionView clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" scrollEnabled=\"NO\" showsHorizontalScrollIndicator=\"NO\" showsVerticalScrollIndicator=\"NO\" dataMode=\"none\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"hlD-L3-QOq\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"80\"/>\n                            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            <collectionViewFlowLayout key=\"collectionViewLayout\" minimumLineSpacing=\"10\" minimumInteritemSpacing=\"10\" id=\"BfY-s6-dIC\">\n                                <size key=\"itemSize\" width=\"50\" height=\"50\"/>\n                                <size key=\"headerReferenceSize\" width=\"0.0\" height=\"0.0\"/>\n                                <size key=\"footerReferenceSize\" width=\"0.0\" height=\"0.0\"/>\n                                <inset key=\"sectionInset\" minX=\"0.0\" minY=\"0.0\" maxX=\"0.0\" maxY=\"0.0\"/>\n                            </collectionViewFlowLayout>\n                            <connections>\n                                <outlet property=\"dataSource\" destination=\"iN0-l3-epB\" id=\"c6p-wP-CkV\"/>\n                                <outlet property=\"delegate\" destination=\"iN0-l3-epB\" id=\"149-Fo-Anc\"/>\n                            </connections>\n                        </collectionView>\n                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"1tw-E7-IXN\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"80\" width=\"375\" height=\"0.5\"/>\n                            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            <constraints>\n                                <constraint firstAttribute=\"height\" constant=\"0.5\" id=\"w6r-8Q-cj0\"/>\n                            </constraints>\n                        </view>\n                    </subviews>\n                    <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                    <constraints>\n                        <constraint firstItem=\"hlD-L3-QOq\" firstAttribute=\"top\" secondItem=\"Fdg-kZ-LZq\" secondAttribute=\"top\" id=\"96m-rK-fGO\"/>\n                        <constraint firstAttribute=\"trailing\" secondItem=\"1tw-E7-IXN\" secondAttribute=\"trailing\" id=\"9tG-bW-AD1\"/>\n                        <constraint firstItem=\"hlD-L3-QOq\" firstAttribute=\"leading\" secondItem=\"Fdg-kZ-LZq\" secondAttribute=\"leading\" id=\"DR1-WG-0hc\"/>\n                        <constraint firstAttribute=\"trailing\" secondItem=\"hlD-L3-QOq\" secondAttribute=\"trailing\" id=\"Gca-9j-EHZ\"/>\n                        <constraint firstItem=\"1tw-E7-IXN\" firstAttribute=\"leading\" secondItem=\"Fdg-kZ-LZq\" secondAttribute=\"leading\" id=\"MVL-a7-HVl\"/>\n                        <constraint firstAttribute=\"height\" constant=\"80\" id=\"Qhc-Iv-MYI\"/>\n                        <constraint firstItem=\"1tw-E7-IXN\" firstAttribute=\"top\" secondItem=\"hlD-L3-QOq\" secondAttribute=\"bottom\" id=\"h0v-4R-1YE\"/>\n                        <constraint firstAttribute=\"bottom\" secondItem=\"1tw-E7-IXN\" secondAttribute=\"bottom\" id=\"qKt-gs-uSN\"/>\n                    </constraints>\n                </view>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3gB-5y-0D3\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"90\" width=\"375\" height=\"45\"/>\n                    <subviews>\n                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"每日优选\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"byG-8G-RPn\">\n                            <rect key=\"frame\" x=\"16\" y=\"17.5\" width=\"69.5\" height=\"20.5\"/>\n                            <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                            <nil key=\"textColor\"/>\n                            <nil key=\"highlightedColor\"/>\n                        </label>\n                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"r7a-6F-5f4\">\n                            <rect key=\"frame\" x=\"317\" y=\"12.5\" width=\"42\" height=\"30\"/>\n                            <subviews>\n                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"更多\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"un2-Ai-T5d\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"7.5\" width=\"27\" height=\"16\"/>\n                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                    <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                    <nil key=\"highlightedColor\"/>\n                                </label>\n                                <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"live_ic_arrow_right\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"6U3-Xm-FMz\">\n                                    <rect key=\"frame\" x=\"30\" y=\"9\" width=\"12\" height=\"12\"/>\n                                    <constraints>\n                                        <constraint firstAttribute=\"width\" secondItem=\"6U3-Xm-FMz\" secondAttribute=\"height\" id=\"QnM-iM-XIc\"/>\n                                    </constraints>\n                                </imageView>\n                            </subviews>\n                            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            <constraints>\n                                <constraint firstItem=\"6U3-Xm-FMz\" firstAttribute=\"centerY\" secondItem=\"r7a-6F-5f4\" secondAttribute=\"centerY\" id=\"BS9-Qp-Mml\"/>\n                                <constraint firstAttribute=\"height\" constant=\"30\" id=\"JJf-9g-sTk\"/>\n                                <constraint firstAttribute=\"trailing\" secondItem=\"6U3-Xm-FMz\" secondAttribute=\"trailing\" id=\"M6N-xG-wMH\"/>\n                                <constraint firstItem=\"un2-Ai-T5d\" firstAttribute=\"centerY\" secondItem=\"r7a-6F-5f4\" secondAttribute=\"centerY\" id=\"OrB-Hg-sui\"/>\n                                <constraint firstItem=\"un2-Ai-T5d\" firstAttribute=\"leading\" secondItem=\"r7a-6F-5f4\" secondAttribute=\"leading\" id=\"dtn-52-rdI\"/>\n                                <constraint firstItem=\"6U3-Xm-FMz\" firstAttribute=\"leading\" secondItem=\"un2-Ai-T5d\" secondAttribute=\"trailing\" constant=\"3\" id=\"qyx-Tj-1VZ\"/>\n                            </constraints>\n                        </view>\n                    </subviews>\n                    <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                    <constraints>\n                        <constraint firstItem=\"r7a-6F-5f4\" firstAttribute=\"centerY\" secondItem=\"byG-8G-RPn\" secondAttribute=\"centerY\" id=\"4Oz-0N-fVV\"/>\n                        <constraint firstAttribute=\"height\" constant=\"45\" id=\"CrQ-hX-W0Z\"/>\n                        <constraint firstAttribute=\"trailing\" secondItem=\"r7a-6F-5f4\" secondAttribute=\"trailing\" constant=\"16\" id=\"GaC-V8-RQB\"/>\n                        <constraint firstItem=\"byG-8G-RPn\" firstAttribute=\"centerY\" secondItem=\"3gB-5y-0D3\" secondAttribute=\"centerY\" constant=\"5\" id=\"QP3-V5-08b\"/>\n                        <constraint firstItem=\"byG-8G-RPn\" firstAttribute=\"leading\" secondItem=\"3gB-5y-0D3\" secondAttribute=\"leading\" constant=\"16\" id=\"rfX-nC-TjJ\"/>\n                    </constraints>\n                </view>\n            </subviews>\n            <constraints>\n                <constraint firstItem=\"3gB-5y-0D3\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" id=\"0dV-xr-UOf\"/>\n                <constraint firstItem=\"3gB-5y-0D3\" firstAttribute=\"top\" secondItem=\"Fdg-kZ-LZq\" secondAttribute=\"bottom\" id=\"1u0-fQ-Wyf\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"3gB-5y-0D3\" secondAttribute=\"trailing\" id=\"8a7-zu-mgZ\"/>\n                <constraint firstItem=\"Fdg-kZ-LZq\" firstAttribute=\"top\" secondItem=\"iN0-l3-epB\" secondAttribute=\"top\" constant=\"10\" id=\"gqw-iT-hPU\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"Fdg-kZ-LZq\" secondAttribute=\"trailing\" id=\"iKq-l2-4Y5\"/>\n                <constraint firstItem=\"Fdg-kZ-LZq\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" id=\"wO7-xN-fnK\"/>\n            </constraints>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <connections>\n                <outlet property=\"bottomLeftLab\" destination=\"byG-8G-RPn\" id=\"XZi-Js-Zrs\"/>\n                <outlet property=\"bottomLine\" destination=\"1tw-E7-IXN\" id=\"G38-ks-6j9\"/>\n                <outlet property=\"bottomRightView\" destination=\"r7a-6F-5f4\" id=\"Zqp-a3-tBY\"/>\n                <outlet property=\"bottomView\" destination=\"3gB-5y-0D3\" id=\"dKo-Dt-Ls4\"/>\n                <outlet property=\"collectionView\" destination=\"hlD-L3-QOq\" id=\"zHS-1C-G3v\"/>\n                <outlet property=\"topView\" destination=\"Fdg-kZ-LZq\" id=\"nDt-el-cLi\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"-131\" y=\"-493\"/>\n        </view>\n    </objects>\n    <resources>\n        <image name=\"live_ic_arrow_right\" width=\"7\" height=\"12\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Boutique(精品)/View/HCBoutiqueSingleHeaderView.swift",
    "content": "//\n//  HCBoutiqueSingleHeaderView.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/1/17.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport RxDataSources\nimport ReusableKit\n\nfileprivate struct Metric {\n    \n    static let singleHeight : CGFloat = 44.0\n    static let twoHeight : CGFloat = 80.0\n\n    static let defaultHeight : CGFloat = 135.0\n}\n\nfileprivate enum Reusable {\n    static let boutiqueIndexCell = ReusableCell<HCBoutiqueIndexCell>(nibName: \"HCBoutiqueIndexCell\")\n}\n\nclass HCBoutiqueSingleHeaderView: UIView, NibLoadable {\n    \n    @IBOutlet weak var topView: UIView!\n    @IBOutlet weak var bottomLine: UIView!\n    @IBOutlet weak var collectionView: UICollectionView!\n    @IBOutlet weak var btnView: UIView!\n    @IBOutlet weak var rightBtn: UIButton!\n    @IBOutlet weak var topViewHeightCons: NSLayoutConstraint!\n    @IBOutlet weak var collectionViewRightCons: NSLayoutConstraint!\n    @IBOutlet weak var backgroundView: UIView!\n    \n    // MARK:- 成功回调\n    typealias AddBlock = (_ indexModel: HCBoutiqueIndexModel)->Void\n    var didSelectItem: AddBlock? = {\n        (_) in return\n    }\n    typealias RightBtnBlock = (_ isUp: Bool)->Void\n    var rightBtnClick: RightBtnBlock? = {\n        (_) in return\n    }\n    \n    let horizontalLayout = HCBoutiqueSingleIndexFlowLayout(.horizontal)\n    let verticalLayout = HCBoutiqueSingleIndexFlowLayout(.vertical)\n\n    var isUp: Bool = false\n    var boutiqueIndexArr = Variable<[HCBoutiqueIndexModel]>([])\n    var modelArr: [HCBoutiqueIndexModel] = []\n    var selectedModel: HCBoutiqueIndexModel?\n    \n    override func awakeFromNib() {\n        super.awakeFromNib()\n        \n        initUI()\n        bindUI()\n    }\n    \n    static func defaultHeaderSize() -> CGSize {\n        \n        return CGSize(width: kScreenW, height: Metric.defaultHeight)\n    }\n}\n\nextension HCBoutiqueSingleHeaderView {\n    \n    static func singleHeight() -> CGFloat {\n        \n        return Metric.singleHeight\n    }\n\n    private func initUI() {\n        \n        self.frame = CGRect(x: 0, y: 0, width: kScreenW, height: Metric.singleHeight)\n        \n        backgroundView.alpha = 0.35\n        backgroundView.backgroundColor = kThemeBlackColor\n        \n        bottomLine.backgroundColor = kThemeLightGreyColor\n        \n        btnView.layer.shadowColor = kThemeLightGreyColor.cgColor\n        btnView.layer.shadowOpacity = 0.8\n        btnView.layer.shadowOffset = CGSize(width: -2, height: 0)\n        btnView.layer.shadowRadius = 5\n        collectionView.collectionViewLayout = self.horizontalLayout\n        collectionView.register(Reusable.boutiqueIndexCell)\n    }\n    \n    private func updateUI(isUp: Bool) {\n        \n        // 重新设置布局\n        self.collectionView.collectionViewLayout.invalidateLayout()\n        \n        if isUp == true {\n            \n            self.superview?.frame = CGRect(x: 0, y: 0, width: kScreenW, height: kScreenH - kNavibarH)\n            self.frame = (self.superview?.bounds)!\n            self.height = (self.superview?.height)!\n            self.btnView.isHidden = true\n            self.topViewHeightCons.constant = Metric.twoHeight\n            self.collectionViewRightCons.constant = -Metric.twoHeight\n            DispatchQueue.main.async {\n                self.collectionView.setCollectionViewLayout(self.verticalLayout, animated: true)\n            }\n\n        } else {\n            self.superview?.frame = CGRect(x: 0, y: 0, width: kScreenW, height: Metric.singleHeight)\n            self.frame = (self.superview?.bounds)!\n            self.btnView.isHidden = false\n            self.topViewHeightCons.constant = Metric.singleHeight\n            self.collectionViewRightCons.constant = 0\n            DispatchQueue.main.async {\n                self.collectionView.setCollectionViewLayout(self.horizontalLayout, animated: true)\n            }\n        }\n        self.collectionView.reloadData()\n        self.superview?.layoutIfNeeded()\n    }\n    \n    private func bindUI() {\n        \n        rightBtn.rx.tap.do(onNext: { [weak self] _ in\n            guard let `self` = self else { return }\n            self.isUp = !self.isUp            \n            self.updateUI(isUp: self.isUp)\n            \n        }).subscribe().disposed(by: rx.disposeBag)\n        \n        backgroundView.rx.tapGesture().when(.recognized).subscribe({ [weak self] _ in\n            guard let `self` = self else { return }\n            self.isUp = false\n            self.updateUI(isUp: self.isUp)\n            \n            DispatchQueue.main.async {\n                if let model = self.selectedModel {\n                    self.collectionView.scrollToItem(at: IndexPath(row: model.index - 1, section: 0), at: .centeredHorizontally, animated: true)\n                }\n            }\n        }).disposed(by: rx.disposeBag)\n        \n        boutiqueIndexArr.asObservable().subscribe(onNext: { [weak self] (boutiqueIndexArr) in\n            guard let `self` = self else { return }\n            self.modelArr = boutiqueIndexArr\n            if self.selectedModel == nil {\n                self.selectedModel = boutiqueIndexArr.first\n            }\n            self.collectionView.reloadData()\n        }).disposed(by: rx.disposeBag)\n    }\n}\n\n// MARK:- 代理\nextension HCBoutiqueSingleHeaderView: UICollectionViewDataSource, UICollectionViewDelegate {\n    \n    func numberOfSections(in collectionView: UICollectionView) -> Int {\n        if self.isUp == true {\n            return 2\n        }\n        return 1\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {\n        if self.isUp == true {\n            return self.modelArr.count / 2\n        }\n        return self.modelArr.count\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {\n        \n        let cell = collectionView.dequeue(Reusable.boutiqueIndexCell, for: indexPath)\n        let index = indexPath.row + indexPath.section * self.modelArr.count / 2\n        let model = self.modelArr[index]\n        if model.index == selectedModel?.index {\n            cell.bottomLine.isHidden = false\n        } else {\n            cell.bottomLine.isHidden = true\n        }\n        cell.titleLab.text = model.title\n        \n        return cell\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {\n        \n        let index = indexPath.row + indexPath.section * self.modelArr.count / 2\n        let model = self.modelArr[index]\n   \n        // 刷新样式\n        self.isUp = false\n        self.updateUI(isUp: self.isUp)\n\n        guard selectedModel?.index != model.index else { return }\n        selectedModel = model\n        collectionView.reloadData()\n        DispatchQueue.main.async {\n            self.collectionView.scrollToItem(at: IndexPath(row: model.index - 1, section: 0), at: .centeredHorizontally, animated: true)\n        }\n\n        // 回调\n        didSelectItem?(model)\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {\n        \n        if self.isUp == true {\n            return HCBoutiqueIndexCell.singleItemSize()\n        }\n        return HCBoutiqueIndexCell.itemSize()\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {\n        \n        let margin = HCBoutiqueIndexCell.itemMargin()\n        if self.isUp == true {\n            return UIEdgeInsetsMake(0, margin * 1.5, 0, margin * 1.5)\n        }\n        return UIEdgeInsetsMake(0, margin * 1.5, 0, 0)\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Boutique(精品)/View/HCBoutiqueSingleHeaderView.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"13196\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"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=\"13173\"/>\n        <capability name=\"Aspect ratio constraints\" minToolsVersion=\"5.1\"/>\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=\"HCBoutiqueSingleHeaderView\" customModule=\"RxXMLY\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"44\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"bt3-Wn-NPP\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"44\"/>\n                    <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                </view>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"JaM-Qu-wJB\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"44\"/>\n                    <subviews>\n                        <collectionView clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" showsHorizontalScrollIndicator=\"NO\" showsVerticalScrollIndicator=\"NO\" dataMode=\"none\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"eVP-ER-dCA\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"331\" height=\"43.5\"/>\n                            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            <collectionViewFlowLayout key=\"collectionViewLayout\" minimumLineSpacing=\"10\" minimumInteritemSpacing=\"10\" id=\"UIg-dB-5Hc\">\n                                <size key=\"itemSize\" width=\"50\" height=\"50\"/>\n                                <size key=\"headerReferenceSize\" width=\"0.0\" height=\"0.0\"/>\n                                <size key=\"footerReferenceSize\" width=\"0.0\" height=\"0.0\"/>\n                                <inset key=\"sectionInset\" minX=\"0.0\" minY=\"0.0\" maxX=\"0.0\" maxY=\"0.0\"/>\n                            </collectionViewFlowLayout>\n                            <connections>\n                                <outlet property=\"dataSource\" destination=\"iN0-l3-epB\" id=\"vzg-Vr-LkM\"/>\n                                <outlet property=\"delegate\" destination=\"iN0-l3-epB\" id=\"0tV-7F-PSh\"/>\n                            </connections>\n                        </collectionView>\n                        <view contentMode=\"scaleAspectFit\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"TfY-Ql-w9c\">\n                            <rect key=\"frame\" x=\"331\" y=\"0.0\" width=\"43.5\" height=\"43.5\"/>\n                            <subviews>\n                                <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"5PO-UI-tKP\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"43.5\" height=\"43.5\"/>\n                                    <constraints>\n                                        <constraint firstAttribute=\"width\" secondItem=\"5PO-UI-tKP\" secondAttribute=\"height\" id=\"wnZ-NX-6R8\"/>\n                                    </constraints>\n                                    <state key=\"normal\" image=\"pay_arrow_up\"/>\n                                </button>\n                            </subviews>\n                            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            <constraints>\n                                <constraint firstAttribute=\"bottom\" secondItem=\"5PO-UI-tKP\" secondAttribute=\"bottom\" id=\"8be-AH-Pbq\"/>\n                                <constraint firstAttribute=\"trailing\" secondItem=\"5PO-UI-tKP\" secondAttribute=\"trailing\" id=\"fYw-1q-377\"/>\n                                <constraint firstItem=\"5PO-UI-tKP\" firstAttribute=\"top\" secondItem=\"TfY-Ql-w9c\" secondAttribute=\"top\" id=\"kIK-jL-830\"/>\n                                <constraint firstItem=\"5PO-UI-tKP\" firstAttribute=\"leading\" secondItem=\"TfY-Ql-w9c\" secondAttribute=\"leading\" id=\"y8P-07-zpX\"/>\n                            </constraints>\n                        </view>\n                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"gNv-Xk-jIE\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"43.5\" width=\"375\" height=\"0.5\"/>\n                            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            <constraints>\n                                <constraint firstAttribute=\"height\" constant=\"0.5\" id=\"Xp1-hM-nsO\"/>\n                            </constraints>\n                        </view>\n                    </subviews>\n                    <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                    <constraints>\n                        <constraint firstItem=\"gNv-Xk-jIE\" firstAttribute=\"leading\" secondItem=\"JaM-Qu-wJB\" secondAttribute=\"leading\" id=\"A46-0o-S8w\"/>\n                        <constraint firstItem=\"gNv-Xk-jIE\" firstAttribute=\"top\" secondItem=\"eVP-ER-dCA\" secondAttribute=\"bottom\" id=\"SgN-0F-0ja\"/>\n                        <constraint firstItem=\"gNv-Xk-jIE\" firstAttribute=\"top\" secondItem=\"TfY-Ql-w9c\" secondAttribute=\"bottom\" id=\"XC7-2H-Q0z\"/>\n                        <constraint firstItem=\"TfY-Ql-w9c\" firstAttribute=\"top\" secondItem=\"JaM-Qu-wJB\" secondAttribute=\"top\" id=\"YHQ-FP-e0b\"/>\n                        <constraint firstItem=\"eVP-ER-dCA\" firstAttribute=\"top\" secondItem=\"JaM-Qu-wJB\" secondAttribute=\"top\" id=\"Zkc-C9-XOr\"/>\n                        <constraint firstAttribute=\"trailing\" secondItem=\"TfY-Ql-w9c\" secondAttribute=\"trailing\" id=\"aBo-Am-cnE\"/>\n                        <constraint firstItem=\"TfY-Ql-w9c\" firstAttribute=\"leading\" secondItem=\"eVP-ER-dCA\" secondAttribute=\"trailing\" id=\"c6C-BD-8DD\"/>\n                        <constraint firstItem=\"eVP-ER-dCA\" firstAttribute=\"leading\" secondItem=\"JaM-Qu-wJB\" secondAttribute=\"leading\" id=\"h7H-GM-EvA\"/>\n                        <constraint firstAttribute=\"height\" constant=\"44\" id=\"jqU-Io-6RU\"/>\n                        <constraint firstAttribute=\"trailing\" secondItem=\"gNv-Xk-jIE\" secondAttribute=\"trailing\" id=\"pRC-Tr-BBI\"/>\n                        <constraint firstAttribute=\"bottom\" secondItem=\"gNv-Xk-jIE\" secondAttribute=\"bottom\" id=\"pRc-bf-9bH\"/>\n                    </constraints>\n                </view>\n            </subviews>\n            <constraints>\n                <constraint firstItem=\"bt3-Wn-NPP\" firstAttribute=\"top\" secondItem=\"iN0-l3-epB\" secondAttribute=\"top\" id=\"3mT-LI-DG4\"/>\n                <constraint firstItem=\"bt3-Wn-NPP\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" id=\"4tt-MK-EjQ\"/>\n                <constraint firstItem=\"JaM-Qu-wJB\" firstAttribute=\"top\" secondItem=\"iN0-l3-epB\" secondAttribute=\"top\" id=\"D3x-py-8bH\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"bt3-Wn-NPP\" secondAttribute=\"bottom\" id=\"WEC-zy-N0e\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"JaM-Qu-wJB\" secondAttribute=\"trailing\" id=\"aRw-gV-q9Q\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"bt3-Wn-NPP\" secondAttribute=\"trailing\" id=\"fO8-8y-wq1\"/>\n                <constraint firstItem=\"JaM-Qu-wJB\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" id=\"pzp-GJ-ClB\"/>\n            </constraints>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <connections>\n                <outlet property=\"backgroundView\" destination=\"bt3-Wn-NPP\" id=\"mnJ-7A-RO8\"/>\n                <outlet property=\"bottomLine\" destination=\"gNv-Xk-jIE\" id=\"mKZ-TI-WiC\"/>\n                <outlet property=\"btnView\" destination=\"TfY-Ql-w9c\" id=\"6Fi-Ry-Z2R\"/>\n                <outlet property=\"collectionView\" destination=\"eVP-ER-dCA\" id=\"6Fw-bt-fR1\"/>\n                <outlet property=\"collectionViewRightCons\" destination=\"c6C-BD-8DD\" id=\"Yd8-eo-HfO\"/>\n                <outlet property=\"rightBtn\" destination=\"5PO-UI-tKP\" id=\"nd6-ru-pfV\"/>\n                <outlet property=\"topView\" destination=\"JaM-Qu-wJB\" id=\"eLV-sT-rej\"/>\n                <outlet property=\"topViewHeightCons\" destination=\"jqU-Io-6RU\" id=\"gVw-sv-Rnh\"/>\n            </connections>\n        </view>\n    </objects>\n    <resources>\n        <image name=\"pay_arrow_up\" width=\"12\" height=\"6\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Boutique(精品)/ViewModel/HCBoutiqueViewModel.swift",
    "content": "//\n//  HCBoutiqueViewModel.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/16.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport Foundation\nimport RxSwift\nimport RxCocoa\nimport NSObject_Rx\nimport RxAlamofire\nimport SwiftyJSON\nimport RxDataSources\nimport ObjectMapper\n\nclass HCBoutiqueViewModel: NSObject {\n\n    private let vmDatas = Variable<[([HCKeywardsModel]?, [HCFocusModel]?, [HCSquareModel]?, [HCBoutiqueIndexModel]?, HCCategoryModel?, [HCRecommendItemModel])]>([])\n    \n    private var page: Int = 1\n}\n\n\nextension HCBoutiqueViewModel: HCViewModelType {\n    \n    typealias Input = HCBoutiqueInput\n    typealias Output = HCBoutiqueOutput\n    \n    struct HCBoutiqueInput {\n        \n    }\n    \n    struct HCBoutiqueOutput: OutputRefreshProtocol {\n        \n        var refreshStatus: Variable<HCRefreshStatus>\n        \n        let sections: Driver<[HCBoutiqueSection]>\n        let requestCommand = PublishSubject<Bool>()\n        \n        init(sections: Driver<[HCBoutiqueSection]>) {\n            self.sections = sections\n            refreshStatus = Variable<HCRefreshStatus>(.none)\n        }\n    }\n    \n    func transform(input: HCBoutiqueViewModel.HCBoutiqueInput) -> HCBoutiqueViewModel.HCBoutiqueOutput {\n     \n        let temp_sections = vmDatas.asObservable().map({ (sections) -> [HCBoutiqueSection] in\n            return sections.map({ (keywordList, focusList, squareList, indexList, category, models) -> HCBoutiqueSection in\n                return HCBoutiqueSection(keywordList: keywordList, focusList: focusList, squareList: squareList, indexList: indexList, category: category, items: models)\n            })\n        }).asDriver(onErrorJustReturn: [])\n        \n        let output = HCBoutiqueOutput(sections: temp_sections)\n        \n        output.requestCommand.subscribe(onNext: { [weak self] (isPull) in\n            guard let `self` = self else { return }\n            \n            var url: String = kUrlGetBoutiqueList\n            \n            if isPull {\n                url = kUrlGetBoutiqueList\n            }\n            \n            let request = json(.get, url)\n            \n            // 监听网络\n            request.asObservable().subscribe({ (event) in\n                switch event {\n                case let .error(error):\n                    HCLog(error)\n                case .next, .completed:\n                    self.page = self.page + 1\n                    break\n                }\n                output.refreshStatus.value = .endHeaderRefresh\n                output.refreshStatus.value = .endFooterRefresh\n\n            }).disposed(by: self.rx.disposeBag)\n            \n            // 获取数据\n            request.hc_json({\n                \n                return JSON($0)\n            }).mapObject(HCBoutiqueModel.self).subscribe(onNext: { (datas) in\n                \n                guard let keywordList = datas.keywordList else { return }\n                guard let focusList = datas.focusList else { return }\n                guard let squareList = datas.squareList else { return }\n                guard let categoryList = datas.categoryList else { return }\n                \n                var temp_category: [HCCategoryModel] = []\n                var temp_categorySubList: [[HCRecommendItemModel]] = []\n                var temp_indexList: [HCBoutiqueIndexModel] = []\n\n                // 组装数据\n                for (index, category) in categoryList.enumerated() {\n                    \n                    guard index >= 5 else { // 过滤\n                        continue\n                    }\n                    \n                    guard let categorySubList = category.list, categorySubList.count > 0 else {\n                        continue\n                    }\n                    // 处理数据\n                    temp_category.append(category)\n                    temp_categorySubList.append(categorySubList)\n                    \n                    // 存放索引 从【每日优选】开始\n                    if index >= 6 {\n                        var indexModel = HCBoutiqueIndexModel()\n                        indexModel.title = category.title\n                        indexModel.index = index - 5\n                        temp_indexList.append(indexModel)\n                    }\n                }\n            \n                var sectionArr: [([HCKeywardsModel]?, [HCFocusModel]?, [HCSquareModel]?, [HCBoutiqueIndexModel]?, HCCategoryModel?, [HCRecommendItemModel])] = []\n                \n                for (index, _) in temp_category.enumerated() {\n                    \n                    sectionArr.append((keywordList, focusList, squareList, temp_indexList, temp_category[index], temp_categorySubList[index]))\n                }\n                \n                // 更新数据\n                self.vmDatas.value = sectionArr\n                \n            }).disposed(by: self.rx.disposeBag)\n        }).disposed(by: rx.disposeBag)\n        \n        return output\n    }\n}\n\nstruct HCBoutiqueSection {\n   \n    var keywordList: [HCKeywardsModel]?\n    var focusList: [HCFocusModel]?\n    var squareList: [HCSquareModel]?\n    var indexList: [HCBoutiqueIndexModel]?\n    var category: HCCategoryModel?\n    var items: [Item]\n}\n\nextension HCBoutiqueSection: SectionModelType {\n    typealias Item = HCRecommendItemModel\n \n    init(original: HCBoutiqueSection, items: [HCRecommendItemModel]) {\n        self = original\n        self.items = items\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Recommend(推荐)/FlowLayout/HCRecommendFlowLayout.swift",
    "content": "//\n//  HCRecommendFlowLayout.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/17.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nclass HCRecommendFlowLayout: UICollectionViewFlowLayout {\n\n    override init() {\n        super.init()\n        \n        self.scrollDirection = .vertical\n        self.itemSize = HCRecommendCell.itemSize()\n        self.minimumLineSpacing = 0.0\n        self.sectionInset = .zero\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Recommend(推荐)/FlowLayout/HCSquareFlowLayout.swift",
    "content": "//\n//  HCSquareFlowLayout.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/17.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nclass HCSquareFlowLayout: UICollectionViewFlowLayout {\n    \n    override init() {\n        super.init()\n        \n        self.scrollDirection = .horizontal\n        self.itemSize = HCSquareCell.itemSize()\n        self.minimumLineSpacing = 0.0\n        let margin = HCSquareCell.itemMargin()\n        self.sectionInset = UIEdgeInsetsMake(margin, margin, margin, margin)\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Recommend(推荐)/HCRecommendViewController.swift",
    "content": "//\n//  HCRecommendViewController.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/16.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//  推荐页面\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport RxDataSources\nimport MJRefresh\nimport ReusableKit\n\nclass HCRecommendViewController: UIViewController, HCRefreshable {\n    \n    var refreshHeader: MJRefreshHeader!\n    \n    // ViewModel\n    private var viewModel = HCRecommendViewModel()\n    private var vmOutput: HCRecommendViewModel.HCRecommendOutput?\n    \n    // View\n    private var collectionView: UICollectionView!\n    \n    // DataSuorce\n    var dataSource : RxCollectionViewSectionedReloadDataSource<HCRecommendSection>!\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        initUI()\n        bindUI()\n    }\n}\n\n// MARK:- 初始化部分\nextension HCRecommendViewController {\n    \n    private func initUI() {\n        \n        let layout = HCRecommendFlowLayout()\n        let collectionView = UICollectionView(frame: view.bounds, collectionViewLayout: layout)\n        collectionView.backgroundColor = UIColor.white\n        collectionView.showsVerticalScrollIndicator = false\n\n        view.addSubview(collectionView)\n        self.collectionView = collectionView\n\n        collectionView.snp.makeConstraints { (make) in\n            make.left.top.right.bottom.equalToSuperview()\n        }\n        \n        // 设置代理\n        collectionView.rx.setDelegate(self).disposed(by: rx.disposeBag)\n\n        // 注册cell\n        collectionView.register(Reusable.recommendCell)\n        collectionView.register(Reusable.recommendSingleCell)\n        collectionView.register(Reusable.recommendTopHeader, kind: SupplementaryViewKind.header)\n        collectionView.register(Reusable.recommendHeader, kind: SupplementaryViewKind.header)\n        collectionView.register(Reusable.recommendFooter, kind: SupplementaryViewKind.footer)\n    }\n    \n    func bindUI() {\n        \n        dataSource = RxCollectionViewSectionedReloadDataSource<HCRecommendSection>(configureCell: { (ds, cv, indexPath, item) -> UICollectionViewCell in\n            \n            if indexPath.section == 0 || indexPath.section == 1 || indexPath.section == 8 {\n                \n                let cell = cv.dequeue(Reusable.recommendCell, for: indexPath)\n                \n                var newItem = item\n\n                if indexPath.section == 8 {\n                    newItem.title = item.name\n                    newItem.pic = item.coverLarge\n                }\n                \n                cell.item = newItem\n                return cell\n            }\n            \n            let cell = cv.dequeue(Reusable.recommendSingleCell, for: indexPath)\n            \n            if indexPath.section == 4 {\n                cell.cellType = .play\n            } else {\n                cell.cellType = .read\n            }\n            \n            let dsSection = ds[indexPath.section]\n\n            // 单元格 底部横线\n            if let maxIndex = dsSection.category?.list?.count, indexPath.row == maxIndex - 1 {\n                cell.bottomLine?.isHidden = false\n                cell.bottomLine?.snp.updateConstraints({ (make) in\n                    make.left.equalTo(MetricGlobal.margin * 1.5)\n                    make.right.equalTo(-MetricGlobal.margin * 1.5)\n                })\n            } else {\n                cell.bottomLine?.isHidden = false\n                cell.bottomLine?.snp.updateConstraints({ (make) in\n                    make.left.equalTo(cell.leftImgView.right)\n                })\n            }\n            \n            cell.item = item\n            \n            return cell\n\n        }, configureSupplementaryView: { (ds, cv, kind, indexPath) in\n            \n            let dsSection = ds[indexPath.section]\n\n            if kind == UICollectionElementKindSectionHeader {\n                \n                // 滚动条头部\n                if indexPath.section == 0 {\n                    \n                    let recommendTopHeader = cv.dequeue(Reusable.recommendTopHeader, kind: .header, for: indexPath)\n                    let picArr = dsSection.focusList?.map({ (model) -> String in\n                        return model.cover\n                    }) ?? []\n                    recommendTopHeader.picArr.value = picArr\n                    var guessYouLike = dsSection.category\n                    guessYouLike?.title = \"猜你喜欢\"\n                    recommendTopHeader.categoryModel.value = guessYouLike\n                    \n                    if let squareList = dsSection.squareList {\n                        recommendTopHeader.squareArr.value = squareList\n                    }\n                    \n                    return recommendTopHeader\n                }\n                // 其他头部\n                else {\n                    \n                    let recommendHeader = cv.dequeue(Reusable.recommendHeader, kind: .header, for: indexPath)\n                    \n                    recommendHeader.categoryModel.value = dsSection.category\n                    \n                    return recommendHeader\n                }\n            } else {\n                \n                // 横线\n                let recommendFooter = cv.dequeue(Reusable.recommendFooter, kind: .footer, for: indexPath)\n                if indexPath.section == 0 || indexPath.section == 1 || indexPath.section == 8 {\n                    recommendFooter.topLine.isHidden = false\n                } else {\n                    recommendFooter.topLine.isHidden = true\n                }\n                return recommendFooter\n            }\n        })\n        \n        vmOutput = viewModel.transform(input: HCRecommendViewModel.HCRecommendInput())\n        \n        vmOutput?.sections.asDriver().drive(collectionView.rx.items(dataSource: dataSource)).disposed(by: rx.disposeBag)\n        \n        refreshHeader = initRefreshGifHeader(collectionView) { [weak self] in\n            self?.vmOutput?.requestCommand.onNext(true)\n        }\n        let refreshFooter = initRefreshFooter(collectionView) { [weak self] in\n            self?.vmOutput?.requestCommand.onNext(false)\n        }\n        vmOutput?.autoSetRefreshHeaderStatus(header: refreshHeader, footer: refreshFooter).disposed(by: rx.disposeBag)\n        \n        refreshHeader.beginRefreshing()\n    }\n}\n\n// MARK:- 布局\nextension HCRecommendViewController: UICollectionViewDelegateFlowLayout {\n    \n    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {\n        \n        if indexPath.section == 0 || indexPath.section == 1 || indexPath.section == 8 {\n            \n            return HCRecommendCell.itemSize()\n        }\n        \n        return HCRecommendSingleCell.itemSize()\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {\n        \n        if section == 0 {\n            \n            return HCRecommendTopHeaderView.headerSize()\n            \n        } else if section == 1 || section == 4 || section == 8 {\n            \n            return HCRecommendHeaderView.minHeaderSize()\n        }\n        \n        return HCRecommendHeaderView.defaultHeaderSize()\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize {\n        \n        return HCRecommendFooterView.footerSize()\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, shouldHighlightItemAt indexPath: IndexPath) -> Bool {\n        \n        if indexPath.section == 0 || indexPath.section == 1 || indexPath.section == 8 {\n            return false\n        }\n        return true\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, didHighlightItemAt indexPath: IndexPath) {\n        // HCRecommendSingleCell 设置高亮\n        let cell = collectionView.cellForItem(at: indexPath) as? HCRecommendSingleCell\n        cell?.contentView.backgroundColor = kThemeOrangeRedColor\n        cell?.bottomLine?.isHidden = true\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, didUnhighlightItemAt indexPath: IndexPath) {\n\n        let cell = collectionView.cellForItem(at: indexPath) as? HCRecommendSingleCell\n        cell?.contentView.backgroundColor = kThemeWhiteColor\n        cell?.bottomLine?.isHidden = false\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {\n        if section == 0 || section == 1 || section == 8 {\n            return UIEdgeInsets(top: 0, left: HCRecommendCell.itemMargin() * 1.5, bottom: 0, right: HCRecommendCell.itemMargin() * 1.5)\n        }\n        return UIEdgeInsets.zero\n    }\n}\n\nprivate enum Reusable {\n    \n    static let recommendCell = ReusableCell<HCRecommendCell>(nibName: \"HCRecommendCell\")\n    \n    static let recommendSingleCell = ReusableCell<HCRecommendSingleCell>(nibName: \"HCRecommendSingleCell\")\n\n    static let recommendTopHeader = ReusableView<HCRecommendTopHeaderView>(identifier: \"HCRecommendTopHeaderView\", nibName: \"HCRecommendTopHeaderView\")\n    \n    static let recommendHeader = ReusableView<HCRecommendHeaderView>(identifier: \"HCRecommendHeaderView\", nibName: \"HCRecommendHeaderView\")\n    \n    static let recommendFooter = ReusableView<HCRecommendFooterView>(identifier: \"HCRecommendFooterView\", nibName: \"HCRecommendFooterView\")\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Recommend(推荐)/Model/HCActivityModel.swift",
    "content": "//\n//  HCActivityModel.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/17.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\n/**\n \n shareData : null\n isShareFlag : false\n thirdStatUrl : null\n thirdShowStatUrls : null\n thirdClickStatUrls\n showTokens\n clickTokens\n recSrc : null\n recTrack : null\n link : \"http://ad.ximalaya.com/adrecord?sdn=H4sIAAAAAAAAAKtWykhNTEktUrLKK83J0VFKzs_PzkyF8QoSixJzU0tSi4qVrKqVElM8S1JzPVOUrJRMDC2MTJRqawFtHxxrPwAAAA&ad=41824&xmly=uiwebview\"\n realLink : \"http://m.ximalaya.com/s-activity/a_tcdh/index.html\"\n adMark : \"http://fdfs.xmcdn.com/group22/M0B/EF/D7/wKgJM1ltap7BdV9dAAAF3O2tHpE659.png\"\n isLandScape : false\n isInternal : -1\n cover : \"http://fdfs.xmcdn.com/group36/M01/FA/C4/wKgJUloqThKzE1oLAAJQ1xgg26s045.png\"\n showstyle : 13\n name : null\n description : null\n scheme : null\n linkType : 1\n displayType : 1\n clickType : 1\n openlinkType : 0\n loadingShowTime : 3000\n apkUrl : null\n adtype : 0\n auto : false\n startAt : 1513511400000\n endAt : 1513590659000\n closable : false\n adid : 41824\n \n */\nimport Foundation\nimport ObjectMapper\n\nstruct HCActivityModel: Mappable {\n    \n    init?(map: Map) {\n        \n    }\n    \n    mutating func mapping(map: Map) {\n        \n        adid <- map[\"adid\"]\n        link <- map[\"link\"]\n        realLink <- map[\"realLink\"]\n        adMark <- map[\"adMark\"]\n        cover <- map[\"cover\"]\n    }\n    \n    var adid = 0\n    var link = \"\"\n    var realLink = \"\"\n    var adMark = \"\"\n    var cover = \"\"\n}\n\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Recommend(推荐)/Model/HCCategoryModel.swift",
    "content": "//\n//  HCCategoryModel.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/16.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\n/**\n \n bottomHasMore : false\n categoryId : 3\n direction : \"column\"\n hasMore : true\n keywords : []\n list : []\n loopCount : 6\n moduleType : \"categoriesForShort\"\n showInterestCard : false\n target : {}\n title : \"最热有声书\"\n \n */\n\nimport Foundation\nimport ObjectMapper\n\nstruct HCCategoryModel: Mappable {\n    \n    init?(map: Map) {\n        \n    }\n    \n    mutating func mapping(map: Map) {\n        \n        bottomHasMore <- map[\"bottomHasMore\"]\n        categoryId <- map[\"categoryId\"]\n        direction <- map[\"direction\"]\n        hasMore <- map[\"hasMore\"]\n        keywords <- map[\"keywords\"]\n        \n        list <- map[\"list\"]\n        loopCount <- map[\"loopCount\"]\n        moduleType <- map[\"moduleType\"]\n        showInterestCard <- map[\"showInterestCard\"]\n        target <- map[\"target\"]\n\n        title <- map[\"title\"]\n    }\n    \n    var bottomHasMore = false\n    var categoryId = 0\n    var direction = \"\"\n    var hasMore = true\n    var keywords : [HCKeywardsModel]?\n    \n    var list : [HCRecommendItemModel]?\n    var loopCount = 0\n    var moduleType = \"\"\n    var showInterestCard = false\n    var target : [String : Any]?\n\n    var title = \"\"\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Recommend(推荐)/Model/HCFocusModel.swift",
    "content": "//\n//  HCFocusModel.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/16.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\n/**\n \n \"adId\": 41892,\n \"adType\": 0,\n \"buttonShowed\": false,\n \"clickAction\": -1,\n \"clickTokens\": [\"inIEgatIFLVnTqKaWrGVNt/F5qd4/UPMEuxGzAyUFIIMP4I7JKEg9ROkh3k45vQO\", \"EmH6Tly0XTA6Az9RI4j/0s89FsE333MqFiB8GbST7bYMP4I7JKEg9ROkh3k45vQO\", \"J42B2rewA3tqvPhwdaoqqtd8xfm/zo69QiIcIIzZuxcMP4I7JKEg9ROkh3k45vQO\"],\n \"clickType\": 1,\n \"cover\": \"http://fdfs.xmcdn.com/group36/M00/62/01/wKgJUlozZ-zACrrjAAIeynG4BQg008.jpg\",\n \"description\": \"\",\n \"displayType\": 1,\n \"isAd\": false,\n \"isInternal\": 1,\n \"isLandScape\": false,\n \"isShareFlag\": false,\n \"link\": \"http://ad.ximalaya.com/adrecord?sdn=H4sIAAAAAAAAAKtWykhNTEktUrLKK83J0VFKzs_PzkyF8QoSixJzU0tSi4qVrKqVElM8S1JzPVOUrJRMDC0sjZRqawGgcac5PwAAAA&ad=41892&xmly=uiwebview\",\n \"name\": \"\",\n \"openlinkType\": 0,\n \"realLink\": \"iting://open?msg_type=13&album_id=8225829\",\n \"showTokens\": [\"B8W2CTPeKNlhRwRpQQl3+pfGBAKcdSw31R/cMpSQi94MP4I7JKEg9ROkh3k45vQO\", \"CpGU2xkE7lN+W6My8OT342a677hQtMwkrph+szoSoFwMP4I7JKEg9ROkh3k45vQO\", \"0KK0zVovY5nS0sd1oiuy4swCRd7bqaHuBodzkD/A238MP4I7JKEg9ROkh3k45vQO\", \"JhRWTadKClFkY2g9km84p8/X4H97k38TrwlHziQYIxcMP4I7JKEg9ROkh3k45vQO\", \"nMIShpz4zBEeeq7vFipX4byOMqA7GCUCs9OT4zYi0JkMP4I7JKEg9ROkh3k45vQO\"],\n \"targetId\": -1,\n \"thirdClickStatUrls\": []\n \n */\n\nimport Foundation\nimport ObjectMapper\n\nstruct HCFocusModel: Mappable {\n    \n    init?(map: Map) {\n\n    }\n    \n    mutating func mapping(map: Map) {\n        \n        adId <- map[\"adId\"]\n        cover <- map[\"cover\"]\n        link <- map[\"link\"]\n        realLink <- map[\"realLink\"]\n        name <- map[\"name\"]\n        \n        description <- map[\"description\"]\n    }\n    \n    var adId = 0\n    var cover = \"\"\n    var link = \"\"\n    var realLink = \"\"\n    var name = \"\"\n    \n    var description = \"\"\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Recommend(推荐)/Model/HCKeywardsModel.swift",
    "content": "//\n//  HCKeywardsModel.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/16.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\n/**\n \n categoryId : 3\n categoryTitle : \"有声书\"\n keywordId : 28\n keywordName : \"推理\"\n keywordType : 1\n materialType : \"keyword\"\n realCategoryId : 3\n \n */\n\nimport Foundation\nimport ObjectMapper\n\nstruct HCKeywardsModel: Mappable {\n    \n    init?(map: Map) {\n        \n    }\n    \n    mutating func mapping(map: Map) {\n        \n        categoryId <- map[\"categoryId\"]\n        categoryTitle <- map[\"categoryTitle\"]\n        keywordId <- map[\"keywordId\"]\n        keywordName <- map[\"keywordName\"]\n        keywordType <- map[\"keywordType\"]\n        \n        materialType <- map[\"materialType\"]\n        realCategoryId <- map[\"realCategoryId\"]\n    }\n    \n    var categoryId = 0\n    var categoryTitle = \"\"\n    var keywordId = 0\n    var keywordName = \"\"\n    var keywordType = 0\n    \n    var materialType = \"\"\n    var realCategoryId = 0\n}\n\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Recommend(推荐)/Model/HCRecommendCellTypeModel.swift",
    "content": "//\n//  HCRecommendCellTypeModel.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/18.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nenum HCRecommendCellType {\n    case none\n    case defaultSingleCell\n    case liveSingleCell\n    case defaultThreeCell\n}\n\nclass HCRecommendCellTypeModel: NSObject {\n\n    var type: HCRecommendCellType = .none\n    var section: Int = -1\n\n    override init() {\n        super.init()\n    }\n    \n    init(type: HCRecommendCellType, section: Int) {\n        super.init()\n        self.type = type\n        self.section = section\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Recommend(推荐)/Model/HCRecommendItemModel.swift",
    "content": "//\n//  HCRecommendItemModel.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/16.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//  首页-通用 数据模型\n\n/**\n \n albumId : 6737591\n categoryId : 6\n commentScore : 4.9\n commentsCount : 183\n discountedPrice : 49\n displayDiscountedPrice : \"49.00喜点\"\n displayPrice : \"49.00喜点\"\n infoType : \"play_or_score\"\n isDraft : false\n isFinished : 2\n isPaid : true\n isVipFree : false\n lastUptrackAt : 1487130859000\n materialType : \"album\"\n pic : \"http://fdfs.xmcdn.com/group23/M07/89/72/wKgJNFijyQfAIZjBAACd_-M6pms486_mobile_large.jpg\"\n playsCount : 2589482\n price : 49\n priceTypeEnum : 2\n priceUnit : \"喜点\"\n recSrc : \"TCPB.164V1\"\n recTrack : \"PayBestB.1001\"\n refundSupportType : 0\n subtitle : \"凯叔改编：逗趣又内涵，西游记就该这么玩\"\n title : \"凯叔西游记【第四部全集】\"\n tracksCount : 24\n \n // 精品单听\n coverPath : \"http://fdfs.xmcdn.com/group36/M07/1B/D7/wKgJUlox4bjxn6MdAACTn0-Xj3E231_mobile_small.jpg\"\n footnote : \"6首声音\"\n \n // 直播\n coverLarge : \"http://fdfs.xmcdn.com/group36/M00/90/20/wKgJUlo0jGzRkzMnAAEbPHYKcDQ5206455_mobile_large\"\n name : \"歪，敌方还有五秒钟到达战场~\"\n nickname : \"珍视_MC白院长\"\n \n // 首页-精品\n intro : \"国家级精品国学课，还原真实的孔子\"\n tracks : 49\n playsCounts : 5096977\n coverMiddle : \"http://fdfs.xmcdn.com/group37/M09/67/6E/wKgJoFpK-86wD11tAAHQ2lluDAE309_mobile_meduim.jpg\"\n tags : \"国学,论语,孔子\"\n trackId : 66732255\n trackTitle : \"008|中国人在其他场合是怎么巧用《论语》的？\"\n displayVipPrice : \"189.05喜点\"\n \n */\n\nimport Foundation\nimport ObjectMapper\n\nstruct HCRecommendItemModel: Mappable {\n    \n    init?(map: Map) {\n        \n    }\n    \n    mutating func mapping(map: Map) {\n        \n        albumId <- map[\"albumId\"]\n        categoryId <- map[\"categoryId\"]\n        commentScore <- map[\"commentScore\"]\n        commentsCount <- map[\"commentsCount\"]\n        discountedPrice <- map[\"discountedPrice\"]\n        \n        displayDiscountedPrice <- map[\"displayDiscountedPrice\"]\n        displayPrice <- map[\"displayPrice\"]\n        materialType <- map[\"materialType\"]\n        pic <- map[\"pic\"]\n        playsCount <- map[\"playsCount\"]\n        \n        price <- map[\"price\"]\n        priceTypeEnum <- map[\"priceTypeEnum\"]\n        priceUnit <- map[\"priceUnit\"]\n        recSrc <- map[\"recSrc\"]\n        recTrack <- map[\"recTrack\"]\n        \n        subtitle <- map[\"subtitle\"]\n        title <- map[\"title\"]\n        tracksCount <- map[\"tracksCount\"]\n        isFinished <- map[\"isFinished\"]\n        coverPath <- map[\"coverPath\"]\n        \n        footnote <- map[\"footnote\"]\n        coverLarge <- map[\"coverLarge\"]\n        name <- map[\"name\"]\n        nickname <- map[\"nickname\"]\n        intro <- map[\"intro\"]\n        \n        tracks <- map[\"tracks\"]\n        playsCounts <- map[\"playsCounts\"]\n        coverMiddle <- map[\"coverMiddle\"]\n        tags <- map[\"tags\"]\n        trackId <- map[\"trackId\"]\n        \n        trackTitle <- map[\"trackTitle\"]\n        displayVipPrice <- map[\"displayVipPrice\"]\n    }\n    \n    var albumId = 0\n    var categoryId = 0\n    var commentScore = 0\n    var commentsCount = 0\n    var discountedPrice = 0\n    \n    var displayDiscountedPrice = \"\"\n    var displayPrice = \"\"\n    var materialType = \"\"\n    var pic = \"\"\n    var playsCount = 0\n    \n    var price = 0\n    var priceTypeEnum = 0\n    var priceUnit = \"\"\n    var recSrc = \"\"\n    var recTrack = \"\"\n    \n    var subtitle = \"\"\n    var title = \"\"\n    var tracksCount = 0\n    var isFinished = 0\n    var coverPath = \"\"\n    \n    var footnote = \"\"\n    var coverLarge = \"\"\n    var name = \"\"\n    var nickname = \"\"\n    var intro = \"\"\n    \n    var tracks = 0\n    var playsCounts = 0\n    var coverMiddle = \"\"\n    var tags = \"\"\n    var trackId = 0\n    \n    var trackTitle = \"\"\n    var displayVipPrice = \"\"\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Recommend(推荐)/Model/HCRecommendModel.swift",
    "content": "//\n//  HCRecommendModel.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/17.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//  首页-推荐\n\n/**\n \n ret : 0\n maxPageId : 5\n totalCount : 100\n list\n msg : \"成功\"\n \n */\n\nimport Foundation\nimport ObjectMapper\n\nstruct HCRecommendModel: Mappable {\n    init?(map: Map) {\n        \n    }\n    \n    mutating func mapping(map: Map) {\n        \n        ret <- map[\"ret\"]\n        maxPageId <- map[\"maxPageId\"]\n        totalCount <- map[\"totalCount\"]\n        msg <- map[\"msg\"]\n\n        focusList <- map[\"list.0.list.0.data\"]\n        squareList <- map[\"list.1.list\"]\n        categoryList <- map[\"list\"]\n        nextCategoryList <- map[\"list\"]\n    }\n    \n    var ret = 0\n    var maxPageId = 5\n    var totalCount = 100\n    var msg = \"成功\"\n\n    var focusList: [HCFocusModel]?\n    var squareList: [HCSquareModel]?\n    var categoryList: [HCCategoryModel]?\n    var nextCategoryList: [HCRecommendItemModel]?\n}\n\n\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Recommend(推荐)/Model/HCSquareModel.swift",
    "content": "//\n//  HCSquareModel.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/16.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\n/**\n \n bubbleText : \"\"\n contentType : \"html5\"\n contentUpdatedAt : 0\n coverPath : \"http://fdfs.xmcdn.com/group34/M0A/54/B6/wKgJYVnypRfjrrvpAAA9l0GXd1w940.jpg\"\n enableShare : false\n id : 1907\n isExternalUrl : false\n sharePic : \"\"\n subtitle : \"来自耶鲁、清华、北大、南大、长江商学院的严选好课\"\n title :\n url : \"http://m.ximalaya.com/master-class/home.html?ts=1513415847580\"\n \n */\n\n\nimport Foundation\nimport ObjectMapper\n\nstruct HCSquareModel: Mappable {\n    \n    init?(map: Map) {\n        \n    }\n    \n    mutating func mapping(map: Map) {\n        \n        id <- map[\"adId\"]\n        coverPath <- map[\"coverPath\"]\n        sharePic <- map[\"sharePic\"]\n        subtitle <- map[\"subtitle\"]\n        title <- map[\"title\"]\n        \n        url <- map[\"url\"]\n    }\n    \n    var id = 0\n    var coverPath = \"\"\n    var sharePic = \"\"\n    var subtitle = \"\"\n    var title = \"\"\n    \n    var url = \"\"\n}\n\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Recommend(推荐)/View/Cell/HCRecommendCell.swift",
    "content": "//\n//  HCRecommendswift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/16.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nfileprivate struct Metric {\n    \n    static let margin : CGFloat = 10\n    static let scale : CGFloat = 18 / 13\n    static let column: CGFloat = 3\n}\n\nclass HCRecommendCell: UICollectionViewCell {\n\n    @IBOutlet weak var descLab: UILabel!\n    @IBOutlet weak var iconBtn: UIButton!\n    \n    var item: HCRecommendItemModel? { didSet { setItem() } }\n    \n    override func awakeFromNib() {\n        super.awakeFromNib()\n        \n        iconBtn.layer.masksToBounds = true\n        iconBtn.layer.borderColor = UIColor.lightGray.cgColor\n        iconBtn.layer.borderWidth = 0.5\n        iconBtn.addTarget(self, action: #selector(iconTouchDown(btn:)), for: .touchDown)\n        iconBtn.addTarget(self, action: #selector(iconTouchUpInside(btn:)), for: .touchUpInside)\n    }\n    \n    @objc func iconTouchDown(btn: UIButton?) {\n        iconBtn.backgroundColor = kThemeOrangeRedColor\n    }\n    \n    @objc func iconTouchUpInside(btn: UIButton?) {\n        iconBtn.backgroundColor = kThemeWhiteColor\n    }\n    \n    func setItem() {\n        \n        guard let item = self.item else { return }\n\n        iconBtn.kf.setBackgroundImage(with: URL(string: item.pic), for: .normal)\n        descLab.text = item.title\n    }\n    \n    static func itemMargin() -> CGFloat {\n        \n        return Metric.margin\n    }\n\n    static func itemSize() -> CGSize {\n        // 结合 FlowLayout 设置\n        let width = (kScreenW - Metric.margin * (Metric.column - 1 + 3)) / Metric.column\n        let height = width * Metric.scale\n        \n        return CGSize(width: width, height: height)\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Recommend(推荐)/View/Cell/HCRecommendCell.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"13196\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"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=\"13173\"/>\n        <capability name=\"Aspect ratio constraints\" minToolsVersion=\"5.1\"/>\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=\"HCRecommendCell\" customModule=\"RxXMLY\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"130\" height=\"180\"/>\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=\"130\" height=\"180\"/>\n                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                <subviews>\n                    <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3je-GF-3WJ\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"130\" height=\"130\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"width\" constant=\"130\" id=\"30n-QG-7ya\"/>\n                            <constraint firstAttribute=\"width\" secondItem=\"3je-GF-3WJ\" secondAttribute=\"height\" id=\"qLt-f6-bGv\"/>\n                        </constraints>\n                        <color key=\"tintColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"calibratedWhite\"/>\n                    </button>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Label\" lineBreakMode=\"tailTruncation\" numberOfLines=\"0\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"S3A-bc-YbX\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"130\" width=\"130\" height=\"17\"/>\n                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                        <nil key=\"textColor\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                </subviews>\n            </view>\n            <constraints>\n                <constraint firstAttribute=\"trailing\" secondItem=\"3je-GF-3WJ\" secondAttribute=\"trailing\" id=\"9P4-4A-lvV\"/>\n                <constraint firstItem=\"S3A-bc-YbX\" firstAttribute=\"top\" secondItem=\"3je-GF-3WJ\" secondAttribute=\"bottom\" id=\"PMs-LB-rKt\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"S3A-bc-YbX\" secondAttribute=\"trailing\" id=\"XGO-C5-2WU\"/>\n                <constraint firstItem=\"S3A-bc-YbX\" firstAttribute=\"leading\" secondItem=\"gTV-IL-0wX\" secondAttribute=\"leading\" id=\"aWp-CV-pos\"/>\n                <constraint firstAttribute=\"bottom\" relation=\"greaterThanOrEqual\" secondItem=\"S3A-bc-YbX\" secondAttribute=\"bottom\" constant=\"5\" id=\"ejr-hf-96d\"/>\n                <constraint firstItem=\"3je-GF-3WJ\" firstAttribute=\"leading\" secondItem=\"gTV-IL-0wX\" secondAttribute=\"leading\" id=\"qfX-Uc-JGb\"/>\n                <constraint firstItem=\"3je-GF-3WJ\" firstAttribute=\"top\" secondItem=\"gTV-IL-0wX\" secondAttribute=\"top\" id=\"sqU-Ot-xfi\"/>\n            </constraints>\n            <connections>\n                <outlet property=\"descLab\" destination=\"S3A-bc-YbX\" id=\"q80-qO-Jmh\"/>\n                <outlet property=\"iconBtn\" destination=\"3je-GF-3WJ\" id=\"PXV-Va-bdl\"/>\n            </connections>\n        </collectionViewCell>\n    </objects>\n</document>\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Recommend(推荐)/View/Cell/HCRecommendSingleCell.swift",
    "content": "//\n//  HCRecommendSingleswift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/17.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nfileprivate struct Metric {\n    static let scale : CGFloat = 120 / 375\n    static let column: CGFloat = 1\n    static let margin : CGFloat = 5\n}\n\npublic enum HCRecommendSingleType {\n    case play\n    case read\n}\n\nclass HCRecommendSingleCell: UICollectionViewCell {\n\n    @IBOutlet weak var leftTopLabCons: NSLayoutConstraint!\n    @IBOutlet weak var leftImgView: UIImageView!\n    @IBOutlet weak var leftTopTipView: UIView!\n    @IBOutlet weak var leftTopTipLab: UILabel!\n    @IBOutlet weak var leftTopLab: UILabel!\n    @IBOutlet weak var leftCenterLab: UILabel!\n    \n    @IBOutlet weak var leftBottomImgView1: UIImageView!\n    @IBOutlet weak var leftBottomImgView2: UIImageView!\n    @IBOutlet weak var leftBottomLab1: UILabel!\n    @IBOutlet weak var leftBottomLab2: UILabel!\n    \n    // 下划线\n    var bottomLine: UIView?\n\n    var cellType: HCRecommendSingleType = .read\n    \n    var item: HCRecommendItemModel? { didSet { setItem() } }\n    \n    override func awakeFromNib() {\n        super.awakeFromNib()\n        self.leftImgView.layer.masksToBounds = true\n        self.leftImgView.layer.borderColor = kThemeGainsboroColor.cgColor\n        self.leftImgView.layer.borderWidth = 0.6\n        \n        initEnableMudule()\n    }\n    \n    override func layoutSubviews() {\n        super.layoutSubviews()\n    }\n\n    func setItem() {\n        \n        guard let item = self.item else { return }\n        \n        if cellType == .read {\n            \n            leftTopLab.text = item.title\n            leftImgView.kf.setImage(with: URL(string: item.pic))\n            leftBottomImgView1.image = UIImage(named: \"album_play\")\n            leftBottomImgView2.isHidden = false\n            leftCenterLab.text = item.subtitle\n            \n            leftBottomLab1.text = self.defaultPlaysCount(item.playsCount)\n            leftBottomLab2.text = \"\\(item.tracksCount)集\"\n        } else {\n            \n            leftTopLab.text = item.title\n            leftImgView.kf.setImage(with: URL(string: item.coverPath))\n            leftBottomImgView1.image = UIImage(named: \"dailylistening_icon_album\")\n            leftBottomImgView2.isHidden = true\n            leftCenterLab.text = item.subtitle\n            leftBottomLab1.text = \"\\(item.footnote)\"\n            leftBottomLab2.text = \"\" \n        }\n        \n        if item.isFinished == 0 {\n            leftTopTipView.isHidden = true\n            leftTopLabCons.constant = -leftTopTipLab.width - 5\n        } else {\n            leftTopTipView.isHidden = false\n            leftTopTipView.backgroundColor = kThemeLimeGreenColor\n            leftTopLabCons.constant = 5.0\n            leftTopTipLab.text = \"完结\"\n        }\n    }\n    \n    private func defaultPlaysCount(_ playsCount: Int) -> String {\n        if playsCount < 10000 {\n            return \"\\(playsCount)\"\n        } else {\n            let result = String(format: \"%.1f万\", Float(playsCount) / 10000.0)\n            return result\n        }\n    }\n    \n    static func itemSize() -> CGSize {\n        // 结合 FlowLayout 设置\n        let width = kScreenW\n        let height = width * Metric.scale\n        \n        return CGSize(width: width, height: height)\n    }\n}\n\nextension HCRecommendSingleCell: HCCellStyleable {\n    \n    // MARK:- 协议组件\n    private func initEnableMudule() {\n        \n        // 横线\n        bottomLine = bottomLine(style: .marginLeft)\n        bottomLine?.backgroundColor = kThemeLightGreyColor\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Recommend(推荐)/View/Cell/HCRecommendSingleCell.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"13196\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"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=\"13173\"/>\n        <capability name=\"Aspect ratio constraints\" minToolsVersion=\"5.1\"/>\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=\"HCRecommendSingleCell\" customModule=\"RxXMLY\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"120\"/>\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=\"375\" height=\"120\"/>\n                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                <subviews>\n                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"qGQ-h5-Qjd\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"120\"/>\n                        <subviews>\n                            <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"F2R-LN-ayt\">\n                                <rect key=\"frame\" x=\"15\" y=\"25.5\" width=\"70\" height=\"69.5\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" secondItem=\"F2R-LN-ayt\" secondAttribute=\"height\" id=\"xY0-bF-8R9\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"70\" id=\"ywq-1Z-DXf\"/>\n                                </constraints>\n                            </imageView>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"79Y-3B-HZz\">\n                                <rect key=\"frame\" x=\"90\" y=\"25.5\" width=\"35\" height=\"16.5\"/>\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=\"ecZ-Zc-CzZ\">\n                                        <rect key=\"frame\" x=\"2\" y=\"1\" width=\"31\" height=\"14.5\"/>\n                                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"12\"/>\n                                        <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                </subviews>\n                                <color key=\"backgroundColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"ecZ-Zc-CzZ\" secondAttribute=\"trailing\" constant=\"2\" id=\"ViA-nn-FBv\"/>\n                                    <constraint firstItem=\"ecZ-Zc-CzZ\" firstAttribute=\"centerX\" secondItem=\"79Y-3B-HZz\" secondAttribute=\"centerX\" id=\"ZTr-mj-Mpa\"/>\n                                    <constraint firstItem=\"ecZ-Zc-CzZ\" firstAttribute=\"leading\" secondItem=\"79Y-3B-HZz\" secondAttribute=\"leading\" constant=\"2\" id=\"mWp-UF-IeF\"/>\n                                    <constraint firstItem=\"ecZ-Zc-CzZ\" firstAttribute=\"centerY\" secondItem=\"79Y-3B-HZz\" secondAttribute=\"centerY\" id=\"pwl-3Z-1XA\"/>\n                                    <constraint firstItem=\"ecZ-Zc-CzZ\" firstAttribute=\"top\" secondItem=\"79Y-3B-HZz\" secondAttribute=\"top\" constant=\"1\" id=\"suA-Mo-nfw\"/>\n                                    <constraint firstAttribute=\"bottom\" secondItem=\"ecZ-Zc-CzZ\" secondAttribute=\"bottom\" constant=\"1\" id=\"tx2-3M-wOb\"/>\n                                </constraints>\n                            </view>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Label\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"i5r-1T-jGv\">\n                                <rect key=\"frame\" x=\"130\" y=\"23.5\" width=\"39.5\" height=\"19.5\"/>\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=\"oER-Ep-nuE\">\n                                <rect key=\"frame\" x=\"90\" y=\"51.5\" width=\"35.5\" height=\"17\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"album_play\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kO8-Ha-kAi\">\n                                <rect key=\"frame\" x=\"89.5\" y=\"82.5\" width=\"10\" height=\"10\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" constant=\"10\" id=\"OWA-tZ-0Nf\"/>\n                                    <constraint firstAttribute=\"width\" secondItem=\"kO8-Ha-kAi\" secondAttribute=\"height\" multiplier=\"1:1\" id=\"hl1-Z1-2kS\"/>\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=\"N7D-0U-1pC\">\n                                <rect key=\"frame\" x=\"104.5\" y=\"80.5\" width=\"31\" height=\"14.5\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"12\"/>\n                                <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"album_tracks\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"4py-BU-yK5\">\n                                <rect key=\"frame\" x=\"140.5\" y=\"81.5\" width=\"12\" height=\"12\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" secondItem=\"4py-BU-yK5\" secondAttribute=\"height\" multiplier=\"1:1\" id=\"Z27-bI-gQ8\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"12\" id=\"hA6-LG-uvi\"/>\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=\"Oqa-Rz-IKI\">\n                                <rect key=\"frame\" x=\"157.5\" y=\"80.5\" width=\"31\" height=\"14.5\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"12\"/>\n                                <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                        </subviews>\n                        <constraints>\n                            <constraint firstItem=\"kO8-Ha-kAi\" firstAttribute=\"bottom\" secondItem=\"F2R-LN-ayt\" secondAttribute=\"bottom\" priority=\"500\" id=\"1Pn-Xl-1bh\"/>\n                            <constraint firstItem=\"oER-Ep-nuE\" firstAttribute=\"centerY\" secondItem=\"F2R-LN-ayt\" secondAttribute=\"centerY\" id=\"22p-10-Gvd\"/>\n                            <constraint firstItem=\"N7D-0U-1pC\" firstAttribute=\"bottom\" secondItem=\"F2R-LN-ayt\" secondAttribute=\"bottom\" id=\"4j6-2s-JFO\"/>\n                            <constraint firstItem=\"79Y-3B-HZz\" firstAttribute=\"top\" secondItem=\"F2R-LN-ayt\" secondAttribute=\"top\" id=\"559-mN-ziC\"/>\n                            <constraint firstAttribute=\"trailing\" relation=\"greaterThanOrEqual\" secondItem=\"i5r-1T-jGv\" secondAttribute=\"trailing\" constant=\"5\" id=\"6ia-mq-Yoo\"/>\n                            <constraint firstItem=\"oER-Ep-nuE\" firstAttribute=\"leading\" secondItem=\"F2R-LN-ayt\" secondAttribute=\"trailing\" constant=\"5\" id=\"MAM-ow-Tif\"/>\n                            <constraint firstItem=\"79Y-3B-HZz\" firstAttribute=\"leading\" secondItem=\"F2R-LN-ayt\" secondAttribute=\"trailing\" constant=\"5\" id=\"Ral-zJ-YEV\"/>\n                            <constraint firstItem=\"F2R-LN-ayt\" firstAttribute=\"leading\" secondItem=\"qGQ-h5-Qjd\" secondAttribute=\"leading\" constant=\"15\" id=\"Ryt-98-0i9\"/>\n                            <constraint firstAttribute=\"trailing\" relation=\"greaterThanOrEqual\" secondItem=\"Oqa-Rz-IKI\" secondAttribute=\"trailing\" constant=\"5\" id=\"U5t-Zh-QfJ\"/>\n                            <constraint firstItem=\"F2R-LN-ayt\" firstAttribute=\"centerY\" secondItem=\"qGQ-h5-Qjd\" secondAttribute=\"centerY\" id=\"UDr-MV-a68\"/>\n                            <constraint firstItem=\"kO8-Ha-kAi\" firstAttribute=\"leading\" secondItem=\"F2R-LN-ayt\" secondAttribute=\"trailing\" constant=\"5\" id=\"UFj-7I-yv4\"/>\n                            <constraint firstItem=\"N7D-0U-1pC\" firstAttribute=\"centerY\" secondItem=\"kO8-Ha-kAi\" secondAttribute=\"centerY\" id=\"XrO-vJ-gHI\"/>\n                            <constraint firstItem=\"Oqa-Rz-IKI\" firstAttribute=\"leading\" secondItem=\"4py-BU-yK5\" secondAttribute=\"trailing\" constant=\"5\" id=\"bD4-Uh-7qh\"/>\n                            <constraint firstItem=\"i5r-1T-jGv\" firstAttribute=\"centerY\" secondItem=\"ecZ-Zc-CzZ\" secondAttribute=\"centerY\" id=\"brS-ro-Ps7\"/>\n                            <constraint firstItem=\"4py-BU-yK5\" firstAttribute=\"centerY\" secondItem=\"kO8-Ha-kAi\" secondAttribute=\"centerY\" id=\"e8A-zQ-Rh3\"/>\n                            <constraint firstItem=\"i5r-1T-jGv\" firstAttribute=\"leading\" secondItem=\"79Y-3B-HZz\" secondAttribute=\"trailing\" constant=\"5\" id=\"kcM-0e-k9P\"/>\n                            <constraint firstItem=\"Oqa-Rz-IKI\" firstAttribute=\"centerY\" secondItem=\"kO8-Ha-kAi\" secondAttribute=\"centerY\" id=\"pTB-Yl-zUp\"/>\n                            <constraint firstItem=\"4py-BU-yK5\" firstAttribute=\"leading\" secondItem=\"N7D-0U-1pC\" secondAttribute=\"trailing\" constant=\"5\" id=\"pa8-I3-yCs\"/>\n                            <constraint firstItem=\"N7D-0U-1pC\" firstAttribute=\"leading\" secondItem=\"kO8-Ha-kAi\" secondAttribute=\"trailing\" constant=\"5\" id=\"t1W-gm-9dX\"/>\n                            <constraint firstAttribute=\"trailing\" relation=\"greaterThanOrEqual\" secondItem=\"oER-Ep-nuE\" secondAttribute=\"trailing\" constant=\"5\" id=\"zwN-Cu-iAb\"/>\n                        </constraints>\n                    </view>\n                </subviews>\n            </view>\n            <constraints>\n                <constraint firstItem=\"qGQ-h5-Qjd\" firstAttribute=\"top\" secondItem=\"gTV-IL-0wX\" secondAttribute=\"top\" id=\"Dsu-ev-7ek\"/>\n                <constraint firstItem=\"qGQ-h5-Qjd\" firstAttribute=\"leading\" secondItem=\"gTV-IL-0wX\" secondAttribute=\"leading\" id=\"T3u-bh-sL1\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"qGQ-h5-Qjd\" secondAttribute=\"trailing\" id=\"cnt-Dv-t1x\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"qGQ-h5-Qjd\" secondAttribute=\"bottom\" id=\"hH9-Gr-ajr\"/>\n            </constraints>\n            <size key=\"customSize\" width=\"59\" height=\"67\"/>\n            <connections>\n                <outlet property=\"leftBottomImgView1\" destination=\"kO8-Ha-kAi\" id=\"chd-Gd-FnD\"/>\n                <outlet property=\"leftBottomImgView2\" destination=\"4py-BU-yK5\" id=\"uLE-4T-lcD\"/>\n                <outlet property=\"leftBottomLab1\" destination=\"N7D-0U-1pC\" id=\"vhW-cd-M25\"/>\n                <outlet property=\"leftBottomLab2\" destination=\"Oqa-Rz-IKI\" id=\"M9y-D9-Zh1\"/>\n                <outlet property=\"leftCenterLab\" destination=\"oER-Ep-nuE\" id=\"x0O-ra-kMj\"/>\n                <outlet property=\"leftImgView\" destination=\"F2R-LN-ayt\" id=\"R17-Xd-A4m\"/>\n                <outlet property=\"leftTopLab\" destination=\"i5r-1T-jGv\" id=\"RaK-U1-Ukc\"/>\n                <outlet property=\"leftTopLabCons\" destination=\"kcM-0e-k9P\" id=\"HSP-hC-gMs\"/>\n                <outlet property=\"leftTopTipLab\" destination=\"ecZ-Zc-CzZ\" id=\"Fw9-Vo-Ft8\"/>\n                <outlet property=\"leftTopTipView\" destination=\"79Y-3B-HZz\" id=\"D76-Gm-yD4\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"-156\" y=\"100\"/>\n        </collectionViewCell>\n    </objects>\n    <resources>\n        <image name=\"album_play\" width=\"12\" height=\"12\"/>\n        <image name=\"album_tracks\" width=\"14\" height=\"14\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Recommend(推荐)/View/Cell/HCSquareCell.swift",
    "content": "//\n//  HCSquareCell.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/17.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nfileprivate struct Metric {\n    \n    static let width: CGFloat = 60\n    static let height : CGFloat = 75\n}\n\nclass HCSquareCell: UICollectionViewCell {\n\n    @IBOutlet weak var iconImg: UIImageView!\n    @IBOutlet weak var titleLab: UILabel!\n    \n    override func awakeFromNib() {\n        super.awakeFromNib()\n    }\n    \n    static func itemMargin() -> CGFloat {\n        \n        return MetricGlobal.margin\n    }\n    \n    static func itemSize() -> CGSize {\n        \n        return CGSize(width: Metric.width, height: Metric.height)\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Recommend(推荐)/View/Cell/HCSquareCell.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"13196\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"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=\"13173\"/>\n        <capability name=\"Aspect ratio constraints\" minToolsVersion=\"5.1\"/>\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=\"HCSquareCell\" customModule=\"RxXMLY\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"65\" height=\"80\"/>\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=\"65\" height=\"80\"/>\n                <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                <subviews>\n                    <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"d8e-kI-x43\">\n                        <rect key=\"frame\" x=\"15\" y=\"12.5\" width=\"35\" height=\"35\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"width\" secondItem=\"d8e-kI-x43\" secondAttribute=\"height\" id=\"nzD-uQ-4pR\"/>\n                            <constraint firstAttribute=\"width\" constant=\"35\" id=\"zTi-Ti-CH9\"/>\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=\"yiH-Lk-67P\">\n                        <rect key=\"frame\" x=\"16\" y=\"52.5\" width=\"33\" height=\"16\"/>\n                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                        <nil key=\"textColor\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                </subviews>\n            </view>\n            <constraints>\n                <constraint firstItem=\"d8e-kI-x43\" firstAttribute=\"centerY\" secondItem=\"gTV-IL-0wX\" secondAttribute=\"centerY\" constant=\"-10\" id=\"1Ii-4H-Drh\"/>\n                <constraint firstItem=\"d8e-kI-x43\" firstAttribute=\"centerX\" secondItem=\"gTV-IL-0wX\" secondAttribute=\"centerX\" id=\"4MF-Vd-a9u\"/>\n                <constraint firstAttribute=\"bottom\" relation=\"greaterThanOrEqual\" secondItem=\"yiH-Lk-67P\" secondAttribute=\"bottom\" constant=\"5\" id=\"H70-WW-I9q\"/>\n                <constraint firstItem=\"yiH-Lk-67P\" firstAttribute=\"centerX\" secondItem=\"gTV-IL-0wX\" secondAttribute=\"centerX\" id=\"cTz-3G-hDV\"/>\n                <constraint firstItem=\"yiH-Lk-67P\" firstAttribute=\"top\" secondItem=\"d8e-kI-x43\" secondAttribute=\"bottom\" constant=\"5\" id=\"ubG-9P-0x5\"/>\n            </constraints>\n            <connections>\n                <outlet property=\"iconImg\" destination=\"d8e-kI-x43\" id=\"44S-dN-rrF\"/>\n                <outlet property=\"titleLab\" destination=\"yiH-Lk-67P\" id=\"ves-hm-XAi\"/>\n            </connections>\n        </collectionViewCell>\n    </objects>\n</document>\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Recommend(推荐)/View/HCRecommendFooterView.swift",
    "content": "//\n//  HCRecommendFooterView.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/17.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nfileprivate struct Metric {\n    \n    static let defaultHeight : CGFloat = 55.0\n}\n\nclass HCRecommendFooterView: UICollectionReusableView {\n\n    @IBOutlet weak var topLine: UIView!\n    @IBOutlet weak var bottomView: UIView!\n    @IBOutlet weak var tipLab: UILabel!\n    @IBOutlet weak var refreshBtn: UIImageView!\n    \n    override func awakeFromNib() {\n        super.awakeFromNib()\n        \n        topLine.isHidden = true\n        topLine.backgroundColor = kThemeLightGreyColor\n        bottomView.backgroundColor = kThemeGainsboroColor\n    }\n    \n    static func footerSize() -> CGSize {\n        \n        return CGSize(width: kScreenW, height: Metric.defaultHeight)\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Recommend(推荐)/View/HCRecommendFooterView.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"13196\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"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=\"13173\"/>\n        <capability name=\"Aspect ratio constraints\" minToolsVersion=\"5.1\"/>\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=\"HCRecommendFooterView\" customModule=\"RxXMLY\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"60\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"1cN-xk-0cy\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"50\"/>\n                    <subviews>\n                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"pJq-PE-KhK\">\n                            <rect key=\"frame\" x=\"16\" y=\"0.0\" width=\"343\" height=\"0.5\"/>\n                            <color key=\"backgroundColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            <constraints>\n                                <constraint firstAttribute=\"height\" constant=\"0.5\" id=\"1bN-h3-6nX\"/>\n                            </constraints>\n                        </view>\n                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"换一批\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"quS-Gb-eyB\">\n                            <rect key=\"frame\" x=\"167.5\" y=\"17\" width=\"40\" height=\"16\"/>\n                            <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                            <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            <nil key=\"highlightedColor\"/>\n                        </label>\n                        <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"guessRefresh\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"vJq-Ry-Sb6\">\n                            <rect key=\"frame\" x=\"210.5\" y=\"17.5\" width=\"15\" height=\"15\"/>\n                            <constraints>\n                                <constraint firstAttribute=\"width\" secondItem=\"vJq-Ry-Sb6\" secondAttribute=\"height\" id=\"XIx-ZJ-Dgn\"/>\n                                <constraint firstAttribute=\"width\" constant=\"15\" id=\"kJf-2p-Ja3\"/>\n                            </constraints>\n                        </imageView>\n                    </subviews>\n                    <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                    <constraints>\n                        <constraint firstItem=\"quS-Gb-eyB\" firstAttribute=\"centerY\" secondItem=\"1cN-xk-0cy\" secondAttribute=\"centerY\" id=\"5Kf-Vk-3Vd\"/>\n                        <constraint firstItem=\"pJq-PE-KhK\" firstAttribute=\"leading\" secondItem=\"1cN-xk-0cy\" secondAttribute=\"leading\" constant=\"16\" id=\"6JS-mI-VXG\"/>\n                        <constraint firstAttribute=\"trailing\" secondItem=\"pJq-PE-KhK\" secondAttribute=\"trailing\" constant=\"16\" id=\"Am4-jT-ylK\"/>\n                        <constraint firstItem=\"quS-Gb-eyB\" firstAttribute=\"centerY\" secondItem=\"1cN-xk-0cy\" secondAttribute=\"centerY\" id=\"DpW-mW-hht\"/>\n                        <constraint firstItem=\"quS-Gb-eyB\" firstAttribute=\"centerX\" secondItem=\"1cN-xk-0cy\" secondAttribute=\"centerX\" id=\"FCW-Ms-43o\"/>\n                        <constraint firstItem=\"vJq-Ry-Sb6\" firstAttribute=\"centerY\" secondItem=\"1cN-xk-0cy\" secondAttribute=\"centerY\" id=\"JyL-pF-1Ff\"/>\n                        <constraint firstItem=\"vJq-Ry-Sb6\" firstAttribute=\"leading\" secondItem=\"quS-Gb-eyB\" secondAttribute=\"trailing\" constant=\"3\" id=\"L56-UA-rob\"/>\n                        <constraint firstItem=\"pJq-PE-KhK\" firstAttribute=\"top\" secondItem=\"1cN-xk-0cy\" secondAttribute=\"top\" id=\"T5j-AG-AOV\"/>\n                    </constraints>\n                </view>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ccK-Xc-2Ew\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"50\" width=\"375\" height=\"10\"/>\n                    <color key=\"backgroundColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                    <constraints>\n                        <constraint firstAttribute=\"height\" constant=\"10\" id=\"0lR-e5-fYm\"/>\n                    </constraints>\n                </view>\n            </subviews>\n            <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n            <constraints>\n                <constraint firstItem=\"1cN-xk-0cy\" firstAttribute=\"top\" secondItem=\"iN0-l3-epB\" secondAttribute=\"top\" id=\"75w-9f-gbe\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"ccK-Xc-2Ew\" secondAttribute=\"bottom\" id=\"X5G-yb-m2O\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"1cN-xk-0cy\" secondAttribute=\"trailing\" id=\"XyT-DO-sPc\"/>\n                <constraint firstItem=\"1cN-xk-0cy\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" id=\"deR-a7-N4f\"/>\n                <constraint firstItem=\"ccK-Xc-2Ew\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" id=\"foF-E4-NBk\"/>\n                <constraint firstItem=\"ccK-Xc-2Ew\" firstAttribute=\"top\" secondItem=\"1cN-xk-0cy\" secondAttribute=\"bottom\" id=\"g6S-Dc-38E\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"ccK-Xc-2Ew\" secondAttribute=\"trailing\" id=\"hRE-3C-SOb\"/>\n            </constraints>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <connections>\n                <outlet property=\"bottomView\" destination=\"ccK-Xc-2Ew\" id=\"Zjj-xD-dva\"/>\n                <outlet property=\"refreshBtn\" destination=\"vJq-Ry-Sb6\" id=\"1tj-cP-lmb\"/>\n                <outlet property=\"tipLab\" destination=\"quS-Gb-eyB\" id=\"a5r-6Z-ZKQ\"/>\n                <outlet property=\"topLine\" destination=\"pJq-PE-KhK\" id=\"Vvh-PY-GbG\"/>\n            </connections>\n        </view>\n    </objects>\n    <resources>\n        <image name=\"guessRefresh\" width=\"18\" height=\"18\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Recommend(推荐)/View/HCRecommendHeaderView.swift",
    "content": "//\n//  HCRecommendHeaderView.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/17.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport RxDataSources\nimport ReusableKit\nimport NSObject_Rx\n\nfileprivate struct Metric {\n    \n    static let defaultHeight : CGFloat = 90.0\n    static let minHeight : CGFloat = 50.0\n}\n\nclass HCRecommendHeaderView: UICollectionReusableView, NibLoadable {\n\n    @IBOutlet weak var topView: UIView!\n    @IBOutlet weak var bottomView: UIView!\n\n    @IBOutlet weak var leftTitle: UILabel!\n    @IBOutlet weak var leftSubView: UIView!\n    @IBOutlet weak var leftSubTitle: UILabel!\n    \n    @IBOutlet weak var rightSubView: UIView!\n    @IBOutlet weak var rightSubTitle: UILabel!\n    \n    @IBOutlet weak var tagView1: UIView!\n    @IBOutlet weak var tagView2: UIView!\n    @IBOutlet weak var tagView3: UIView!\n    @IBOutlet weak var tagView4: UIView!\n\n    @IBOutlet weak var tagLab1: UILabel!\n    @IBOutlet weak var tagLab2: UILabel!\n    @IBOutlet weak var tagLab3: UILabel!\n    @IBOutlet weak var tagLab4: UILabel!\n    \n    var categoryModel: Variable<HCCategoryModel?> = Variable(nil)\n    \n    override func awakeFromNib() {\n        super.awakeFromNib()\n        \n        initUI()\n        bindUI()\n    }\n}\n\nextension HCRecommendHeaderView {\n    \n    private func initUI() {\n        \n        tagView1.backgroundColor = .clear\n        tagView1.layer.cornerRadius = tagView1.height / 2\n        tagView1.layer.masksToBounds = true\n        tagView1.layer.borderColor = UIColor.darkGray.cgColor\n        tagView1.layer.borderWidth = 0.6\n        \n        tagView2.backgroundColor = .clear\n        tagView2.layer.cornerRadius = tagView2.height / 2\n        tagView2.layer.masksToBounds = true\n        tagView2.layer.borderColor = UIColor.darkGray.cgColor\n        tagView2.layer.borderWidth = 0.6\n        \n        tagView3.backgroundColor = .clear\n        tagView3.layer.cornerRadius = tagView3.height / 2\n        tagView3.layer.masksToBounds = true\n        tagView3.layer.borderColor = UIColor.darkGray.cgColor\n        tagView3.layer.borderWidth = 0.6\n        \n        tagView4.backgroundColor = .clear\n        tagView4.layer.cornerRadius = tagView4.height / 2\n        tagView4.layer.masksToBounds = true\n        tagView4.layer.borderColor = UIColor.darkGray.cgColor\n        tagView4.layer.borderWidth = 0.6\n    }\n    \n    private func bindUI() {\n        \n        categoryModel.asObservable().subscribe(onNext: { model in\n            \n            if let beel = model?.showInterestCard {\n                self.leftSubView.isHidden = !beel\n            }\n            \n            self.leftTitle.text = model?.title\n            \n            guard let keywords = model?.keywords, keywords.count > 0 else {\n                \n                self.height = Metric.minHeight\n                self.bottomView.isHidden = true\n                return\n            }\n            \n            self.height = Metric.defaultHeight\n            self.bottomView.isHidden = false\n            \n            self.tagLab1.text = model?.keywords![0].keywordName\n            self.tagLab2.text = model?.keywords![1].keywordName\n            self.tagLab3.text = model?.keywords![2].keywordName\n            self.tagLab4.text = model?.keywords![3].keywordName\n            \n        }).disposed(by: rx.disposeBag)\n    }\n    \n    static func defaultHeaderSize() -> CGSize {\n        \n        return CGSize(width: kScreenW, height: Metric.defaultHeight)\n    }\n    \n    static func minHeaderSize() -> CGSize {\n        \n        return CGSize(width: kScreenW, height: Metric.minHeight)\n    }\n}\n\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Recommend(推荐)/View/HCRecommendHeaderView.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"13196\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"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=\"13173\"/>\n        <capability name=\"Aspect ratio constraints\" minToolsVersion=\"5.1\"/>\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=\"HCRecommendHeaderView\" customModule=\"RxXMLY\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"90\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"NSg-9g-j1q\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"45\"/>\n                    <subviews>\n                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"最热有声读物\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"HG6-oD-Xng\">\n                            <rect key=\"frame\" x=\"16\" y=\"17.5\" width=\"104\" height=\"20.5\"/>\n                            <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                            <nil key=\"textColor\"/>\n                            <nil key=\"highlightedColor\"/>\n                        </label>\n                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"56b-V9-NkN\">\n                            <rect key=\"frame\" x=\"125\" y=\"10\" width=\"87.5\" height=\"35\"/>\n                            <subviews>\n                                <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"cgz_ic_accuracy\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"q7M-Va-3yl\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"8.5\" width=\"18\" height=\"18\"/>\n                                    <constraints>\n                                        <constraint firstAttribute=\"width\" secondItem=\"q7M-Va-3yl\" secondAttribute=\"height\" multiplier=\"1:1\" id=\"P3W-zJ-uNy\"/>\n                                    </constraints>\n                                </imageView>\n                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"点我猜更准\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Seq-39-gLu\">\n                                    <rect key=\"frame\" x=\"21\" y=\"10\" width=\"66.5\" height=\"16\"/>\n                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                    <color key=\"textColor\" red=\"1\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                    <nil key=\"highlightedColor\"/>\n                                </label>\n                            </subviews>\n                            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            <constraints>\n                                <constraint firstItem=\"Seq-39-gLu\" firstAttribute=\"centerY\" secondItem=\"56b-V9-NkN\" secondAttribute=\"centerY\" id=\"9Fd-Lp-2Ly\"/>\n                                <constraint firstAttribute=\"trailing\" secondItem=\"Seq-39-gLu\" secondAttribute=\"trailing\" id=\"LBK-y4-PXB\"/>\n                                <constraint firstItem=\"Seq-39-gLu\" firstAttribute=\"leading\" secondItem=\"q7M-Va-3yl\" secondAttribute=\"trailing\" constant=\"3\" id=\"Nb9-cY-HQX\"/>\n                                <constraint firstItem=\"q7M-Va-3yl\" firstAttribute=\"centerY\" secondItem=\"56b-V9-NkN\" secondAttribute=\"centerY\" id=\"Ogj-EL-e0l\"/>\n                                <constraint firstItem=\"q7M-Va-3yl\" firstAttribute=\"leading\" secondItem=\"56b-V9-NkN\" secondAttribute=\"leading\" id=\"qvr-M3-02c\"/>\n                            </constraints>\n                        </view>\n                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"tUU-Rp-ipD\">\n                            <rect key=\"frame\" x=\"317\" y=\"12.5\" width=\"42\" height=\"30\"/>\n                            <subviews>\n                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"更多\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"fOK-SM-7CP\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"7.5\" width=\"27\" height=\"16\"/>\n                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                    <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                    <nil key=\"highlightedColor\"/>\n                                </label>\n                                <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"live_ic_arrow_right\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kVx-sX-B1j\">\n                                    <rect key=\"frame\" x=\"30\" y=\"9\" width=\"12\" height=\"12\"/>\n                                    <constraints>\n                                        <constraint firstAttribute=\"width\" secondItem=\"kVx-sX-B1j\" secondAttribute=\"height\" id=\"Nwm-mM-j9x\"/>\n                                    </constraints>\n                                </imageView>\n                            </subviews>\n                            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            <constraints>\n                                <constraint firstItem=\"fOK-SM-7CP\" firstAttribute=\"leading\" secondItem=\"tUU-Rp-ipD\" secondAttribute=\"leading\" id=\"Brw-8P-iaM\"/>\n                                <constraint firstItem=\"kVx-sX-B1j\" firstAttribute=\"centerY\" secondItem=\"tUU-Rp-ipD\" secondAttribute=\"centerY\" id=\"IV8-Nw-EKT\"/>\n                                <constraint firstItem=\"fOK-SM-7CP\" firstAttribute=\"centerY\" secondItem=\"tUU-Rp-ipD\" secondAttribute=\"centerY\" id=\"SMd-vN-Biv\"/>\n                                <constraint firstAttribute=\"height\" constant=\"30\" id=\"brF-xl-VKf\"/>\n                                <constraint firstItem=\"kVx-sX-B1j\" firstAttribute=\"leading\" secondItem=\"fOK-SM-7CP\" secondAttribute=\"trailing\" constant=\"3\" id=\"d0G-t7-DAe\"/>\n                                <constraint firstAttribute=\"trailing\" secondItem=\"kVx-sX-B1j\" secondAttribute=\"trailing\" id=\"wdl-II-aN4\"/>\n                            </constraints>\n                        </view>\n                    </subviews>\n                    <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                    <constraints>\n                        <constraint firstItem=\"HG6-oD-Xng\" firstAttribute=\"leading\" secondItem=\"NSg-9g-j1q\" secondAttribute=\"leading\" constant=\"16\" id=\"6ap-rE-fbk\"/>\n                        <constraint firstAttribute=\"height\" constant=\"45\" id=\"7Zl-8u-6FY\"/>\n                        <constraint firstItem=\"56b-V9-NkN\" firstAttribute=\"centerY\" secondItem=\"HG6-oD-Xng\" secondAttribute=\"centerY\" id=\"DpE-Hf-Y5v\"/>\n                        <constraint firstAttribute=\"bottom\" secondItem=\"56b-V9-NkN\" secondAttribute=\"bottom\" id=\"K3Z-Cm-dQ6\"/>\n                        <constraint firstItem=\"HG6-oD-Xng\" firstAttribute=\"centerY\" secondItem=\"NSg-9g-j1q\" secondAttribute=\"centerY\" constant=\"5\" id=\"aFw-sA-7Pj\"/>\n                        <constraint firstAttribute=\"trailing\" secondItem=\"tUU-Rp-ipD\" secondAttribute=\"trailing\" constant=\"16\" id=\"gNN-vC-YjC\"/>\n                        <constraint firstItem=\"tUU-Rp-ipD\" firstAttribute=\"centerY\" secondItem=\"HG6-oD-Xng\" secondAttribute=\"centerY\" id=\"xgZ-RN-OIT\"/>\n                        <constraint firstItem=\"56b-V9-NkN\" firstAttribute=\"leading\" secondItem=\"HG6-oD-Xng\" secondAttribute=\"trailing\" constant=\"5\" id=\"xpS-QK-mjM\"/>\n                    </constraints>\n                </view>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"zWK-fa-SLI\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"45\" width=\"375\" height=\"45\"/>\n                    <subviews>\n                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"cVh-T7-6Er\">\n                            <rect key=\"frame\" x=\"16\" y=\"8.5\" width=\"69.5\" height=\"28\"/>\n                            <subviews>\n                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"女生最爱\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"u68-L9-jTc\">\n                                    <rect key=\"frame\" x=\"8\" y=\"6\" width=\"53.5\" height=\"16\"/>\n                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                    <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                    <nil key=\"highlightedColor\"/>\n                                </label>\n                            </subviews>\n                            <color key=\"backgroundColor\" red=\"0.99607843139999996\" green=\"0.92156862750000001\" blue=\"0.71372549019999998\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                            <constraints>\n                                <constraint firstItem=\"u68-L9-jTc\" firstAttribute=\"top\" secondItem=\"cVh-T7-6Er\" secondAttribute=\"top\" constant=\"6\" id=\"JQB-FL-LCP\"/>\n                                <constraint firstAttribute=\"bottom\" secondItem=\"u68-L9-jTc\" secondAttribute=\"bottom\" constant=\"6\" id=\"W8q-Hs-UU6\"/>\n                                <constraint firstAttribute=\"trailing\" secondItem=\"u68-L9-jTc\" secondAttribute=\"trailing\" constant=\"8\" id=\"YDy-4L-2Xz\"/>\n                                <constraint firstItem=\"u68-L9-jTc\" firstAttribute=\"leading\" secondItem=\"cVh-T7-6Er\" secondAttribute=\"leading\" constant=\"8\" id=\"ydl-wk-7uL\"/>\n                            </constraints>\n                        </view>\n                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"V5A-uT-cxK\">\n                            <rect key=\"frame\" x=\"95.5\" y=\"8.5\" width=\"43\" height=\"28\"/>\n                            <subviews>\n                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"文学\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"s5w-yC-UVa\">\n                                    <rect key=\"frame\" x=\"8\" y=\"6\" width=\"27\" height=\"16\"/>\n                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                    <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                    <nil key=\"highlightedColor\"/>\n                                </label>\n                            </subviews>\n                            <color key=\"backgroundColor\" red=\"0.99607843139999996\" green=\"0.92156862750000001\" blue=\"0.71372549019999998\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                            <constraints>\n                                <constraint firstAttribute=\"trailing\" secondItem=\"s5w-yC-UVa\" secondAttribute=\"trailing\" constant=\"8\" id=\"7Em-HL-kgB\"/>\n                                <constraint firstItem=\"s5w-yC-UVa\" firstAttribute=\"centerX\" secondItem=\"V5A-uT-cxK\" secondAttribute=\"centerX\" id=\"T35-Je-TDh\"/>\n                                <constraint firstItem=\"s5w-yC-UVa\" firstAttribute=\"top\" secondItem=\"V5A-uT-cxK\" secondAttribute=\"top\" constant=\"6\" id=\"YBu-pr-BLm\"/>\n                                <constraint firstItem=\"s5w-yC-UVa\" firstAttribute=\"leading\" secondItem=\"V5A-uT-cxK\" secondAttribute=\"leading\" constant=\"8\" id=\"Yam-8P-Nh6\"/>\n                                <constraint firstAttribute=\"bottom\" secondItem=\"s5w-yC-UVa\" secondAttribute=\"bottom\" constant=\"6\" id=\"uE3-d8-Rug\"/>\n                            </constraints>\n                        </view>\n                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"B2V-hn-Lce\">\n                            <rect key=\"frame\" x=\"148.5\" y=\"8.5\" width=\"43\" height=\"28\"/>\n                            <subviews>\n                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"武侠\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"MQT-66-MNN\">\n                                    <rect key=\"frame\" x=\"8\" y=\"6\" width=\"27\" height=\"16\"/>\n                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                    <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                    <nil key=\"highlightedColor\"/>\n                                </label>\n                            </subviews>\n                            <color key=\"backgroundColor\" red=\"0.99607843139999996\" green=\"0.92156862750000001\" blue=\"0.71372549019999998\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                            <constraints>\n                                <constraint firstAttribute=\"bottom\" secondItem=\"MQT-66-MNN\" secondAttribute=\"bottom\" constant=\"6\" id=\"JOh-nY-ZRn\"/>\n                                <constraint firstAttribute=\"trailing\" secondItem=\"MQT-66-MNN\" secondAttribute=\"trailing\" constant=\"8\" id=\"NRP-Rq-VIL\"/>\n                                <constraint firstItem=\"MQT-66-MNN\" firstAttribute=\"leading\" secondItem=\"B2V-hn-Lce\" secondAttribute=\"leading\" constant=\"8\" id=\"bYw-Pa-fOe\"/>\n                                <constraint firstItem=\"MQT-66-MNN\" firstAttribute=\"top\" secondItem=\"B2V-hn-Lce\" secondAttribute=\"top\" constant=\"6\" id=\"seo-EP-hvl\"/>\n                                <constraint firstItem=\"MQT-66-MNN\" firstAttribute=\"centerX\" secondItem=\"B2V-hn-Lce\" secondAttribute=\"centerX\" id=\"usd-NC-vFB\"/>\n                            </constraints>\n                        </view>\n                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"bHb-Fh-Gst\">\n                            <rect key=\"frame\" x=\"201.5\" y=\"8.5\" width=\"43\" height=\"28\"/>\n                            <subviews>\n                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"经管\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"nNa-AN-m6M\">\n                                    <rect key=\"frame\" x=\"8\" y=\"6\" width=\"27\" height=\"16\"/>\n                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                    <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                    <nil key=\"highlightedColor\"/>\n                                </label>\n                            </subviews>\n                            <color key=\"backgroundColor\" red=\"0.99607843139999996\" green=\"0.92156862750000001\" blue=\"0.71372549019999998\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                            <constraints>\n                                <constraint firstItem=\"nNa-AN-m6M\" firstAttribute=\"top\" secondItem=\"bHb-Fh-Gst\" secondAttribute=\"top\" constant=\"6\" id=\"DgC-aL-aye\"/>\n                                <constraint firstItem=\"nNa-AN-m6M\" firstAttribute=\"leading\" secondItem=\"bHb-Fh-Gst\" secondAttribute=\"leading\" constant=\"8\" id=\"G76-86-6SN\"/>\n                                <constraint firstAttribute=\"trailing\" secondItem=\"nNa-AN-m6M\" secondAttribute=\"trailing\" constant=\"8\" id=\"H8o-k7-9zT\"/>\n                                <constraint firstAttribute=\"bottom\" secondItem=\"nNa-AN-m6M\" secondAttribute=\"bottom\" constant=\"6\" id=\"OR2-6r-nNQ\"/>\n                                <constraint firstItem=\"nNa-AN-m6M\" firstAttribute=\"centerX\" secondItem=\"bHb-Fh-Gst\" secondAttribute=\"centerX\" id=\"kzc-Bs-U01\"/>\n                            </constraints>\n                        </view>\n                    </subviews>\n                    <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                    <constraints>\n                        <constraint firstItem=\"V5A-uT-cxK\" firstAttribute=\"leading\" secondItem=\"cVh-T7-6Er\" secondAttribute=\"trailing\" constant=\"10\" id=\"Mkt-yo-yco\"/>\n                        <constraint firstItem=\"bHb-Fh-Gst\" firstAttribute=\"leading\" secondItem=\"B2V-hn-Lce\" secondAttribute=\"trailing\" constant=\"10\" id=\"PMN-GV-7Y5\"/>\n                        <constraint firstItem=\"V5A-uT-cxK\" firstAttribute=\"centerY\" secondItem=\"cVh-T7-6Er\" secondAttribute=\"centerY\" id=\"Zup-Gp-5Kh\"/>\n                        <constraint firstItem=\"B2V-hn-Lce\" firstAttribute=\"leading\" secondItem=\"V5A-uT-cxK\" secondAttribute=\"trailing\" constant=\"10\" id=\"aa8-31-e93\"/>\n                        <constraint firstItem=\"B2V-hn-Lce\" firstAttribute=\"centerY\" secondItem=\"cVh-T7-6Er\" secondAttribute=\"centerY\" id=\"m8N-RI-fJh\"/>\n                        <constraint firstItem=\"cVh-T7-6Er\" firstAttribute=\"centerY\" secondItem=\"zWK-fa-SLI\" secondAttribute=\"centerY\" id=\"p9B-OC-dQf\"/>\n                        <constraint firstItem=\"bHb-Fh-Gst\" firstAttribute=\"centerY\" secondItem=\"cVh-T7-6Er\" secondAttribute=\"centerY\" id=\"sFc-Cq-HdK\"/>\n                        <constraint firstItem=\"cVh-T7-6Er\" firstAttribute=\"leading\" secondItem=\"zWK-fa-SLI\" secondAttribute=\"leading\" constant=\"16\" id=\"syu-De-Khz\"/>\n                    </constraints>\n                </view>\n            </subviews>\n            <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n            <constraints>\n                <constraint firstItem=\"NSg-9g-j1q\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" id=\"0LP-6k-TRt\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"zWK-fa-SLI\" secondAttribute=\"trailing\" id=\"7ng-aa-xR3\"/>\n                <constraint firstItem=\"NSg-9g-j1q\" firstAttribute=\"top\" secondItem=\"iN0-l3-epB\" secondAttribute=\"top\" id=\"D86-nm-TfH\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"zWK-fa-SLI\" secondAttribute=\"bottom\" id=\"Jy4-hG-Jr7\"/>\n                <constraint firstItem=\"zWK-fa-SLI\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" id=\"Lbc-5g-gAD\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"NSg-9g-j1q\" secondAttribute=\"trailing\" id=\"Tyv-2s-dkY\"/>\n                <constraint firstItem=\"zWK-fa-SLI\" firstAttribute=\"top\" secondItem=\"NSg-9g-j1q\" secondAttribute=\"bottom\" id=\"xH9-ap-Ucn\"/>\n            </constraints>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <connections>\n                <outlet property=\"bottomView\" destination=\"zWK-fa-SLI\" id=\"B5o-hw-Zl3\"/>\n                <outlet property=\"leftSubTitle\" destination=\"Seq-39-gLu\" id=\"ZjR-IW-hkU\"/>\n                <outlet property=\"leftSubView\" destination=\"56b-V9-NkN\" id=\"dFV-Al-Wdc\"/>\n                <outlet property=\"leftTitle\" destination=\"HG6-oD-Xng\" id=\"QhX-0O-1rH\"/>\n                <outlet property=\"rightSubTitle\" destination=\"fOK-SM-7CP\" id=\"piJ-QY-oZK\"/>\n                <outlet property=\"rightSubView\" destination=\"tUU-Rp-ipD\" id=\"7Bj-Ix-6M2\"/>\n                <outlet property=\"tagLab1\" destination=\"u68-L9-jTc\" id=\"vx3-CS-CM2\"/>\n                <outlet property=\"tagLab2\" destination=\"s5w-yC-UVa\" id=\"Ccn-fL-PMF\"/>\n                <outlet property=\"tagLab3\" destination=\"MQT-66-MNN\" id=\"xCX-8z-Dfy\"/>\n                <outlet property=\"tagLab4\" destination=\"nNa-AN-m6M\" id=\"6C3-Yy-eRf\"/>\n                <outlet property=\"tagView1\" destination=\"cVh-T7-6Er\" id=\"IPi-by-gyj\"/>\n                <outlet property=\"tagView2\" destination=\"V5A-uT-cxK\" id=\"Lyi-Zm-jpX\"/>\n                <outlet property=\"tagView3\" destination=\"B2V-hn-Lce\" id=\"ROT-Ja-tkx\"/>\n                <outlet property=\"tagView4\" destination=\"bHb-Fh-Gst\" id=\"n6m-8f-jDV\"/>\n                <outlet property=\"topView\" destination=\"NSg-9g-j1q\" id=\"bXo-yh-23N\"/>\n            </connections>\n        </view>\n    </objects>\n    <resources>\n        <image name=\"cgz_ic_accuracy\" width=\"18\" height=\"16\"/>\n        <image name=\"live_ic_arrow_right\" width=\"7\" height=\"12\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Recommend(推荐)/View/HCRecommendTopHeaderView.swift",
    "content": "//\n//  HCRecommendTopHeaderView.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/16.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport RxDataSources\nimport ReusableKit\n\n\nfileprivate struct Metric {\n    \n    static let scale : CGFloat = 380 / 375\n}\n\nfileprivate enum Reusable {\n    static let squareCell = ReusableCell<HCSquareCell>(nibName: \"HCSquareCell\")\n}\n\npublic enum HCRecommendTopHeaderViewType {\n    \n    case none\n    case recommend\n    case boutique\n}\n\nclass HCRecommendTopHeaderView: UICollectionReusableView {\n    \n    var scrollBar: HCScrollBarView!\n    var headerView: HCRecommendHeaderView!\n\n    @IBOutlet weak var topView: UIView!\n    @IBOutlet weak var centerView: UIView!\n    @IBOutlet weak var centerBottomView: UIView!\n    @IBOutlet weak var collectionView: UICollectionView!\n    @IBOutlet weak var bottomViewTopCons: NSLayoutConstraint!\n    @IBOutlet weak var bottomView: UIView!\n    @IBOutlet weak var bottomBtn: UIButton!\n    @IBOutlet weak var bottomHeaderView: UIView!\n    \n    var picArr = Variable<[String]>([])\n    var squareArr = Variable<[HCSquareModel]>([])\n    var categoryModel: Variable<HCCategoryModel?> = Variable(nil)\n    var modelArr: [HCSquareModel] = []\n    \n    override func awakeFromNib() {\n        super.awakeFromNib()\n        \n        initUI()\n        bindUI()\n    }\n}\n\nextension HCRecommendTopHeaderView {\n    \n    private func initUI() {\n        \n        // 滚动条\n        let scrollBar = HCScrollBarView()\n        self.scrollBar = scrollBar\n        topView.addSubview(scrollBar)\n        scrollBar.snp.makeConstraints { (make) in\n            make.edges.equalToSuperview()\n        }\n        \n        // 分类\n        collectionView.showsHorizontalScrollIndicator = false\n        collectionView.collectionViewLayout = HCSquareFlowLayout()\n        collectionView.register(Reusable.squareCell)\n        centerBottomView.backgroundColor = kThemeGainsboroColor\n \n        // 猜你喜欢\n        let headerView = HCRecommendHeaderView.loadFromNib()\n        self.headerView = headerView\n        bottomHeaderView.addSubview(headerView)\n        headerView.snp.makeConstraints { (make) in\n            make.edges.equalToSuperview()\n        }\n    }\n    \n    private func bindUI() {\n \n        // 分类\n        squareArr.asObservable().subscribe(onNext: { (squareArr) in\n            self.modelArr = squareArr\n            self.collectionView.reloadData()\n        }).disposed(by: rx.disposeBag)\n        \n        // 滚动条 立即前往\n        picArr.asObservable().subscribe(onNext: { (picArr) in\n            self.scrollBar.picArr.value = picArr\n            let pic = \"http://fdfs.xmcdn.com/group36/M01/FA/C4/wKgJUloqThKzE1oLAAJQ1xgg26s045.png\"\n            self.bottomBtn.kf.setBackgroundImage(with: URL(string: pic), for: .normal)\n        }).disposed(by: rx.disposeBag)\n\n        // 头部标题\n        categoryModel.asObservable().subscribe(onNext: { model in\n            self.headerView.categoryModel.value = model\n        }).disposed(by: rx.disposeBag)\n    }\n    \n    static func headerSize() -> CGSize {\n        \n        let height = kScreenW * Metric.scale\n\n        return CGSize(width: kScreenW, height: height)\n    }\n    \n    static func headerSize(type: HCRecommendTopHeaderViewType) -> CGSize {\n        \n        if type == .boutique {\n            \n            let height = kScreenW * (380 - 83.5) / 375\n            \n            return CGSize(width: kScreenW, height: height)\n        }\n        \n        let height = kScreenW * Metric.scale\n        \n        return CGSize(width: kScreenW, height: height)\n    }\n}\n\n// MARK:- 代理\nextension HCRecommendTopHeaderView: UICollectionViewDataSource, UICollectionViewDelegate {\n    \n    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {\n        \n        return self.modelArr.count\n    }\n    \n    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {\n        \n        let cell = collectionView.dequeue(Reusable.squareCell, for: indexPath)\n        let model = self.modelArr[indexPath.row]\n        cell.titleLab.text = model.title\n        cell.iconImg.kf.setImage(with: URL(string: model.coverPath))\n        \n        return cell\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Recommend(推荐)/View/HCRecommendTopHeaderView.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"13196\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"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=\"13173\"/>\n        <capability name=\"Aspect ratio constraints\" minToolsVersion=\"5.1\"/>\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=\"HCRecommendTopHeaderView\" customModule=\"RxXMLY\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"380\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"BDN-XJ-UWL\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"156.5\"/>\n                    <constraints>\n                        <constraint firstAttribute=\"width\" secondItem=\"BDN-XJ-UWL\" secondAttribute=\"height\" multiplier=\"12:5\" id=\"Cw1-Yu-BpR\"/>\n                    </constraints>\n                </view>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"2ZD-zk-crd\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"156.5\" width=\"375\" height=\"95\"/>\n                    <subviews>\n                        <collectionView clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" dataMode=\"none\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"NnF-dS-yaz\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"0.5\" width=\"375\" height=\"84.5\"/>\n                            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            <collectionViewFlowLayout key=\"collectionViewLayout\" minimumLineSpacing=\"10\" minimumInteritemSpacing=\"10\" id=\"2vA-bQ-Es2\">\n                                <size key=\"itemSize\" width=\"50\" height=\"50\"/>\n                                <size key=\"headerReferenceSize\" width=\"0.0\" height=\"0.0\"/>\n                                <size key=\"footerReferenceSize\" width=\"0.0\" height=\"0.0\"/>\n                                <inset key=\"sectionInset\" minX=\"0.0\" minY=\"0.0\" maxX=\"0.0\" maxY=\"0.0\"/>\n                            </collectionViewFlowLayout>\n                            <connections>\n                                <outlet property=\"dataSource\" destination=\"iN0-l3-epB\" id=\"fgF-Zu-FfB\"/>\n                                <outlet property=\"delegate\" destination=\"iN0-l3-epB\" id=\"0Q9-t6-MIR\"/>\n                            </connections>\n                        </collectionView>\n                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"bqP-7L-vCK\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"85\" width=\"375\" height=\"10\"/>\n                            <color key=\"backgroundColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            <constraints>\n                                <constraint firstAttribute=\"height\" constant=\"10\" id=\"r7a-f6-200\"/>\n                            </constraints>\n                        </view>\n                    </subviews>\n                    <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                    <constraints>\n                        <constraint firstAttribute=\"trailing\" secondItem=\"NnF-dS-yaz\" secondAttribute=\"trailing\" id=\"AQG-FD-ZQ0\"/>\n                        <constraint firstItem=\"bqP-7L-vCK\" firstAttribute=\"leading\" secondItem=\"2ZD-zk-crd\" secondAttribute=\"leading\" id=\"ATS-Hr-r8J\"/>\n                        <constraint firstAttribute=\"trailing\" secondItem=\"bqP-7L-vCK\" secondAttribute=\"trailing\" id=\"Cp6-WU-b8Y\"/>\n                        <constraint firstAttribute=\"bottom\" secondItem=\"bqP-7L-vCK\" secondAttribute=\"bottom\" id=\"FJA-Kp-FcQ\"/>\n                        <constraint firstAttribute=\"height\" constant=\"95\" id=\"N0q-H4-6ye\"/>\n                        <constraint firstItem=\"bqP-7L-vCK\" firstAttribute=\"top\" secondItem=\"NnF-dS-yaz\" secondAttribute=\"bottom\" id=\"OQI-fh-Uv8\"/>\n                        <constraint firstAttribute=\"bottom\" secondItem=\"NnF-dS-yaz\" secondAttribute=\"bottom\" constant=\"10\" id=\"VYg-VF-ehF\"/>\n                        <constraint firstItem=\"NnF-dS-yaz\" firstAttribute=\"leading\" secondItem=\"2ZD-zk-crd\" secondAttribute=\"leading\" id=\"i9w-hA-Mhm\"/>\n                        <constraint firstItem=\"NnF-dS-yaz\" firstAttribute=\"top\" secondItem=\"2ZD-zk-crd\" secondAttribute=\"top\" id=\"pBV-KG-6Ve\"/>\n                    </constraints>\n                </view>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"XaS-8j-72K\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"251.5\" width=\"375\" height=\"83.5\"/>\n                    <subviews>\n                        <button opaque=\"NO\" contentMode=\"scaleAspectFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" adjustsImageWhenDisabled=\"NO\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"4Er-EQ-O1d\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"10\" width=\"375\" height=\"73.5\"/>\n                        </button>\n                    </subviews>\n                    <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                    <constraints>\n                        <constraint firstAttribute=\"bottom\" secondItem=\"4Er-EQ-O1d\" secondAttribute=\"bottom\" id=\"3Yg-39-WpC\"/>\n                        <constraint firstItem=\"4Er-EQ-O1d\" firstAttribute=\"top\" secondItem=\"XaS-8j-72K\" secondAttribute=\"top\" constant=\"10\" id=\"CMr-G9-Wh1\"/>\n                        <constraint firstItem=\"4Er-EQ-O1d\" firstAttribute=\"leading\" secondItem=\"XaS-8j-72K\" secondAttribute=\"leading\" id=\"KTC-fw-E50\"/>\n                        <constraint firstAttribute=\"trailing\" secondItem=\"4Er-EQ-O1d\" secondAttribute=\"trailing\" id=\"gL6-NI-Agr\"/>\n                    </constraints>\n                </view>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"qdc-J8-Ddq\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"335\" width=\"375\" height=\"45\"/>\n                    <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                    <constraints>\n                        <constraint firstAttribute=\"height\" constant=\"45\" id=\"KQL-zo-8AZ\"/>\n                    </constraints>\n                </view>\n            </subviews>\n            <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n            <constraints>\n                <constraint firstAttribute=\"bottom\" secondItem=\"qdc-J8-Ddq\" secondAttribute=\"bottom\" id=\"1Hq-0E-cUU\"/>\n                <constraint firstItem=\"2ZD-zk-crd\" firstAttribute=\"top\" secondItem=\"BDN-XJ-UWL\" secondAttribute=\"bottom\" id=\"78Y-2K-UPF\"/>\n                <constraint firstItem=\"XaS-8j-72K\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" id=\"9Cj-Xb-YnH\"/>\n                <constraint firstItem=\"qdc-J8-Ddq\" firstAttribute=\"top\" secondItem=\"XaS-8j-72K\" secondAttribute=\"bottom\" id=\"AY6-gK-0pP\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"BDN-XJ-UWL\" secondAttribute=\"trailing\" id=\"EGb-z4-TOn\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"XaS-8j-72K\" secondAttribute=\"trailing\" id=\"Jgu-Vz-Ryj\"/>\n                <constraint firstItem=\"qdc-J8-Ddq\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" id=\"QHe-3M-TbC\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"qdc-J8-Ddq\" secondAttribute=\"trailing\" id=\"hVG-SF-g3i\"/>\n                <constraint firstItem=\"BDN-XJ-UWL\" firstAttribute=\"top\" secondItem=\"iN0-l3-epB\" secondAttribute=\"top\" id=\"n8G-rN-FfS\"/>\n                <constraint firstItem=\"2ZD-zk-crd\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" id=\"qpz-rr-cOK\"/>\n                <constraint firstItem=\"BDN-XJ-UWL\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" id=\"uz9-2x-xHH\"/>\n                <constraint firstItem=\"XaS-8j-72K\" firstAttribute=\"top\" secondItem=\"2ZD-zk-crd\" secondAttribute=\"bottom\" id=\"weF-O0-HMd\"/>\n                <constraint firstItem=\"2ZD-zk-crd\" firstAttribute=\"trailing\" secondItem=\"iN0-l3-epB\" secondAttribute=\"trailing\" id=\"xc6-R6-QNS\"/>\n            </constraints>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <connections>\n                <outlet property=\"bottomBtn\" destination=\"4Er-EQ-O1d\" id=\"w2o-sI-kyI\"/>\n                <outlet property=\"bottomHeaderView\" destination=\"qdc-J8-Ddq\" id=\"Vdh-Im-Xz6\"/>\n                <outlet property=\"bottomView\" destination=\"XaS-8j-72K\" id=\"oWL-ef-BI5\"/>\n                <outlet property=\"bottomViewTopCons\" destination=\"CMr-G9-Wh1\" id=\"8X8-Mp-X9J\"/>\n                <outlet property=\"centerBottomView\" destination=\"bqP-7L-vCK\" id=\"jvd-2J-e2P\"/>\n                <outlet property=\"centerView\" destination=\"2ZD-zk-crd\" id=\"ZpD-dG-VlF\"/>\n                <outlet property=\"collectionView\" destination=\"NnF-dS-yaz\" id=\"Trr-wS-5hY\"/>\n                <outlet property=\"topView\" destination=\"BDN-XJ-UWL\" id=\"ezN-QM-25e\"/>\n            </connections>\n        </view>\n    </objects>\n</document>\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Recommend(推荐)/ViewModel/HCRecommendViewModel.swift",
    "content": "//\n//  HCRecommendViewModel.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/16.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport Foundation\nimport RxSwift\nimport RxCocoa\nimport NSObject_Rx\nimport RxAlamofire\nimport SwiftyJSON\nimport RxDataSources\nimport ObjectMapper\n\nclass HCRecommendViewModel: NSObject {\n\n    private let vmDatas = Variable<[([HCFocusModel]?, [HCSquareModel]?, HCCategoryModel?, [HCRecommendItemModel]?, [HCRecommendItemModel])]>([])\n    \n    private var page: Int = 1\n}\n\n\nextension HCRecommendViewModel: HCViewModelType {\n    \n    typealias Input = HCRecommendInput\n    typealias Output = HCRecommendOutput\n    \n    struct HCRecommendInput {\n        \n    }\n    \n    struct HCRecommendOutput: OutputRefreshProtocol {\n        \n        var refreshStatus: Variable<HCRefreshStatus>\n        \n        let sections: Driver<[HCRecommendSection]>\n        let requestCommand = PublishSubject<Bool>()\n        \n        init(sections: Driver<[HCRecommendSection]>) {\n            self.sections = sections\n            refreshStatus = Variable<HCRefreshStatus>(.none)\n        }\n    }\n    \n    func transform(input: HCRecommendViewModel.HCRecommendInput) -> HCRecommendViewModel.HCRecommendOutput {\n     \n        let temp_sections = vmDatas.asObservable().map({ (sections) -> [HCRecommendSection] in\n            return sections.map({ (focusList, squareList, category, nextCategoryList, models) -> HCRecommendSection in\n                return HCRecommendSection(focusList: focusList, squareList: squareList, category: category, nextCategoryList: nextCategoryList, items: models)\n            })\n        }).asDriver(onErrorJustReturn: [])\n        \n        let output = HCRecommendOutput(sections: temp_sections)\n        \n        output.requestCommand.subscribe(onNext: { [weak self] (isPull) in\n            guard let `self` = self else { return }\n            \n            var url: String = kUrlGetRecommendList\n            \n            if isPull {\n                url = kUrlGetRecommendList\n            } else {\n                let params = \"&pageId=\\(self.page)&pageSize=20&scale=2&uid=0&version=6.3.45&xt=1513670067079\"\n                url = kUrlGetRecommendPullList + params\n            }\n            \n            let request = json(.get, url)\n            \n            // 监听网络\n            request.asObservable().subscribe({ (event) in\n                switch event {\n                case let .error(error):\n                    HCLog(error)\n                case .next, .completed:\n                    self.page = self.page + 1\n                    break\n                }\n                output.refreshStatus.value = .endHeaderRefresh\n                output.refreshStatus.value = .endFooterRefresh\n\n            }).disposed(by: self.rx.disposeBag)\n            \n            // 获取数据\n            request.hc_json({\n                \n                return JSON($0)\n            }).mapObject(HCRecommendModel.self).subscribe(onNext: { (datas) in\n                \n                guard let focusList = datas.focusList else { return }\n                guard let squareList = datas.squareList else { return }\n                guard let categoryList = datas.categoryList else { return }\n                \n                var temp_category: [HCCategoryModel] = []\n                var temp_categorySubList: [[HCRecommendItemModel]] = []\n\n                // 组装数据\n                for (index, category) in categoryList.enumerated() {\n                    \n                    guard index >= 2 else { // 前两个分别是\n                        continue\n                    }\n                    \n                    guard let categorySubList = category.list, categorySubList.count > 0 else {\n                        continue\n                    }\n                    \n                    // 猜你喜欢 精品 三列显示\n                    temp_category.append(category)\n                    temp_categorySubList.append(categorySubList)\n                }\n                \n                let nextCategoryList = datas.nextCategoryList\n\n                if (nextCategoryList != nil && datas.maxPageId > 0) {\n//                    let category = HCCategoryModel(map: Map(mappingType: MappingType.fromJSON, JSON: [\"title\": \"为你推荐\"]))\n//                    temp_category.append(category!)\n//                    temp_categorySubList.append(nextCategoryList!)\n                }\n\n                var sectionArr: [([HCFocusModel]?, [HCSquareModel]?, HCCategoryModel?,  [HCRecommendItemModel]?, [HCRecommendItemModel])] = []\n\n                for (index, _) in temp_category.enumerated() {\n                    \n                    sectionArr.append((focusList, squareList, temp_category[index], nextCategoryList, temp_categorySubList[index]))\n                }\n                \n                // 更新数据\n                self.vmDatas.value = sectionArr\n                \n            }).disposed(by: self.rx.disposeBag)\n        }).disposed(by: rx.disposeBag)\n        \n        return output\n    }\n}\n\nstruct HCRecommendSection {\n    \n    var focusList: [HCFocusModel]?\n    var squareList: [HCSquareModel]?\n    var category: HCCategoryModel?\n    \n    var nextCategoryList: [HCRecommendItemModel]?\n\n    var items: [Item]\n}\n\nextension HCRecommendSection: SectionModelType {\n    typealias Item = HCRecommendItemModel\n \n    init(original: HCRecommendSection, items: [HCRecommendItemModel]) {\n        self = original\n        self.items = items\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Search(搜索)/HCSearchController.swift",
    "content": "//\n//  HCSearchController.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/15.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\n// MARK:- 常量\nfileprivate struct Metric {\n    \n    static let searchBarLeft: CGFloat = 12.0\n    static let searchBarRight: CGFloat = 12.0\n}\n\nclass HCSearchController: HCBaseViewController {\n    \n    private var titleView: UIView?\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        initTitleView()\n    }\n    \n    override func viewWillLayoutSubviews() {\n        super.viewWillLayoutSubviews()\n        \n        titleView?.snp.makeConstraints { (make) in\n            make.centerY.equalToSuperview().offset(-0.5) // 修正偏差\n            make.left.equalToSuperview().offset(Metric.searchBarLeft)\n            make.right.equalToSuperview().offset(-Metric.searchBarRight)\n        }\n    }\n}\n\n// MARK:- 初始化协议\nextension HCSearchController: HCNavTitleable {\n    \n    // MARK:- 标题组件\n    func initTitleView() {\n        \n        let searchBar = HCSearchNavigationBar()\n        searchBar.itemClicked = { [weak self] (model) in\n            \n            guard let `self` = self else { return }\n            \n            if case let HCNavigationBarItemModel.HCNavigationBarItemType.searchBar(index, desc) = model.type {\n                HCLog(model.description + \" 控件: \\(desc)\")\n                if index == 3 {\n                    self.dismiss(animated: false, completion: nil)\n                }\n            }\n        }\n        titleView = self.titleView(titleView: searchBar)\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Search(搜索)/HCSearchResultController.swift",
    "content": "//\n//  HCSearchResultController.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/15.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nclass HCSearchResultController: HCBaseViewController {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/Controller/Search(搜索)/View/HCSearchNavigationBar.swift",
    "content": "//\n//  HCSearchNavigationBar.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/16.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\n// MARK:- 常量\nfileprivate struct Metric {\n        \n    static let homeBarWidth: CGFloat = kScreenW\n    static let homeBarHeight: CGFloat = 44.0\n}\n\nclass HCSearchNavigationBar: UIView {\n    \n    typealias AddBlock = (_ model: HCNavigationBarItemModel)->Void;\n    var itemClicked: AddBlock? = { (_) in\n        return\n    }\n    \n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        \n        initSearchNavigationBar()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    override func layoutSubviews() {\n        super.layoutSubviews()\n        \n        // 此处必须指定一个大小\n        self.snp.makeConstraints { (make) in\n            make.width.equalTo(Metric.homeBarWidth)\n            make.height.equalTo(Metric.homeBarHeight)\n        }\n    }\n}\n\nextension HCSearchNavigationBar: HCSearchControllerable {\n    \n    // MARK:- 初始化 首页 导航栏组件\n    func initSearchNavigationBar() {\n        \n        // 搜索栏\n        let searchBar = self.searchBar(model: HCNavigationBarItemMetric.homeSearchBar) { (model) in\n            \n            self.itemClicked!(model)\n        }\n        \n        searchBar.snp.makeConstraints { (make) in\n            make.centerY.equalToSuperview()\n            make.left.equalToSuperview()\n            make.right.equalToSuperview()\n        }\n    }\n}\n\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/HCHomeViewController.swift",
    "content": "//\n//  HCHomeViewController.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/14.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport SnapKit\nimport Then\nimport TYPagerController\n\n// MARK:- 常量\nfileprivate struct Metric {\n    \n    static let searchBarLeft: CGFloat = 12.0\n    static let searchBarRight: CGFloat = 12.0\n    \n    static let pagerBarFontSize = UIFont.systemFont(ofSize: 15.0)\n    static let pagerBarHeight: CGFloat = 38.0\n}\n\nclass HCHomeViewController: HCBaseViewController {\n    \n    private var titleView: UIView?\n\n    private let titles: [String] = [\"分类\", \"推荐\", \"精品\", \"直播\", \"广播\"]\n    private let pageVC = TYTabPagerController().then {\n        $0.pagerController.scrollView?.backgroundColor = kThemeGainsboroColor\n        $0.tabBar.layout.cellWidth = kScreenW * 0.2\n        $0.tabBar.layout.progressColor = kThemeTomatoColor\n        $0.tabBar.layout.selectedTextColor = kThemeTomatoColor\n        $0.tabBar.backgroundColor = kThemeGainsboroColor\n        $0.tabBar.layout.cellSpacing = 0\n        $0.tabBar.layout.cellEdging = 0\n        $0.tabBar.layout.normalTextFont = Metric.pagerBarFontSize\n        $0.tabBar.layout.selectedTextFont = Metric.pagerBarFontSize\n        $0.tabBarHeight = Metric.pagerBarHeight\n    }\n    private var vcs: [UIViewController] = []\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        initTitleView()\n        \n        initPageController()\n    }\n    \n    override func viewWillLayoutSubviews() {\n        super.viewWillLayoutSubviews()\n        \n        titleView?.snp.makeConstraints { (make) in\n            make.centerY.equalToSuperview().offset(-0.5) // 修正偏差\n            make.left.equalToSuperview().offset(Metric.searchBarLeft)\n            make.right.equalToSuperview().offset(-Metric.searchBarRight)\n        }\n    }\n}\n\n// MARK:- 初始化协议\nextension HCHomeViewController: HCNavTitleable {\n    \n    static func pagerBarHeight() -> CGFloat {\n        \n        return Metric.pagerBarHeight\n    }\n\n    // MARK:- 标题组件\n    private func initTitleView() {\n        \n        let homeNavigationBar = HCHomeNavigationBar()\n        homeNavigationBar.itemClicked = { [weak self] (model) in\n            \n            guard let `self` = self else { return }\n\n            let type = model.type\n            switch type {\n            case .homeSearchBar:\n                self.jump2SearchResult()\n                break\n                \n            case .download, .message, .history:\n                \n                self.jump2Login()\n                break\n            default: break\n            }\n        }\n        titleView = self.titleView(titleView: homeNavigationBar)\n    }\n    \n    // MARK:- 分页控制器\n    private func initPageController() {\n        \n        addChildViewController(pageVC)\n        view.addSubview(pageVC.view)\n        pageVC.delegate = self\n        pageVC.dataSource = self\n        pageVC.view.snp.makeConstraints { (make) in\n            make.top.left.right.bottom.equalToSuperview()\n        }\n        pageVC.reloadData()\n        \n        // 设置起始页\n        pageVC.pagerController.scrollToController(at: 1, animate: false)\n    }\n\n}\n\n// MARK:- 分页控制器协议\nextension HCHomeViewController: TYTabPagerControllerDelegate, TYTabPagerControllerDataSource {\n    \n    func numberOfControllersInTabPagerController() -> Int {\n        return titles.count\n    }\n    \n    func tabPagerController(_ tabPagerController: TYTabPagerController, controllerFor index: Int, prefetching: Bool) -> UIViewController {\n \n        if index == 1 {\n            let VC = HCRecommendViewController()\n            VC.view.backgroundColor = kThemeSnowColor\n            return VC\n        } else if index == 2 {\n            let VC = HCBoutiqueViewController()\n            VC.view.backgroundColor = kThemeSnowColor\n            return VC\n        }\n        let VC = UIViewController()\n        VC.view.backgroundColor = kThemeWhiteColor\n        return VC\n    }\n    \n    func tabPagerController(_ tabPagerController: TYTabPagerController, titleFor index: Int) -> String {\n        return titles[index]\n    }\n}\n\n// MARK:- 控制器跳转\nextension HCHomeViewController {\n    \n    // MARK:- 搜索结果\n    func jump2SearchResult() {\n        \n        let VC = HCBaseNavigationController(rootViewController: HCSearchController())\n        self.present(VC, animated: false, completion: nil)\n    }\n    \n    // MARK:- 下载\n    func jump2Login() {\n        \n        let VC = HCBaseNavigationController(rootViewController: HCLoginViewController())\n        self.present(VC, animated: true, completion: nil)\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Home/View/HCHomeNavigationBar.swift",
    "content": "//\n//  HCHomeNavigationBar.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/16.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\n// MARK:- 常量\nfileprivate struct Metric {\n        \n    static let homeBarWidth: CGFloat = kScreenW\n    static let homeBarHeight: CGFloat = 44.0\n}\n\nclass HCHomeNavigationBar: UIView {\n    \n    typealias AddBlock = (_ model: HCNavigationBarItemModel)->Void;\n    var itemClicked: AddBlock? = { (_) in\n        return\n    }\n    \n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        \n        initHomeNavigationBar()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    override func layoutSubviews() {\n        super.layoutSubviews()\n        \n        // 此处必须指定一个大小\n        self.snp.makeConstraints { (make) in\n            make.width.equalTo(Metric.homeBarWidth)\n            make.height.equalTo(Metric.homeBarHeight)\n        }\n    }\n}\n\nextension HCHomeNavigationBar: HCHomeSearchBarable, HCNavUniversalable {\n    \n    // MARK:- 初始化 首页 导航栏组件\n    func initHomeNavigationBar() {\n        \n        // 消息按钮\n        let message = self.universal(model: HCNavigationBarItemMetric.message) { (model) in\n            self.itemClicked!(model)\n            HCLog(model.description)\n        }\n        \n        // 历史记录\n        let history = self.universal(model: HCNavigationBarItemMetric.history) { (model) in\n            self.itemClicked!(model)\n            HCLog(model.description)\n        }\n        \n        // 下载\n        let download = self.universal(model: HCNavigationBarItemMetric.download) { (model) in\n            self.itemClicked!(model)\n            HCLog(model.description)\n        }\n        \n        // 搜索栏\n        let searchBar = self.searchBar(model: HCNavigationBarItemMetric.homeSearchBar) { (model) in\n            self.itemClicked!(model)\n            HCLog(model.description)\n        }\n        \n        // 布局\n        message.snp.makeConstraints { (make) in\n            make.centerY.equalToSuperview()\n            make.left.equalToSuperview()\n        }\n        \n        searchBar.snp.makeConstraints { (make) in\n            make.centerY.equalToSuperview()\n            make.left.equalTo(message.snp.right).offset(MetricGlobal.margin)\n        }\n        \n        history.snp.makeConstraints { (make) in\n            make.centerY.equalToSuperview()\n            make.left.equalTo(searchBar.snp.right).offset(MetricGlobal.margin)\n        }\n        \n        download.snp.makeConstraints { (make) in\n            make.centerY.equalToSuperview()\n            make.left.equalTo(history.snp.right).offset(MetricGlobal.margin)\n            make.right.equalToSuperview()\n        }\n    }\n}\n\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Mine/Controller/Login/Controller/HCAccountLoginViewController.swift",
    "content": "//\n//  HCAccountLoginViewController.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/27.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport Then\nimport RxSwift\nimport RxCocoa\nimport NSObject_Rx\n\n// MARK:- 常量\nfileprivate struct Metric {\n    \n    static let fieldHeight: CGFloat = 45.0\n}\n\nclass HCAccountLoginViewController: HCBaseViewController {\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        view.backgroundColor = kThemeWhiteColor\n        view.rx.tapGesture().do(onNext: { [weak self] _ in\n            self?.view.endEditing(true)\n        }).subscribe().disposed(by: rx.disposeBag)\n        \n        initEnableMudule()\n    }\n}\n\n// MARK:- 初始化\nextension HCAccountLoginViewController: HCAccountLoginable {\n    \n    // MARK:- 初始化 登录 输入框\n    private func initEnableMudule() {\n        \n        // 创建 容器组件\n        let scrollView = UIScrollView().then {\n            $0.showsHorizontalScrollIndicator = false\n            $0.showsVerticalScrollIndicator = false\n        }\n        \n        // 创建 协议组件\n        let accountField = initAccountField { }\n        let passwordField = initPasswordField { }\n        let (loginBtnView, loginBtn) = initLoginBtnView { event in HCLog(event.title) }\n        let otherLoginView = initOtherLoginView { event in HCLog(event.title) }\n        \n        // 创建 视图模型\n        let accountLoginView = HCAccountLoginViewModel(input: (accountField, passwordField, loginBtn), service: HCAccountLoginService.shareInstance)\n        \n        accountLoginView.accountUseable.drive(accountField.rx.validationResult).disposed(by: rx.disposeBag)\n        accountLoginView.passwordUseable.drive(passwordField.rx.validationResult).disposed(by: rx.disposeBag)\n        accountLoginView.loginBtnEnable.drive(onNext: { (beel) in\n            loginBtn.isEnabled = beel\n        }).disposed(by: rx.disposeBag)\n        accountLoginView.loginResult.drive(onNext: { (result) in\n            switch result {\n            case .ok:\n                    HCLog(\"\\(result.description)\")\n                break\n            case .empty:\n                break\n            case .failed:\n                HCLog(\"\\(result.description)\")\n                break\n            }\n        }).disposed(by: rx.disposeBag)\n        \n        // 添加\n        view.addSubview(scrollView)\n        scrollView.addSubview(accountField)\n        scrollView.addSubview(passwordField)\n        scrollView.addSubview(loginBtnView)\n        scrollView.addSubview(otherLoginView)\n        \n        // 布局\n        scrollView.snp.makeConstraints { (make) in\n            make.left.top.bottom.equalToSuperview()\n            make.width.equalTo(kScreenW)\n        }\n        \n        accountField.snp.makeConstraints { (make) in\n            if kScreenW <= 320 {\n                make.left.equalToSuperview().offset(MetricGlobal.margin * 2)\n            } else {\n                make.left.equalToSuperview().offset(MetricGlobal.margin * 3)\n            }\n            make.centerX.equalToSuperview()\n            make.top.equalToSuperview().offset(MetricGlobal.margin * 2)\n            make.height.equalTo(Metric.fieldHeight)\n        }\n        \n        passwordField.snp.makeConstraints { (make) in\n            make.left.equalTo(accountField.snp.left)\n            make.right.equalTo(accountField.snp.right)\n            make.top.equalTo(accountField.snp.bottom).offset(MetricGlobal.margin * 2)\n            make.height.equalTo(Metric.fieldHeight)\n        }\n        \n        loginBtnView.snp.makeConstraints { (make) in\n            make.left.equalTo(accountField.snp.left)\n            make.right.equalTo(accountField.snp.right)\n            make.top.equalTo(passwordField.snp.bottom).offset(MetricGlobal.margin * 2)\n        }\n        \n        otherLoginView.snp.makeConstraints { (make) in\n            \n            if kScreenW <= 320 {\n                make.left.equalTo(accountField.snp.left).offset(-MetricGlobal.margin * 1)\n            } else {\n                make.left.equalTo(accountField.snp.left).offset(-MetricGlobal.margin * 2)\n            }\n            make.centerX.equalToSuperview()\n            make.top.equalTo(loginBtnView.snp.bottom)\n            make.bottom.equalToSuperview()\n        }\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Mine/Controller/Login/Controller/HCThridLoginViewController.swift",
    "content": "//\n//  HCThridLoginViewController.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/27.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nclass HCThridLoginViewController: HCBaseViewController {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Mine/Controller/Login/HCLoginViewController.swift",
    "content": "//\n//  HCLoginViewController.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/26.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport Then\nimport TYPagerController\n\n// MARK:- 常量\nfileprivate struct Metric {\n        \n    static let leftTitle = \"账号密码登录\"\n    static let rightTitle = \"快捷免密登录\"\n\n    static let pagerBarFontSize = UIFont.systemFont(ofSize: 15.0)\n    static let pagerBarHeight: CGFloat = 49.0\n}\n\nclass HCLoginViewController: HCBaseViewController {\n    \n    private let pageVC = TYTabPagerController().then {\n        $0.pagerController.scrollView?.backgroundColor = kThemeGainsboroColor\n\n        // 设置滚动条 属性\n        $0.tabBarHeight = Metric.pagerBarHeight\n        $0.tabBar.backgroundColor = kThemeWhiteColor\n        $0.tabBar.layout.cellWidth = kScreenW * 0.5\n        $0.tabBar.layout.progressWidth = Metric.leftTitle.getSize(font: Metric.pagerBarFontSize).width + MetricGlobal.margin * 2\n        $0.tabBar.layout.progressColor = kThemeTomatoColor\n        $0.tabBar.layout.selectedTextColor = kThemeTomatoColor\n        $0.tabBar.layout.progressHeight = 3.0\n        $0.tabBar.layout.cellSpacing = 0\n        $0.tabBar.layout.cellEdging = 0\n        $0.tabBar.layout.normalTextFont = Metric.pagerBarFontSize\n        $0.tabBar.layout.selectedTextFont = Metric.pagerBarFontSize\n    }\n    \n    private let titles: [String] = [Metric.leftTitle, Metric.rightTitle]\n    private var vcs: [UIViewController] = []\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        self.title = \"登录\"\n        // 显示系统导航栏底部细线\n        self.navigationController?.navigationBar.setBackgroundImage(nil, for: .default)\n        self.navigationController?.navigationBar.shadowImage = nil\n        \n        initEnableMudule()\n        \n        initPageController()\n    }\n}\n\n// MARK:- 初始化协议\nextension HCLoginViewController: HCNavBackable, HCNavUniversalable {\n    \n    // MARK:- 协议组件\n    private func initEnableMudule() {\n        \n        // 登录页面 返回、注册\n        let models = [HCNavigationBarItemMetric.back,\n                      HCNavigationBarItemMetric.loginRegister]\n        self.universals(modelArr: models) { [weak self] (model) in\n            guard let `self` = self else { return }\n            HCLog(model.description)\n            let type = model.type\n            switch type {\n            case .back:\n                self.navigationController?.dismiss(animated: true, completion: nil)\n                break\n            default: break\n            }\n        }\n        \n        // 设置 样式\n        self.navigationItem.rightBarButtonItem?.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: kThemeTomatoColor], for: .normal)\n    }\n    \n    // MARK:- 分页控制器\n    private func initPageController() {\n        \n        // 给 PageTabBar 添加一个底部细线\n        let bottomLine = UIView().then {\n            $0.backgroundColor = kThemeGainsboroColor\n        }\n        pageVC.tabBar.addSubview(bottomLine)\n\n        bottomLine.snp.makeConstraints { (make) in\n            make.bottom.left.right.equalToSuperview()\n            make.height.equalTo(1.0)\n        }\n\n        addChildViewController(pageVC)\n        view.addSubview(pageVC.view)\n        pageVC.didMove(toParentViewController: self)\n\n        pageVC.view.snp.makeConstraints { (make) in\n            make.top.equalToSuperview().offset(kNavibarH)\n            make.left.right.bottom.equalToSuperview()\n        }\n        pageVC.delegate = self\n        pageVC.dataSource = self\n        pageVC.reloadData()\n\n        // 设置起始页\n        pageVC.pagerController.scrollToController(at: 0, animate: false)\n    }\n }\n\n// MARK:- 分页控制器协议\nextension HCLoginViewController: TYTabPagerControllerDelegate, TYTabPagerControllerDataSource {\n    \n    func numberOfControllersInTabPagerController() -> Int {\n        return titles.count\n    }\n    \n    func tabPagerController(_ tabPagerController: TYTabPagerController, controllerFor index: Int, prefetching: Bool) -> UIViewController {\n        \n        if index == 0 {\n\n            return HCAccountLoginViewController()\n        }\n        else if index == 1 {\n\n            return HCThridLoginViewController()\n        }\n\n        let VC = UIViewController()\n        VC.view.backgroundColor = kThemeWhiteColor\n        return VC\n    }\n    \n    func tabPagerController(_ tabPagerController: TYTabPagerController, titleFor index: Int) -> String {\n        return titles[index]\n    }\n}\n\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Mine/Controller/Login/HCThridLoginViewController.swift",
    "content": "//\n//  HCThridLoginViewController.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/27.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nclass HCThridLoginViewController: HCBaseViewController {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Mine/Controller/Login/Model/HCAccountLoginResult.swift",
    "content": "//\n//  HCAccountLoginResult.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/1/3.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\n\nenum HCAccountLoginResult {\n    case ok(message:String)\n    case empty\n    case failed(message:String)\n}\n\nextension HCAccountLoginResult {\n    var description: String {\n        switch self {\n        case let .ok(message):\n            return message\n        case .empty:\n            return \"\"\n        case let .failed(message):\n            return message\n        }\n    }\n}\n\nextension HCAccountLoginResult {\n    var borderColor: CGColor {\n        switch self {\n        case .ok:\n            return kThemeGainsboroColor.cgColor\n        case .empty:\n            return kThemeOrangeRedColor.cgColor\n        case .failed:\n            return kThemeOrangeRedColor.cgColor\n        }\n    }\n}\n\nextension Reactive where Base: UITextField {\n    var validationResult: Binder<HCAccountLoginResult> {\n        return Binder(self.base) { field, result in\n            field.layer.borderColor = result.borderColor\n        }\n    }\n}\n\n\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Mine/Controller/Login/Service/HCAccountLoginService.swift",
    "content": "//\n//  HCAccountLoginService.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/1/3.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\n\nclass HCAccountLoginService {\n\n    static let shareInstance = HCAccountLoginService()\n    private init() {}\n\n    // 验证账号是否合法\n    func validationAccount(_ account: String) -> Observable<HCAccountLoginResult> {\n        \n        if HCInputValidator.isValidEmail(email: account) == false {\n            return Observable.just(HCAccountLoginResult.failed(message: \"账号非法\"))\n        }\n      \n        return Observable.just(HCAccountLoginResult.ok(message: \"账号合法\"))\n    }\n    \n    // 验证密码是否合法\n    func validationPassword(_ passsword: String) -> Observable<HCAccountLoginResult> {\n        \n        if HCInputValidator.isvalidationPassword(password: passsword) == false {\n            return Observable.just(HCAccountLoginResult.failed(message: \"密码非法\"))\n        }\n        \n        return Observable.just(HCAccountLoginResult.ok(message: \"密码合法\"))\n    }\n        \n    // 登录请求\n    func login(account: String, password: String) -> Observable<HCAccountLoginResult> {\n        \n        if account.characters.count > 10 {\n            return Observable.just(HCAccountLoginResult.ok(message: \"登录成功\"))\n        } else {\n            return Observable.just(HCAccountLoginResult.failed(message: \"密码错误\"))\n        }\n    }\n    \n    // 登录按钮是否可用\n    func loginBtnEnable(account: String, password: String) -> Observable<Bool> {\n        \n        if HCInputValidator.isValidEmail(email: account) && HCInputValidator.isvalidationPassword(password: password) {\n            return Observable.just(true)\n        } else {\n            return Observable.just(false)\n        }\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Mine/Controller/Login/View/HCAccountLoginable.swift",
    "content": "//\n//  HCTextField.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/27.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport Then\nimport RxSwift\nimport RxCocoa\nimport NSObject_Rx\n\n// MARK:- 事件\nstruct AccountLoginEvent {\n    \n    // MARK:- 事件类型\n    enum AccountLoginType {\n        \n        case login\n        case forget\n        case weixin\n        case weibo\n        case qq\n    }\n\n    var type: AccountLoginType\n    var title: String?\n    \n    init(type: AccountLoginType, title: String?) {\n     \n        self.type = type\n        self.title = title\n    }\n}\n\nfileprivate struct Metric {\n    \n    static let tipBtnWidth: CGFloat = 40.0\n    static let borderWidth: CGFloat = 1.0\n    static let cornerRadius: CGFloat = 3.0\n\n    static let fontSize = UIFont.systemFont(ofSize: 18)\n    \n    static let loginBtnHeight: CGFloat = 40.0\n    static let loginBtnFontSize = UIFont.systemFont(ofSize: 16)\n    static let forgetFontSize = UIFont.systemFont(ofSize: 13)\n    static let loginBtnTitle = \"登录\"\n    static let forgetBtnTitle = \"忘记密码？\"\n    static let accountLeftTip = \"+86\"\n    static let accountPlaceholder = \"请输入手机号/邮箱\"\n    static let passswordPlaceholder = \"请输入密码\"\n}\n\nprotocol HCAccountLoginable {\n    \n}\n\n// MARK:- 自定义组件\nextension HCAccountLoginable where Self : HCAccountLoginViewController {\n\n    \n    // MARK:- 其他登录方式\n    func initOtherLoginView(onNext: @escaping (_ event: AccountLoginEvent)->Void) -> UIView {\n        \n        // 创建\n        let otherLoginView = HCOtherLoginModeView.loadFromNib()\n        \n        otherLoginView.weixinBtn.rx.tap.do(onNext: {\n            onNext(AccountLoginEvent.init(type: .weixin, title: \"微信登陆\"))\n        }).subscribe().disposed(by: rx.disposeBag)\n        \n        otherLoginView.weiboBtn.rx.tap.do(onNext: {\n            onNext(AccountLoginEvent.init(type: .weibo, title: \"微博登陆\"))\n        }).subscribe().disposed(by: rx.disposeBag)\n        \n        otherLoginView.qqBtn.rx.tap.do(onNext: {\n            onNext(AccountLoginEvent.init(type: .qq, title: \"QQ登陆\"))\n        }).subscribe().disposed(by: rx.disposeBag)\n        \n        return otherLoginView\n    }\n    \n    // MARK:- 登录按钮部分\n    func initLoginBtnView(onNext: @escaping (_ event: AccountLoginEvent)->Void) -> (UIView, UIButton) {\n        \n        // 创建\n        let btnView = UIView().then {\n            $0.backgroundColor = kThemeWhiteColor\n        }\n        \n        let loginBtn = UIButton().then {\n            $0.layer.masksToBounds = true\n            $0.layer.cornerRadius = Metric.cornerRadius\n            $0.setBackgroundImage(UIImage.color(kThemeTomatoColor), for: .normal)\n            $0.titleLabel?.font = Metric.loginBtnFontSize\n            $0.setTitleColor(kThemeWhiteColor, for: .normal)\n            $0.setTitle(Metric.loginBtnTitle, for: .normal)\n            $0.rx.tap.do(onNext: {\n                onNext(AccountLoginEvent.init(type: .login, title: \"登陆按钮\"))\n            }).subscribe().disposed(by: rx.disposeBag)\n        }\n        \n        let forgetBtn = UIButton().then {\n            $0.setTitleColor(kThemeTomatoColor, for: .normal)\n            $0.setTitle(Metric.forgetBtnTitle, for: .normal)\n            $0.titleLabel?.font = Metric.forgetFontSize\n            $0.rx.tap.do(onNext: {\n                onNext(AccountLoginEvent.init(type: .forget, title: \"忘记密码\"))\n            }).subscribe().disposed(by: rx.disposeBag)\n        }\n        \n        // 添加\n        btnView.addSubview(loginBtn)\n        btnView.addSubview(forgetBtn)\n        \n        // 布局\n        loginBtn.snp.makeConstraints { (make) in\n            \n            make.left.right.top.equalToSuperview()\n            make.height.equalTo(Metric.loginBtnHeight)\n        }\n        \n        forgetBtn.snp.makeConstraints { (make) in\n            make.top.equalTo(loginBtn.snp.bottom).offset(MetricGlobal.margin)\n            make.right.equalTo(loginBtn.snp.right)\n            if let width = forgetBtn.titleLabel?.text?.getSize(font: Metric.forgetFontSize).width {\n                make.width.equalTo(width)\n            }\n            make.height.equalTo(30)\n            make.bottom.equalToSuperview().offset(-MetricGlobal.margin)\n        }\n        \n        return (btnView, loginBtn)\n    }\n    \n    // MARK:- 账号输入框\n    func initAccountField(onNext: @escaping ()->Void) -> UITextField {\n     \n        let field = UITextField().then {\n            $0.layer.masksToBounds = true\n            $0.layer.borderColor = kThemeGainsboroColor.cgColor\n            $0.layer.borderWidth = Metric.borderWidth\n            $0.layer.cornerRadius = Metric.cornerRadius\n            $0.borderStyle = .none\n            $0.leftViewMode = .always\n            $0.leftView = self.accountLeftView()\n            $0.placeholder = Metric.accountPlaceholder\n        }\n        \n//        // 输入内容 校验\n//        let fieldObservable = field.rx.text.skip(1).throttle(0.75, scheduler: MainScheduler.instance).map { (input: String?) -> Bool in\n//            guard let input  = input else { return false }\n//            HCLog(\"\\(input)\")\n//            return HCInputValidator.isValidEmail(email: input)\n//        }\n\n//        fieldObservable.map { (valid: Bool) -> UIColor in\n//            let color = valid ? kThemeGainsboroColor : kThemeOrangeRedColor\n//            return color\n//        }.subscribe(onNext: { (color) in\n//            field.layer.borderColor = color.cgColor\n//        }).disposed(by: rx.disposeBag)\n        \n        return field\n    }\n    \n    // MARK:- 密码输入框\n    func initPasswordField(onNext: @escaping ()->Void) -> UITextField {\n\n        let field = UITextField().then {\n            $0.layer.masksToBounds = true\n            $0.layer.borderColor = kThemeGainsboroColor.cgColor\n            $0.layer.borderWidth = Metric.borderWidth\n            $0.layer.cornerRadius = Metric.cornerRadius\n            $0.isSecureTextEntry = true\n            $0.borderStyle = .none\n            $0.leftViewMode = .always\n            $0.leftView = self.passwordLeftView()\n            $0.placeholder = Metric.passswordPlaceholder\n        }\n        \n//        // 输入内容 校验\n//        let fieldObservable = field.rx.text.skip(1).throttle(0.75, scheduler: MainScheduler.instance).map { (input: String?) -> Bool in\n//            guard let input  = input else { return false }\n//            HCLog(\"\\(input)\")\n//            return HCInputValidator.isvalidationPassword(password: input)\n//        }\n        \n//        fieldObservable.map { (valid: Bool) -> UIColor in\n//            let color = valid ? kThemeGainsboroColor : kThemeOrangeRedColor\n//            return color\n//            }.subscribe(onNext: { (color) in\n//                field.layer.borderColor = color.cgColor\n//            }).disposed(by: rx.disposeBag)\n\n        return field\n    }\n\n    // MARK:- 账号输入框 左视图\n    private func accountLeftView() -> UIView {\n        \n        let leftView = UIView().then {\n            $0.frame = CGRect(x: 0, y: 0, width: 100, height: 44)\n        }\n        \n        let tipLab = UILabel().then {\n            $0.textAlignment = .center\n            $0.font = Metric.fontSize\n            $0.text = Metric.accountLeftTip\n        }\n        \n        let tipBtn = UIButton().then {\n            $0.contentMode = .scaleAspectFit\n            $0.isUserInteractionEnabled = false\n            $0.setImage(UIImage(named: \"live_ic_arrow_right\"), for: .normal)\n            // 旋转90度\n            $0.transform = CATransform3DGetAffineTransform(CATransform3DMakeRotation(CGFloat.pi / 2, 0, 0, 1))\n        }\n        \n        let lineView = UIView().then {\n            $0.backgroundColor = kThemeGainsboroColor\n        }\n        \n        // 添加\n        leftView.addSubview(tipLab)\n        leftView.addSubview(tipBtn)\n        leftView.addSubview(lineView)\n        \n        tipLab.snp.makeConstraints { (make) in\n            make.left.top.bottom.equalToSuperview()\n            make.right.equalTo(tipBtn.snp.left)\n        }\n        \n        tipBtn.snp.makeConstraints { (make) in\n            make.top.bottom.equalToSuperview()\n            make.width.equalTo(Metric.tipBtnWidth)\n            make.right.equalTo(lineView.snp.left)\n        }\n        \n        lineView.snp.makeConstraints { (make) in\n            make.right.equalToSuperview().offset(-MetricGlobal.margin)\n            make.top.equalToSuperview().offset(MetricGlobal.margin)\n            make.bottom.equalToSuperview().offset(-MetricGlobal.margin)\n            make.width.equalTo(Metric.borderWidth)\n        }\n        \n        return leftView\n    }\n    \n    // MARK:- 密码输入框 左视图\n    private func passwordLeftView() -> UIView {\n        \n        let leftView = UIView().then {\n            $0.frame = CGRect(x: 0, y: 0, width: 40, height: 44)\n        }\n        \n        let tipBtn = UIButton().then {\n            $0.contentMode = .scaleAspectFit\n            $0.isUserInteractionEnabled = false\n            $0.setImage(UIImage(named: \"registerAndLogin_password_textField\"), for: .normal)\n        }\n        \n        // 添加\n        leftView.addSubview(tipBtn)\n        \n        tipBtn.snp.makeConstraints { (make) in\n            make.top.bottom.equalToSuperview()\n            make.left.equalToSuperview().offset(MetricGlobal.margin)\n            make.right.equalToSuperview().offset(-MetricGlobal.margin)\n            make.width.equalTo(Metric.tipBtnWidth)\n        }\n        \n        return leftView\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Mine/Controller/Login/View/HCOtherLoginModeView.swift",
    "content": "//\n//  HCOtherLoginModeView.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/29.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nclass HCOtherLoginModeView: UIView, NibLoadable {\n    \n    @IBOutlet weak var weixinBtn: UIButton!\n    @IBOutlet weak var weiboBtn: UIButton!\n    @IBOutlet weak var qqBtn: UIButton!    \n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Mine/Controller/Login/View/HCOtherLoginModeView.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"13196\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"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=\"13173\"/>\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=\"HCOtherLoginModeView\" customModule=\"RxXMLY\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"220\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"A1c-Vd-G6n\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"60\"/>\n                    <subviews>\n                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"其他方式登录\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ULG-oF-51x\">\n                            <rect key=\"frame\" x=\"142\" y=\"21.5\" width=\"92\" height=\"18\"/>\n                            <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"15\"/>\n                            <color key=\"textColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            <nil key=\"highlightedColor\"/>\n                        </label>\n                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"vYu-Rr-Dhb\">\n                            <rect key=\"frame\" x=\"16\" y=\"30\" width=\"116\" height=\"1\"/>\n                            <color key=\"backgroundColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            <constraints>\n                                <constraint firstAttribute=\"height\" constant=\"1\" id=\"kkR-Uu-d1g\"/>\n                            </constraints>\n                        </view>\n                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"sBH-h3-io4\">\n                            <rect key=\"frame\" x=\"244\" y=\"30\" width=\"115\" height=\"1\"/>\n                            <color key=\"backgroundColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            <constraints>\n                                <constraint firstAttribute=\"height\" constant=\"1\" id=\"1ok-MC-t7N\"/>\n                            </constraints>\n                        </view>\n                    </subviews>\n                    <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                    <constraints>\n                        <constraint firstItem=\"vYu-Rr-Dhb\" firstAttribute=\"leading\" secondItem=\"A1c-Vd-G6n\" secondAttribute=\"leading\" constant=\"16\" id=\"3ad-yP-2OL\"/>\n                        <constraint firstItem=\"ULG-oF-51x\" firstAttribute=\"centerY\" secondItem=\"vYu-Rr-Dhb\" secondAttribute=\"centerY\" id=\"5gE-Wz-Gb6\"/>\n                        <constraint firstAttribute=\"height\" constant=\"60\" id=\"Bh5-dg-pj4\"/>\n                        <constraint firstItem=\"sBH-h3-io4\" firstAttribute=\"centerY\" secondItem=\"vYu-Rr-Dhb\" secondAttribute=\"centerY\" id=\"LmM-AT-Yxw\"/>\n                        <constraint firstItem=\"ULG-oF-51x\" firstAttribute=\"centerX\" secondItem=\"A1c-Vd-G6n\" secondAttribute=\"centerX\" id=\"c3i-oN-3fa\"/>\n                        <constraint firstAttribute=\"trailing\" secondItem=\"sBH-h3-io4\" secondAttribute=\"trailing\" constant=\"16\" id=\"fMo-FW-yYd\"/>\n                        <constraint firstItem=\"ULG-oF-51x\" firstAttribute=\"centerY\" secondItem=\"A1c-Vd-G6n\" secondAttribute=\"centerY\" id=\"q4B-Zl-pel\"/>\n                        <constraint firstItem=\"sBH-h3-io4\" firstAttribute=\"leading\" secondItem=\"ULG-oF-51x\" secondAttribute=\"trailing\" constant=\"10\" id=\"yHT-1P-ICL\"/>\n                        <constraint firstItem=\"ULG-oF-51x\" firstAttribute=\"leading\" secondItem=\"vYu-Rr-Dhb\" secondAttribute=\"trailing\" constant=\"10\" id=\"zwm-ks-F99\"/>\n                    </constraints>\n                </view>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"CZj-3f-o7u\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"60\" width=\"375\" height=\"160\"/>\n                    <subviews>\n                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3Za-WC-dUU\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"125\" height=\"100\"/>\n                            <subviews>\n                                <button opaque=\"NO\" contentMode=\"scaleAspectFit\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"XOp-wM-rHY\">\n                                    <rect key=\"frame\" x=\"32.5\" y=\"10\" width=\"60\" height=\"60\"/>\n                                    <state key=\"normal\" backgroundImage=\"registerAndLogin_wechat_button\"/>\n                                </button>\n                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"微信登陆\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Wtw-a1-ZIn\">\n                                    <rect key=\"frame\" x=\"36\" y=\"75\" width=\"53.5\" height=\"16\"/>\n                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                    <color key=\"textColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                    <nil key=\"highlightedColor\"/>\n                                </label>\n                            </subviews>\n                            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            <constraints>\n                                <constraint firstAttribute=\"height\" constant=\"100\" id=\"7sP-PO-ur9\"/>\n                                <constraint firstItem=\"Wtw-a1-ZIn\" firstAttribute=\"centerX\" secondItem=\"XOp-wM-rHY\" secondAttribute=\"centerX\" id=\"FKQ-OE-BQ9\"/>\n                                <constraint firstItem=\"XOp-wM-rHY\" firstAttribute=\"centerY\" secondItem=\"3Za-WC-dUU\" secondAttribute=\"centerY\" constant=\"-10\" id=\"aD2-hu-QJj\"/>\n                                <constraint firstItem=\"Wtw-a1-ZIn\" firstAttribute=\"top\" secondItem=\"XOp-wM-rHY\" secondAttribute=\"bottom\" constant=\"5\" id=\"pSd-TB-1Yk\"/>\n                                <constraint firstItem=\"XOp-wM-rHY\" firstAttribute=\"centerX\" secondItem=\"3Za-WC-dUU\" secondAttribute=\"centerX\" id=\"yTx-g1-sbI\"/>\n                            </constraints>\n                        </view>\n                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"lV7-Ly-itB\">\n                            <rect key=\"frame\" x=\"125\" y=\"0.0\" width=\"125\" height=\"100\"/>\n                            <subviews>\n                                <button opaque=\"NO\" contentMode=\"scaleAspectFit\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ngJ-Fw-FJ9\">\n                                    <rect key=\"frame\" x=\"32\" y=\"10\" width=\"60\" height=\"60\"/>\n                                    <state key=\"normal\" backgroundImage=\"registerAndLogin_weibo_button\"/>\n                                </button>\n                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"微博登陆\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"fFE-OY-9Oi\">\n                                    <rect key=\"frame\" x=\"36\" y=\"75\" width=\"53.5\" height=\"16\"/>\n                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                    <color key=\"textColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                    <nil key=\"highlightedColor\"/>\n                                </label>\n                            </subviews>\n                            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            <constraints>\n                                <constraint firstItem=\"ngJ-Fw-FJ9\" firstAttribute=\"centerX\" secondItem=\"lV7-Ly-itB\" secondAttribute=\"centerX\" id=\"7ue-re-eSB\"/>\n                                <constraint firstItem=\"ngJ-Fw-FJ9\" firstAttribute=\"centerY\" secondItem=\"lV7-Ly-itB\" secondAttribute=\"centerY\" constant=\"-10\" id=\"OFQ-Ho-igc\"/>\n                                <constraint firstItem=\"fFE-OY-9Oi\" firstAttribute=\"top\" secondItem=\"ngJ-Fw-FJ9\" secondAttribute=\"bottom\" constant=\"5\" id=\"Qte-8n-ycX\"/>\n                                <constraint firstItem=\"fFE-OY-9Oi\" firstAttribute=\"centerX\" secondItem=\"ngJ-Fw-FJ9\" secondAttribute=\"centerX\" id=\"kjj-vs-nLK\"/>\n                            </constraints>\n                        </view>\n                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"iNf-Zp-ayL\">\n                            <rect key=\"frame\" x=\"250\" y=\"0.0\" width=\"125\" height=\"100\"/>\n                            <subviews>\n                                <button opaque=\"NO\" contentMode=\"scaleAspectFit\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"35l-cb-ZNa\">\n                                    <rect key=\"frame\" x=\"32\" y=\"10\" width=\"60\" height=\"60\"/>\n                                    <state key=\"normal\" backgroundImage=\"registerAndLogin_qq_button\"/>\n                                </button>\n                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"QQ登陆\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"guD-8s-vM7\">\n                                    <rect key=\"frame\" x=\"39.5\" y=\"75\" width=\"46.5\" height=\"16\"/>\n                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                    <color key=\"textColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                    <nil key=\"highlightedColor\"/>\n                                </label>\n                            </subviews>\n                            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            <constraints>\n                                <constraint firstItem=\"35l-cb-ZNa\" firstAttribute=\"centerX\" secondItem=\"iNf-Zp-ayL\" secondAttribute=\"centerX\" id=\"JBC-4H-fhT\"/>\n                                <constraint firstItem=\"guD-8s-vM7\" firstAttribute=\"centerX\" secondItem=\"35l-cb-ZNa\" secondAttribute=\"centerX\" id=\"k5D-Yu-B75\"/>\n                                <constraint firstItem=\"guD-8s-vM7\" firstAttribute=\"top\" secondItem=\"35l-cb-ZNa\" secondAttribute=\"bottom\" constant=\"5\" id=\"rpH-BR-QDC\"/>\n                                <constraint firstItem=\"35l-cb-ZNa\" firstAttribute=\"centerY\" secondItem=\"iNf-Zp-ayL\" secondAttribute=\"centerY\" constant=\"-10\" id=\"xRX-ox-YvG\"/>\n                            </constraints>\n                        </view>\n                        <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"lastLoginTip\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"c4L-cR-uoP\">\n                            <rect key=\"frame\" x=\"21\" y=\"105\" width=\"83\" height=\"35\"/>\n                        </imageView>\n                    </subviews>\n                    <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                    <constraints>\n                        <constraint firstAttribute=\"trailing\" secondItem=\"iNf-Zp-ayL\" secondAttribute=\"trailing\" id=\"0al-k5-3Bc\"/>\n                        <constraint firstItem=\"iNf-Zp-ayL\" firstAttribute=\"height\" secondItem=\"3Za-WC-dUU\" secondAttribute=\"height\" id=\"5fe-Fs-aMp\"/>\n                        <constraint firstItem=\"iNf-Zp-ayL\" firstAttribute=\"centerY\" secondItem=\"3Za-WC-dUU\" secondAttribute=\"centerY\" id=\"8M5-1p-KkZ\"/>\n                        <constraint firstItem=\"lV7-Ly-itB\" firstAttribute=\"leading\" secondItem=\"3Za-WC-dUU\" secondAttribute=\"trailing\" id=\"ADX-Tb-ltH\"/>\n                        <constraint firstItem=\"3Za-WC-dUU\" firstAttribute=\"centerY\" secondItem=\"CZj-3f-o7u\" secondAttribute=\"centerY\" constant=\"-30\" id=\"Blr-W1-1kX\"/>\n                        <constraint firstItem=\"3Za-WC-dUU\" firstAttribute=\"leading\" secondItem=\"CZj-3f-o7u\" secondAttribute=\"leading\" id=\"FaH-uF-34H\"/>\n                        <constraint firstItem=\"c4L-cR-uoP\" firstAttribute=\"centerX\" secondItem=\"3Za-WC-dUU\" secondAttribute=\"centerX\" id=\"Grv-lL-I9n\"/>\n                        <constraint firstItem=\"lV7-Ly-itB\" firstAttribute=\"width\" secondItem=\"3Za-WC-dUU\" secondAttribute=\"width\" id=\"Htp-5V-rfd\"/>\n                        <constraint firstItem=\"iNf-Zp-ayL\" firstAttribute=\"leading\" secondItem=\"lV7-Ly-itB\" secondAttribute=\"trailing\" id=\"K8I-ax-GBM\"/>\n                        <constraint firstItem=\"lV7-Ly-itB\" firstAttribute=\"centerY\" secondItem=\"3Za-WC-dUU\" secondAttribute=\"centerY\" id=\"UHa-Si-mM7\"/>\n                        <constraint firstAttribute=\"bottom\" secondItem=\"c4L-cR-uoP\" secondAttribute=\"bottom\" constant=\"20\" id=\"YuB-c8-Rpd\"/>\n                        <constraint firstItem=\"3Za-WC-dUU\" firstAttribute=\"leading\" secondItem=\"CZj-3f-o7u\" secondAttribute=\"leading\" id=\"ZgR-U3-KVW\"/>\n                        <constraint firstItem=\"c4L-cR-uoP\" firstAttribute=\"top\" secondItem=\"3Za-WC-dUU\" secondAttribute=\"bottom\" constant=\"5\" id=\"cpa-fg-DTX\"/>\n                        <constraint firstItem=\"iNf-Zp-ayL\" firstAttribute=\"width\" secondItem=\"3Za-WC-dUU\" secondAttribute=\"width\" id=\"oas-Om-HHJ\"/>\n                        <constraint firstItem=\"lV7-Ly-itB\" firstAttribute=\"height\" secondItem=\"3Za-WC-dUU\" secondAttribute=\"height\" id=\"pU5-cL-VUD\"/>\n                    </constraints>\n                </view>\n            </subviews>\n            <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n            <constraints>\n                <constraint firstAttribute=\"bottom\" secondItem=\"CZj-3f-o7u\" secondAttribute=\"bottom\" id=\"68B-XZ-m76\"/>\n                <constraint firstItem=\"CZj-3f-o7u\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" id=\"FiP-tj-FOs\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"A1c-Vd-G6n\" secondAttribute=\"trailing\" id=\"Rnn-qQ-MuI\"/>\n                <constraint firstItem=\"A1c-Vd-G6n\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" id=\"X9I-Lz-8cK\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"CZj-3f-o7u\" secondAttribute=\"trailing\" id=\"XZ2-ET-UPI\"/>\n                <constraint firstItem=\"CZj-3f-o7u\" firstAttribute=\"top\" secondItem=\"A1c-Vd-G6n\" secondAttribute=\"bottom\" id=\"scn-Co-8tz\"/>\n                <constraint firstItem=\"A1c-Vd-G6n\" firstAttribute=\"top\" secondItem=\"iN0-l3-epB\" secondAttribute=\"top\" id=\"v4Z-PL-ml3\"/>\n            </constraints>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <connections>\n                <outlet property=\"qqBtn\" destination=\"35l-cb-ZNa\" id=\"hPf-0v-BL0\"/>\n                <outlet property=\"weiboBtn\" destination=\"ngJ-Fw-FJ9\" id=\"vC9-At-Avd\"/>\n                <outlet property=\"weixinBtn\" destination=\"XOp-wM-rHY\" id=\"1Zq-Tf-Ysi\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"56.5\" y=\"121\"/>\n        </view>\n    </objects>\n    <resources>\n        <image name=\"lastLoginTip\" width=\"83\" height=\"37\"/>\n        <image name=\"registerAndLogin_qq_button\" width=\"60\" height=\"60\"/>\n        <image name=\"registerAndLogin_wechat_button\" width=\"60\" height=\"60\"/>\n        <image name=\"registerAndLogin_weibo_button\" width=\"60\" height=\"60\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Mine/Controller/Login/ViewModel/HCAccountLoginViewModel.swift",
    "content": "//\n//  HCAccountLoginViewModel.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/1/3.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\n\nclass HCAccountLoginViewModel {\n\n    let accountUseable: Driver<HCAccountLoginResult>\n    let passwordUseable: Driver<HCAccountLoginResult>\n    let loginBtnEnable: Driver<Bool>\n    let loginResult: Driver<HCAccountLoginResult>\n\n    init(input: (accountField: UITextField, passwordField: UITextField, loginBtn: UIButton), service: HCAccountLoginService)  {\n        \n        let accountDriver = input.accountField.rx.text.orEmpty.asDriver()\n        let passwordDriver = input.passwordField.rx.text.orEmpty.asDriver()\n        let loginTapDriver = input.loginBtn.rx.tap.asDriver()\n        \n        accountUseable = accountDriver.skip(1).flatMapLatest { account in\n            return service.validationAccount(account).asDriver(onErrorJustReturn: .failed(message: \"连接service失败\"))\n        }\n    \n        passwordUseable = passwordDriver.skip(1).flatMapLatest { password in\n            return service.validationPassword(password).asDriver(onErrorJustReturn: .failed(message: \"连接service失败\"))\n        }\n        \n        let accountAndPassword = Driver.combineLatest(accountDriver, passwordDriver) {\n            return ($0, $1)\n        }\n        \n        loginBtnEnable = accountAndPassword.flatMap { (account, password) in\n            return service.loginBtnEnable(account: account, password: password).asDriver(onErrorJustReturn: false)\n        }\n        \n        loginResult = loginTapDriver.withLatestFrom(accountAndPassword).flatMapLatest{ (account, password)  in\n            return service.login(account: account, password: password).asDriver(onErrorJustReturn: .failed(message: \"连接service失败\"))\n        }\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Mine/Controller/Setting/HCSettingViewController.swift",
    "content": "//\n//  HCSettingViewController.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/1/10.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport NSObject_Rx\nimport RxDataSources\nimport ReusableKit\nimport Then\nimport RxGesture\n\n// MARK:- 复用\nprivate enum Reusable {\n    \n    static let settingCell = ReusableCell<HCSettingCell>()\n}\n\n// MARK:- 常量\nfileprivate struct Metric {\n\n    static let sectionHeight: CGFloat = 10.0\n}\n\nclass HCSettingViewController: HCBaseViewController {\n\n    // viewModel\n    private var viewModel = HCSettingViewModel()\n    private var vmOutput: HCSettingViewModel.HCSettingOutput?\n    \n    // View\n    private var tableView: UITableView!\n    \n    // DataSuorce\n    var dataSource : RxTableViewSectionedReloadDataSource<HCSettingSection>!\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        // 修正 Push 后导航栏灰色\n        self.navigationController?.navigationBar.backgroundColor = kThemeWhiteColor\n        self.navigationController?.navigationBar.barTintColor = kThemeWhiteColor\n\n        initEnableMudule()\n        initUI()\n        bindUI()\n    }\n}\n\n// MARK:- 初始化协议\nextension HCSettingViewController: HCNavBackable, HCNavUniversalable {\n    \n    // MARK:- 协议组件\n    private func initEnableMudule() {\n        \n        // 登录页面 返回、注册\n        let models = [HCNavigationBarItemMetric.back]\n        self.universals(modelArr: models) { [weak self] (model) in\n            guard let `self` = self else { return }\n            HCLog(model.description)\n            let type = model.type\n            switch type {\n            case .back:\n                self.navigationController?.popViewController(animated: true)\n                break\n            default: break\n            }\n        }\n    }\n}\n\nextension HCSettingViewController {\n    \n    // MARK:- 初始化视图\n    private func initUI() {\n        \n        self.title = \"设置\"\n        \n        let tableView = UITableView(frame: .zero, style: .plain)\n        tableView.backgroundColor = kThemeGainsboroColor\n        tableView.separatorStyle = .none\n        tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: 60.0))\n        view.addSubview(tableView)\n        self.tableView = tableView\n        \n        tableView.snp.makeConstraints { (make) in\n            make.left.top.right.bottom.equalToSuperview()\n        }\n        \n        // 设置代理\n        tableView.rx.setDelegate(self).disposed(by: rx.disposeBag)\n        \n        // 注册cell\n        tableView.register(Reusable.settingCell)\n    }\n    \n    // MARK:- 绑定视图\n    func bindUI() {\n        \n        dataSource = RxTableViewSectionedReloadDataSource(configureCell: { (ds, tv, indexPath, item) -> UITableViewCell in\n            if indexPath.row == 0 {\n                // 充当 SectionHeader 占位\n                let placeCell = UITableViewCell()\n                placeCell.backgroundColor = kThemeGainsboroColor\n                return placeCell\n            }\n            let cell = tv.dequeue(Reusable.settingCell, for: indexPath)\n            cell.model = item\n            return cell\n        })\n        \n        vmOutput = viewModel.transform(input: HCSettingViewModel.HCSettingInput(type: .setting))\n        \n        vmOutput?.sections.asDriver().drive(tableView.rx.items(dataSource: dataSource)).disposed(by: rx.disposeBag)\n    }\n}\n\n// MARK:- UITableViewDelegate\nextension HCSettingViewController: UITableViewDelegate {\n    \n    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {\n        \n        // 充当 SectionHeader 数据模型\n        if indexPath.row == 0 {\n            return Metric.sectionHeight\n        }\n        return HCSettingCell.cellHeight()\n    }\n    \n    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {\n        \n        tableView.deselectRow(at: indexPath, animated: true)\n        \n        // 充当 SectionHeader 数据模型\n        if indexPath.row == 0 { return }\n    }\n}\n\n// MARK:- 控制器跳转\nextension HCSettingViewController {\n    \n    // MARK:- 登录\n    func jump2Login() {\n        \n        let VC = HCBaseNavigationController(rootViewController: HCLoginViewController())\n        self.present(VC, animated: true, completion: nil)\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Mine/Controller/Setting/Model/HCSettingCellModel.swift",
    "content": "//\n//  HCSettingCellModel.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/1/10.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\npublic enum HCSettingCellType {\n    case normal                                 // 正常\n    case rightRecordButton                      // 右侧录音\n    case rightSwitch(isOn: Bool)                // 右侧开关\n    case rightTextLab                           // 右侧文本\n}\n\n// MARK:- 设置单元格 数据模型\npublic struct HCSettingCellModel {\n    \n    var leftIcon: String?\n    var title: String?\n    var description: String?\n    var dotIcon: String?\n    var rightIcon: String?\n    \n    var isHiddenBottomLine: Bool? = false\n    var cellType: HCSettingCellType = .normal\n    \n    init() {\n    }\n    \n    init(leftIcon: String?, title: String?, description: String?, dotIcon: String?, rightIcon: String?) {\n        \n        self.leftIcon = leftIcon\n        self.title = title\n        self.description = description\n        self.rightIcon = rightIcon\n        self.dotIcon = dotIcon\n    }\n    \n    init(leftIcon: String?, title: String?, description: String?, dotIcon: String?, rightIcon: String?, isHiddenBottomLine: Bool) {\n        \n        self.leftIcon = leftIcon\n        self.title = title\n        self.description = description\n        self.rightIcon = rightIcon\n        self.dotIcon = dotIcon\n        \n        self.isHiddenBottomLine = isHiddenBottomLine\n    }\n    \n    init(leftIcon: String?, title: String?, description: String?, dotIcon: String?, rightIcon: String?, isHiddenBottomLine: Bool, cellType: HCSettingCellType) {\n        \n        self.leftIcon = leftIcon\n        self.title = title\n        self.description = description\n        self.rightIcon = rightIcon\n        self.dotIcon = dotIcon\n        \n        self.isHiddenBottomLine = isHiddenBottomLine\n        self.cellType = cellType\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Mine/Controller/Setting/View/HCSettingCell.swift",
    "content": "//\n//  HCTableViewCell.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/1/8.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport Then\nimport SnapKit\n\n// MARK:- 常量\nfileprivate struct Metric {\n    \n    static let cellHeight: CGFloat = 49.0\n    \n    static let titleFontSize: CGFloat = 15.0\n    static let descFontSize: CGFloat = 13.0\n    static let lineHeight: CGFloat = 0.5\n}\n\nclass HCSettingCell: UITableViewCell {\n    \n    // 下划线\n    private var bottomLine: UIView?\n\n    // 正常\n    private var leftIcon: UIImageView?\n    private var titleLab: UILabel?\n    private var descriptionLab: UILabel?\n    private var rightIcon: UIImageView?\n    private var dotIcon: UIImageView?\n\n    // 右侧录音\n    private var rightRecordButton: UIButton?\n    private var centerVerticalLine: UIView?\n   \n    // 右侧开关\n    private var rightSwitch: UISwitch?\n\n    // 右侧文本\n    private var rightTextLab: UILabel?\n\n    var model: HCSettingCellModel? { didSet { setModel() } }\n    \n    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {\n        super.init(style: style, reuseIdentifier: reuseIdentifier)\n        \n        initCellUI()\n        initEnableMudule()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n}\n\nextension HCSettingCell {\n    \n    // MARK:- 自定义组件\n    func initCellUI() {\n        \n        // 创建组件\n        let view = UIView().then {\n            $0.backgroundColor = .white\n        }\n        let leftIcon = UIImageView().then {\n            $0.contentMode = .scaleAspectFit\n        }\n        let titleLab = UILabel().then {\n            $0.textColor = kThemeBlackColor\n            $0.font = UIFont.systemFont(ofSize: Metric.titleFontSize)\n        }\n        let descriptionLab = UILabel().then {\n            $0.textColor = kThemeOrangeRedColor\n            $0.font = UIFont.systemFont(ofSize: Metric.descFontSize)\n        }\n        let rightIcon = UIImageView().then {\n            $0.contentMode = .scaleAspectFit\n        }\n        let dotIcon = UIImageView().then {\n            $0.contentMode = .scaleAspectFit\n        }\n        \n        // 录音按钮\n        let centerVerticalLine = UIView().then {\n            $0.backgroundColor = kThemeLightGreyColor\n        }\n        let rightRecordButton = UIButton().then {\n            $0.contentMode = .scaleAspectFit\n        }\n        \n        // 开关\n        let rightSwitch = UISwitch().then {\n            $0.isOn = false\n        }\n        \n        // 文本\n        let rightTextLab = UILabel().then {\n            $0.textColor = kThemeLightGreyColor\n            $0.font = UIFont.systemFont(ofSize: Metric.descFontSize)\n        }\n        \n        // 添加组件\n        view.addSubview(leftIcon)\n        view.addSubview(titleLab)\n        view.addSubview(descriptionLab)\n        view.addSubview(rightIcon)\n        view.addSubview(dotIcon)\n        \n        view.addSubview(centerVerticalLine)\n        view.addSubview(rightRecordButton)\n        view.addSubview(rightSwitch)\n        view.addSubview(rightTextLab)\n\n        self.addSubview(view)\n        \n        // 赋值\n        self.leftIcon = leftIcon\n        self.titleLab = titleLab\n        self.descriptionLab = descriptionLab\n        self.rightIcon = rightIcon\n        self.dotIcon = dotIcon\n        \n        self.centerVerticalLine = centerVerticalLine\n        self.rightRecordButton = rightRecordButton\n        self.rightSwitch = rightSwitch\n        self.rightTextLab = rightTextLab\n        \n        // 左边\n        leftIcon.snp.makeConstraints { (make) in\n            make.left.equalToSuperview().offset(MetricGlobal.margin)\n            make.centerY.equalToSuperview()\n        }\n        titleLab.snp.makeConstraints { (make) in\n            make.left.equalTo(leftIcon.snp.right).offset(MetricGlobal.padding)\n            make.centerY.equalToSuperview()\n        }\n\n        // 右边\n        rightIcon.snp.makeConstraints { (make) in\n            make.right.equalToSuperview().offset(-MetricGlobal.margin)\n            make.centerY.equalToSuperview()\n        }\n        dotIcon.snp.makeConstraints { (make) in\n            make.right.equalTo(rightIcon.snp.left).offset(-MetricGlobal.padding / 2)\n            make.centerY.equalToSuperview()\n        }\n        descriptionLab.snp.makeConstraints { (make) in\n            make.right.equalTo(rightIcon.snp.left).offset(-MetricGlobal.padding / 2)\n            make.centerY.equalToSuperview()\n        }\n        \n        view.snp.makeConstraints { (make) in\n            make.left.right.top.bottom.equalToSuperview()\n        }\n        \n        // 中间竖线\n        centerVerticalLine.snp.makeConstraints { (make) in\n            make.width.equalTo(Metric.lineHeight)\n            make.top.equalToSuperview().offset(MetricGlobal.margin)\n            make.bottom.equalToSuperview().offset(-MetricGlobal.margin)\n            make.centerX.equalToSuperview()\n        }\n        // 录音按钮\n        rightRecordButton.snp.makeConstraints { (make) in\n            make.right.equalToSuperview().offset(-MetricGlobal.margin)\n            make.centerY.equalToSuperview()\n        }\n        // 开关\n        rightSwitch.snp.makeConstraints { (make) in\n            make.right.equalToSuperview().offset(-MetricGlobal.margin)\n            make.centerY.equalToSuperview()\n        }\n        // 文本\n        rightTextLab.snp.makeConstraints { (make) in\n            make.right.equalToSuperview().offset(-MetricGlobal.margin)\n            make.centerY.equalToSuperview()\n        }\n    }\n\n    // MARK:- Setter\n    func setModel() {\n        \n        // 样式调整部分\n        let cellType = model?.cellType ?? .normal\n        switch cellType {\n        case .normal:\n            self.rightIcon?.isHidden = false\n            self.descriptionLab?.isHidden = false\n\n            self.rightSwitch?.isHidden = true\n            self.rightTextLab?.isHidden = true\n            self.rightRecordButton?.isHidden = true\n            break\n        case .rightRecordButton:\n            self.rightIcon?.isHidden = true\n            self.descriptionLab?.isHidden = true\n\n            self.rightSwitch?.isHidden = true\n            self.rightTextLab?.isHidden = true\n            self.rightRecordButton?.isHidden = false\n            \n            break\n        case .rightSwitch:\n            \n            // 设置开关\n            if case let HCSettingCellType.rightSwitch(isOn) = cellType {\n                self.rightSwitch?.isOn = isOn\n            }\n\n            self.rightIcon?.isHidden = true\n            self.descriptionLab?.isHidden = true\n            \n            self.rightSwitch?.isHidden = false\n            self.rightTextLab?.isHidden = true\n            self.rightRecordButton?.isHidden = true\n            break\n        case .rightTextLab:\n            self.rightIcon?.isHidden = true\n            self.descriptionLab?.isHidden = true\n            \n            self.rightSwitch?.isHidden = true\n            self.rightTextLab?.isHidden = false\n            self.rightRecordButton?.isHidden = true\n            break\n        }\n        \n        self.centerVerticalLine?.isHidden = self.rightRecordButton?.isHidden ?? true\n        \n        // 显示部分\n        if let leftIcon = model?.leftIcon {\n            self.leftIcon?.image = UIImage(named: leftIcon)\n        }\n        if let title = model?.title {\n            self.titleLab?.text = title\n        }\n        if let description = model?.description {\n            self.descriptionLab?.text = description\n        }\n        if self.rightIcon?.isHidden == false, let rightIcon = model?.rightIcon {\n            self.rightIcon?.image = UIImage(named: rightIcon)\n        }\n        if let dotIcon = model?.dotIcon {\n            self.dotIcon?.image = UIImage(named: dotIcon)\n        } \n        \n        if let isHiddenBottomLine = model?.isHiddenBottomLine {\n            self.bottomLine?.isHidden = isHiddenBottomLine\n        }\n        \n        if self.rightRecordButton?.isHidden == false, let rightIcon = model?.rightIcon {\n            self.rightRecordButton?.setBackgroundImage(UIImage(named: rightIcon), for: .normal)\n        }\n\n        if self.rightTextLab?.isHidden == false, let description = model?.description {\n            self.rightTextLab?.text = description\n        }\n    }\n\n    static func cellHeight() -> CGFloat {\n        \n        return Metric.cellHeight\n    }\n}\n\nextension HCSettingCell: HCCellStyleable {\n\n    // MARK:- 协议组件\n    private func initEnableMudule() {\n   \n        // 横线\n        bottomLine = bottomLine(style: .marginLeft)\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Mine/Controller/Setting/ViewModel/HCSettingViewModel.swift",
    "content": "//\n//  HCSettingViewModel.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/1/8.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport NSObject_Rx\nimport RxDataSources\n\npublic enum HCSettingViewModelType {\n    case none                             // 未知\n    case mine                             // 我的\n    case setting                          // 设置\n}\n\nclass HCSettingViewModel: NSObject {\n\n    private let vmDatas = Variable<[[HCSettingCellModel]]>([])\n}\n\nextension HCSettingViewModel: HCViewModelType {\n    \n    typealias Input = HCSettingInput\n    typealias Output = HCSettingOutput\n    \n    struct HCSettingInput {\n        \n        let type: HCSettingViewModelType\n        \n        init(type: HCSettingViewModelType) {\n            self.type = type\n        }\n    }\n    \n    struct HCSettingOutput {\n        \n        let sections: Driver<[HCSettingSection]>\n        \n        init(sections: Driver<[HCSettingSection]>) {\n            self.sections = sections\n        }\n    }\n    \n    func transform(input: HCSettingViewModel.HCSettingInput) -> HCSettingViewModel.HCSettingOutput {\n        \n        let temp_sections = vmDatas.asObservable().map({ (sections) -> [HCSettingSection] in\n            return sections.map({ (models) -> HCSettingSection in\n                return HCSettingSection(items: models)\n            })\n        }).asDriver(onErrorJustReturn: [])\n\n        let output = HCSettingOutput(sections: temp_sections)\n        \n        let sectionArr: [[HCSettingCellModel]]\n        \n        switch input.type {\n        case .none:\n            sectionArr = []\n            break\n        case .setting:\n            sectionArr = HCMineFactory.loadSettingModels()\n            break\n        case .mine:\n            sectionArr = HCMineFactory.loadMineModels()\n            break\n        }\n        self.vmDatas.value = sectionArr\n\n        return output\n    }\n}\n\nstruct HCSettingSection {\n    \n    var items: [Item]\n}\n\nextension HCSettingSection: SectionModelType {\n    typealias Item = HCSettingCellModel\n    \n    init(original: HCSettingSection, items: [HCSettingCellModel]) {\n        self = original\n        self.items = items\n    }\n}\n\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Mine/HCMineFactory.swift",
    "content": "//\n//  HCMineFactory.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/1/8.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nclass HCMineFactory: NSObject {\n\n}\n\n// MARK:- 外部访问方法\nextension HCMineFactory {\n    \n    // MARK:- 我的\n    class func loadMineModels() -> [[HCSettingCellModel]] {\n        \n        let model1_1 = HCSettingCellModel(leftIcon: \"me_setting_program\",\n                                          title: \"我的作品\",\n                                          description: nil,\n                                          dotIcon: nil,\n                                          rightIcon: \"meRecord\",\n                                          isHiddenBottomLine: true,\n                                          cellType: .rightRecordButton)\n        \n        let model2_1 = HCSettingCellModel(leftIcon: \"me_setting_plus\",\n                                          title: \"巅峰会员\",\n                                          description: nil,\n                                          dotIcon: nil,\n                                          rightIcon: \"cell_arrow\")\n        let model2_2 = HCSettingCellModel(leftIcon: \"me_setting_CPS\",\n                                          title: \"分享赚钱\",\n                                          description: nil,\n                                          dotIcon: nil,\n                                          rightIcon: \"cell_arrow\",\n                                          isHiddenBottomLine: true)\n        \n        let model3_1 = HCSettingCellModel(leftIcon: \"scan_scan\",\n                                          title: \"扫一扫\",\n                                          description: nil,\n                                          dotIcon: nil,\n                                          rightIcon: \"cell_arrow\")\n        let model3_2 = HCSettingCellModel(leftIcon: \"me_setting_nightmode\",\n                                          title: \"夜间模式\",\n                                          description: nil,\n                                          dotIcon: nil,\n                                          rightIcon: nil,\n                                          isHiddenBottomLine: true,\n                                          cellType: .rightSwitch(isOn: false))\n\n        let model4_1 = HCSettingCellModel(leftIcon: \"me_setting_feedback\",\n                                          title: \"帮助与反馈\",\n                                          description: nil,\n                                          dotIcon: nil,\n                                          rightIcon: \"cell_arrow\")\n        let model4_2 = HCSettingCellModel(leftIcon: \"me_setting_setting\",\n                                          title: \"设置\",\n                                          description: nil,\n                                          dotIcon: \"noread_icon\",\n                                          rightIcon: \"cell_arrow\",\n                                          isHiddenBottomLine: true)\n        \n        var models = [[HCSettingCellModel]]()\n        \n         // 充当 SectionHeader 数据模型\n        let placeModel = HCSettingCellModel()\n\n        models.append([placeModel, model1_1])\n        models.append([placeModel, model2_1, model2_2])\n        models.append([placeModel, model3_1, model3_2])\n        models.append([placeModel, model4_1, model4_2])\n\n        return models\n    }\n\n    // MARK:- 设置\n    class func loadSettingModels() -> [[HCSettingCellModel]] {\n        \n        let model1_1 = HCSettingCellModel(leftIcon: nil,\n                                          title: \"智能硬件\",\n                                          description: nil,\n                                          dotIcon: nil,\n                                          rightIcon: \"cell_arrow\",\n                                          isHiddenBottomLine: true)\n        \n        \n        let model2_1 = HCSettingCellModel(leftIcon: nil,\n                                          title: \"特色闹铃\",\n                                          description: nil,\n                                          dotIcon: nil,\n                                          rightIcon: \"cell_arrow\")\n        let model2_2 = HCSettingCellModel(leftIcon: nil,\n                                          title: \"定时关闭\",\n                                          description: nil,\n                                          dotIcon: nil,\n                                          rightIcon: \"cell_arrow\",\n                                          isHiddenBottomLine: true)\n        \n        \n        let model3_1 = HCSettingCellModel(leftIcon: nil,\n                                          title: \"推送设置\",\n                                          description: \"别错过重要信息，去开启\",\n                                          dotIcon: nil,\n                                          rightIcon: \"cell_arrow\")\n        let model3_2 = HCSettingCellModel(leftIcon: nil,\n                                          title: \"收听偏好设置\",\n                                          description: \"\",\n                                          dotIcon: nil,\n                                          rightIcon: \"cell_arrow\",\n                                          isHiddenBottomLine: true)\n        \n        \n        let model4_1 = HCSettingCellModel(leftIcon: nil,\n                                          title: \"断点续听\",\n                                          description: \"\",\n                                          dotIcon: nil,\n                                          rightIcon: nil,\n                                          isHiddenBottomLine: false,\n                                          cellType: .rightSwitch(isOn: true))\n        let model4_2 = HCSettingCellModel(leftIcon: nil,\n                                          title: \"2G/3G/4G播放和下载\",\n                                          description: \"\",\n                                          dotIcon: nil,\n                                          rightIcon: nil,\n                                          isHiddenBottomLine: false,\n                                          cellType: .rightSwitch(isOn: false))\n        let model4_3 = HCSettingCellModel(leftIcon: nil,\n                                          title: \"清理占用空间\",\n                                          description: \"0.0M\",\n                                          dotIcon: nil,\n                                          rightIcon: \"cell_arrow\",\n                                          isHiddenBottomLine: true,\n                                          cellType: .rightTextLab)\n\n        \n        let model5_1 = HCSettingCellModel(leftIcon: nil,\n                                          title: \"特色功能\",\n                                          description: \"\",\n                                          dotIcon: nil,\n                                          rightIcon: \"cell_arrow\")\n        let model5_2 = HCSettingCellModel(leftIcon: nil,\n                                          title: \"新版本介绍\",\n                                          description: \"\",\n                                          dotIcon: \"noread_icon\",\n                                          rightIcon: \"cell_arrow\")\n        let model5_3 = HCSettingCellModel(leftIcon: nil,\n                                          title: \"给喜马拉雅好评\",\n                                          description: \"\",\n                                          dotIcon: nil,\n                                          rightIcon: \"cell_arrow\")\n        let model5_4 = HCSettingCellModel(leftIcon: nil,\n                                          title: \"关于\",\n                                          description: \"\",\n                                          dotIcon: nil,\n                                          rightIcon: \"cell_arrow\",\n                                          isHiddenBottomLine: true)\n\n        \n        var models = [[HCSettingCellModel]]()\n        \n        // 充当 SectionHeader 数据模型\n        let placeModel = HCSettingCellModel()\n        \n        models.append([placeModel, model1_1])\n        models.append([placeModel, model2_1, model2_2])\n        models.append([placeModel, model3_1, model3_2])\n        models.append([placeModel, model4_1, model4_2, model4_3])\n        models.append([placeModel, model5_1, model5_2, model5_3, model5_4])\n\n        return models\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Mine/HCMineViewController.swift",
    "content": "//\n//  HCMineViewController.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/14.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport NSObject_Rx\nimport RxDataSources\nimport ReusableKit\nimport Then\nimport RxGesture\n\n// MARK:- 复用\nprivate enum Reusable {\n    \n    static let settingCell = ReusableCell<HCSettingCell>()\n}\n\n// MARK:- 常量\nfileprivate struct Metric {\n    \n    static let searchBarLeft: CGFloat = 12.0\n    static let searchBarRight: CGFloat = 12.0\n    \n    static let cellHeight: CGFloat = 49.0\n    static let sectionHeight: CGFloat = 10.0\n    \n    static let marginTop: CGFloat = 90.0 // 调整顶部背景图片位置\n    static let navbarColorChangePoint: CGFloat = -Metric.marginTop / 2 // 调整导航栏渐变开始位置\n}\n\nclass HCMineViewController: HCBaseViewController {\n    \n    // viewModel\n    private var viewModel = HCSettingViewModel()\n    private var vmOutput: HCSettingViewModel.HCSettingOutput?\n    \n    // View\n    private var titleView: UIView?\n    private var tableView: UITableView!\n    private lazy var imageView = UIImageView().then {\n        $0.backgroundColor = kThemeWhiteColor\n        $0.contentMode = .scaleAspectFit\n        $0.image = UIImage(named: \"favicon\")\n    }\n    \n    // DataSuorce\n    var dataSource : RxTableViewSectionedReloadDataSource<HCSettingSection>!\n    \n    override func viewWillAppear(_ animated: Bool) {\n        super.viewWillAppear(animated)\n        \n        self.navigationController?.navigationBar.backgroundColor = .clear\n        self.navigationController?.navigationBar.barTintColor = .clear\n        self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)\n        self.scrollViewDidScroll(tableView)\n        \n        if let tabbarVC = self.tabBarController as? HCMainViewController {\n            tabbarVC.isHiddenPlayView(false)\n        }\n    }\n    \n    override func viewWillDisappear(_ animated: Bool) {\n        super.viewWillDisappear(animated)\n        \n        // 修正 Push 后导航栏灰色\n        self.navigationController?.navigationBar.backgroundColor = kThemeWhiteColor\n        self.navigationController?.navigationBar.barTintColor = kThemeWhiteColor\n        // 移除\n        self.navigationController?.navigationBar.Mg_reset()\n    }\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n    \n        initTitleView()\n        initUI()\n        bindUI()\n    }\n    \n    override func viewWillLayoutSubviews() {\n        super.viewWillLayoutSubviews()\n        \n        titleView?.snp.makeConstraints { (make) in\n            make.centerY.equalToSuperview().offset(-0.5) // 修正偏差\n            make.left.equalToSuperview().offset(Metric.searchBarLeft)\n            make.right.equalToSuperview()\n        }\n    }\n}\n\n// MARK:- 初始化协议部分\nextension HCMineViewController: HCNavTitleable {\n    \n    // MARK:- 标题组件\n    private func initTitleView() {\n        \n        let mineNavigationBar = HCMineNavigationBar()\n        mineNavigationBar.itemClicked = { [weak self] (model) in\n            guard let `self` = self else { return }\n            self.jump2Login()\n        }\n        titleView = self.titleView(titleView: mineNavigationBar)\n    }\n}\n\n// MARK:- 初始化部分\nextension HCMineViewController {\n    \n    // MARK:- 初始化视图\n    private func initUI() {\n        \n        let tableView = UITableView(frame: .zero, style: .plain)\n        tableView.backgroundColor = .clear\n        tableView.separatorStyle = .none\n        let headerView = HCMineHeaderView.loadFromNib()\n        // 点击登录\n        headerView.loginLab.rx.tapGesture().when(.recognized)\n            .subscribe({ [weak self] _ in\n                guard let `self` = self else { return }\n                self.jump2Login()\n            }).disposed(by: rx.disposeBag)\n        headerView.loginImg.rx.tapGesture().when(.recognized)\n            .subscribe({ [weak self] _ in\n                guard let `self` = self else { return }\n                self.jump2Login()\n            }).disposed(by: rx.disposeBag)\n        \n        let tableHeaderView = UIView(frame: headerView.bounds)\n        tableHeaderView.addSubview(headerView)\n        tableView.tableHeaderView = tableHeaderView\n        tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: 60.0))\n        // 调整视图范围\n        tableView.contentInset = UIEdgeInsetsMake(Metric.marginTop, 0, 0, 0)\n        // 调整滚动条范围\n        tableView.scrollIndicatorInsets = UIEdgeInsetsMake(-kNavibarH, 0, 0, 0)\n        \n        // 设置背景图片\n        if let imageSize = imageView.image?.size {\n            // 以屏幕宽度为基准，等比获得图片高度\n            let imageRealHeight = imageSize.height * kScreenW / imageSize.width\n            let imageTopMargin = (Metric.marginTop + kNavibarH + tableHeaderView.height - imageRealHeight) / 2\n            // 证图片居中\n            imageView.frame = CGRect(x: 0, y: imageTopMargin, width: kScreenW, height: imageRealHeight)\n        } else {\n            imageView.frame = CGRect(x: 0, y: 0, width: kScreenW, height: Metric.marginTop + kNavibarH + tableHeaderView.height)\n        }\n        \n        view.addSubview(tableView)\n        view.addSubview(imageView)\n        view.insertSubview(tableView, aboveSubview: imageView)\n        self.tableView = tableView\n        \n        tableView.snp.makeConstraints { (make) in\n            make.left.top.right.bottom.equalToSuperview()\n        }\n        \n        // 设置代理\n        tableView.rx.setDelegate(self).disposed(by: rx.disposeBag)\n        \n        // 注册cell\n        tableView.register(Reusable.settingCell)\n    }\n    \n    // MARK:- 绑定视图\n    func bindUI() {\n        \n        dataSource = RxTableViewSectionedReloadDataSource(configureCell: { (ds, tv, indexPath, item) -> UITableViewCell in\n            if indexPath.row == 0 {\n                // 充当 SectionHeader 占位\n                let placeCell = UITableViewCell()\n                placeCell.backgroundColor = kThemeGainsboroColor\n                return placeCell\n            }\n            let cell = tv.dequeue(Reusable.settingCell, for: indexPath)\n            cell.model = item\n            return cell\n        })\n        \n        vmOutput = viewModel.transform(input: HCSettingViewModel.HCSettingInput(type: .mine))\n        \n        vmOutput?.sections.asDriver().drive(tableView.rx.items(dataSource: dataSource)).disposed(by: rx.disposeBag)\n    }\n}\n\n// MARK:- UITableViewDelegate\nextension HCMineViewController: UITableViewDelegate {\n    \n    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {\n        \n        // 充当 SectionHeader 数据模型\n        if indexPath.row == 0 {\n            return Metric.sectionHeight\n        }\n        return Metric.cellHeight\n    }\n    \n    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {\n        \n        tableView.deselectRow(at: indexPath, animated: true)\n        \n        // 充当 SectionHeader 数据模型\n        if indexPath.row == 0 { return }\n\n        if indexPath.section == 3 && indexPath.row == 2 {\n            self.jump2Setting()\n        } else {\n            self.jump2Setting()\n        }\n    }\n}\n\nprivate let tempScale: CGFloat = 104 / 600\n\n// MARK:- UIScrollView\nextension HCMineViewController {\n    \n    func scrollViewDidScroll(_ scrollView: UIScrollView) {\n        \n        // 调整导航栏背景色渐变\n        let offsetY: CGFloat = scrollView.contentOffset.y\n        HCLog(\" offsetY:\\(offsetY)\")\n        if offsetY < Metric.navbarColorChangePoint {\n            let alpha: CGFloat = max(0, 1 - (Metric.navbarColorChangePoint - offsetY) / kNavibarH)\n            HCLog(\" alpha:\\(alpha)\")\n            self.navigationController?.navigationBar.Mg_setBackgroundColor(backgroundColor: kThemeWhiteColor.withAlphaComponent(alpha))\n        } else {\n            self.navigationController?.navigationBar.Mg_setBackgroundColor(backgroundColor: kThemeWhiteColor.withAlphaComponent(1))\n        }\n        \n        // 缩放图片\n        if (offsetY < 0) {\n            // 减去初始部分\n            let scaleXY = 1  - tempScale + offsetY / (-600)\n            imageView.transform = CGAffineTransform(scaleX: scaleXY, y: scaleXY)\n        }\n    }\n}\n\n// MARK:- 控制器跳转\nextension HCMineViewController {\n    \n    // MARK:- 登录\n    func jump2Login() {\n        \n        let VC = HCBaseNavigationController(rootViewController: HCLoginViewController())\n        self.present(VC, animated: true, completion: nil)\n    }\n    \n    // MARK:- 设置\n    func jump2Setting() {\n        \n        let VC = HCSettingViewController()\n        VC.hidesBottomBarWhenPushed = true\n        if let tabbarVC = self.tabBarController as? HCMainViewController {\n            tabbarVC.isHiddenPlayView(true)\n        }\n        self.navigationController?.pushViewController(VC, animated: true)\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Mine/View/HCMineHeaderView.swift",
    "content": "//\n//  HCMineHeaderView.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/1/8.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nclass HCMineHeaderView: UIView, NibLoadable {\n\n    @IBOutlet weak var loginLab: UILabel!\n    @IBOutlet weak var loginImg: UIImageView!\n    @IBOutlet weak var bottomView: UIView!\n    \n    override func awakeFromNib() {\n        super.awakeFromNib()\n        bottomView.backgroundColor = kThemeGainsboroColor\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Mine/View/HCMineHeaderView.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"13196\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"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=\"13173\"/>\n        <capability name=\"Aspect ratio constraints\" minToolsVersion=\"5.1\"/>\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=\"HCMineHeaderView\" customModule=\"RxXMLY\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"240\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"UjI-P0-H2w\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"150\"/>\n                    <subviews>\n                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"5gb-PN-qqj\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"40\" width=\"375\" height=\"110\"/>\n                            <subviews>\n                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"点击登录\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"xKC-TV-7U4\">\n                                    <rect key=\"frame\" x=\"155\" y=\"50\" width=\"66\" height=\"20\"/>\n                                    <fontDescription key=\"fontDescription\" type=\"boldSystem\" 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=\"1秒登录，专享个性化服务\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"R8L-SL-jrU\">\n                                    <rect key=\"frame\" x=\"112\" y=\"80\" width=\"152\" height=\"16\"/>\n                                    <fontDescription key=\"fontDescription\" type=\"system\" weight=\"thin\" pointSize=\"13\"/>\n                                    <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                    <nil key=\"highlightedColor\"/>\n                                </label>\n                            </subviews>\n                            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            <constraints>\n                                <constraint firstAttribute=\"height\" constant=\"110\" id=\"LYh-6B-i29\"/>\n                                <constraint firstItem=\"xKC-TV-7U4\" firstAttribute=\"top\" secondItem=\"5gb-PN-qqj\" secondAttribute=\"top\" constant=\"50\" id=\"RmF-7a-8LQ\"/>\n                                <constraint firstItem=\"R8L-SL-jrU\" firstAttribute=\"top\" secondItem=\"xKC-TV-7U4\" secondAttribute=\"bottom\" constant=\"10\" id=\"aDK-Or-gSo\"/>\n                                <constraint firstItem=\"R8L-SL-jrU\" firstAttribute=\"centerX\" secondItem=\"5gb-PN-qqj\" secondAttribute=\"centerX\" id=\"me5-zv-4ST\"/>\n                                <constraint firstItem=\"xKC-TV-7U4\" firstAttribute=\"centerX\" secondItem=\"5gb-PN-qqj\" secondAttribute=\"centerX\" id=\"vpt-SB-dw6\"/>\n                            </constraints>\n                        </view>\n                        <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"me\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"mWl-mT-hew\">\n                            <rect key=\"frame\" x=\"147\" y=\"0.0\" width=\"80\" height=\"80\"/>\n                            <constraints>\n                                <constraint firstAttribute=\"height\" constant=\"80\" id=\"a6A-Kt-uB8\"/>\n                                <constraint firstAttribute=\"width\" secondItem=\"mWl-mT-hew\" secondAttribute=\"height\" id=\"wUt-VX-Auo\"/>\n                            </constraints>\n                        </imageView>\n                    </subviews>\n                    <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"calibratedWhite\"/>\n                    <constraints>\n                        <constraint firstItem=\"5gb-PN-qqj\" firstAttribute=\"top\" secondItem=\"UjI-P0-H2w\" secondAttribute=\"top\" constant=\"40\" id=\"02I-Bt-lU8\"/>\n                        <constraint firstItem=\"5gb-PN-qqj\" firstAttribute=\"leading\" secondItem=\"UjI-P0-H2w\" secondAttribute=\"leading\" id=\"237-nk-6em\"/>\n                        <constraint firstItem=\"mWl-mT-hew\" firstAttribute=\"top\" secondItem=\"UjI-P0-H2w\" secondAttribute=\"top\" id=\"RRg-ok-8E3\"/>\n                        <constraint firstAttribute=\"trailing\" secondItem=\"5gb-PN-qqj\" secondAttribute=\"trailing\" id=\"WTp-gn-cZr\"/>\n                        <constraint firstItem=\"mWl-mT-hew\" firstAttribute=\"centerX\" secondItem=\"UjI-P0-H2w\" secondAttribute=\"centerX\" id=\"d0A-z5-3Pd\"/>\n                        <constraint firstAttribute=\"bottom\" secondItem=\"5gb-PN-qqj\" secondAttribute=\"bottom\" id=\"qZ1-Gr-rAh\"/>\n                    </constraints>\n                </view>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3iJ-h1-dWO\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"150\" width=\"375\" height=\"90\"/>\n                    <subviews>\n                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ahb-bS-nIt\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"10\" width=\"375\" height=\"80\"/>\n                            <subviews>\n                                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"DP7-Ty-XM2\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"15\" width=\"94\" height=\"50\"/>\n                                    <subviews>\n                                        <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"me_setting_achievement\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3iY-tJ-jh2\">\n                                            <rect key=\"frame\" x=\"32.5\" y=\"5\" width=\"30\" height=\"30\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"width\" secondItem=\"3iY-tJ-jh2\" secondAttribute=\"height\" id=\"O2j-7B-Z1h\"/>\n                                                <constraint firstAttribute=\"width\" constant=\"30\" id=\"yV6-Ok-pDu\"/>\n                                            </constraints>\n                                        </imageView>\n                                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"喜点\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"b67-rw-NH6\">\n                                            <rect key=\"frame\" x=\"35.5\" y=\"40\" width=\"23\" height=\"14\"/>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" weight=\"thin\" pointSize=\"11\"/>\n                                            <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                            <nil key=\"highlightedColor\"/>\n                                        </label>\n                                    </subviews>\n                                    <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                    <constraints>\n                                        <constraint firstItem=\"3iY-tJ-jh2\" firstAttribute=\"centerY\" secondItem=\"DP7-Ty-XM2\" secondAttribute=\"centerY\" constant=\"-5\" id=\"0G1-xe-Oo1\"/>\n                                        <constraint firstItem=\"3iY-tJ-jh2\" firstAttribute=\"centerX\" secondItem=\"DP7-Ty-XM2\" secondAttribute=\"centerX\" id=\"8me-cv-YoB\"/>\n                                        <constraint firstItem=\"b67-rw-NH6\" firstAttribute=\"top\" secondItem=\"3iY-tJ-jh2\" secondAttribute=\"bottom\" constant=\"5\" id=\"ZWe-Va-FOv\"/>\n                                        <constraint firstItem=\"b67-rw-NH6\" firstAttribute=\"centerX\" secondItem=\"DP7-Ty-XM2\" secondAttribute=\"centerX\" id=\"uO2-6r-HCG\"/>\n                                    </constraints>\n                                </view>\n                                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"FFJ-2I-Cm7\">\n                                    <rect key=\"frame\" x=\"94\" y=\"15\" width=\"93.5\" height=\"50\"/>\n                                    <subviews>\n                                        <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"me_setting_boughttracks\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"bn9-T5-1Ay\">\n                                            <rect key=\"frame\" x=\"31\" y=\"5\" width=\"30\" height=\"30\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"width\" secondItem=\"bn9-T5-1Ay\" secondAttribute=\"height\" id=\"1VE-hf-LC9\"/>\n                                                <constraint firstAttribute=\"width\" constant=\"30\" id=\"moM-Yl-TY2\"/>\n                                            </constraints>\n                                        </imageView>\n                                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"喜点\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"eoJ-BU-WgP\">\n                                            <rect key=\"frame\" x=\"35.5\" y=\"40\" width=\"23\" height=\"14\"/>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" weight=\"thin\" pointSize=\"11\"/>\n                                            <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                            <nil key=\"highlightedColor\"/>\n                                        </label>\n                                    </subviews>\n                                    <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                    <constraints>\n                                        <constraint firstItem=\"bn9-T5-1Ay\" firstAttribute=\"centerX\" secondItem=\"FFJ-2I-Cm7\" secondAttribute=\"centerX\" id=\"3h3-ur-PdL\"/>\n                                        <constraint firstItem=\"bn9-T5-1Ay\" firstAttribute=\"centerY\" secondItem=\"FFJ-2I-Cm7\" secondAttribute=\"centerY\" constant=\"-5\" id=\"3uP-aU-2tB\"/>\n                                        <constraint firstItem=\"eoJ-BU-WgP\" firstAttribute=\"top\" secondItem=\"bn9-T5-1Ay\" secondAttribute=\"bottom\" constant=\"5\" id=\"r5J-L2-Ku9\"/>\n                                        <constraint firstItem=\"eoJ-BU-WgP\" firstAttribute=\"centerX\" secondItem=\"FFJ-2I-Cm7\" secondAttribute=\"centerX\" id=\"wo7-U7-pvK\"/>\n                                    </constraints>\n                                </view>\n                                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"GCa-df-5RS\">\n                                    <rect key=\"frame\" x=\"187.5\" y=\"15\" width=\"94\" height=\"50\"/>\n                                    <subviews>\n                                        <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"me_setting_beAnchor\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"vbh-mk-BDd\">\n                                            <rect key=\"frame\" x=\"32.5\" y=\"5\" width=\"30\" height=\"30\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"width\" constant=\"30\" id=\"Hye-9T-IM3\"/>\n                                                <constraint firstAttribute=\"width\" secondItem=\"vbh-mk-BDd\" secondAttribute=\"height\" id=\"oD8-Fp-oJ6\"/>\n                                            </constraints>\n                                        </imageView>\n                                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"喜点\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"E0E-uV-Wj2\">\n                                            <rect key=\"frame\" x=\"35.5\" y=\"40\" width=\"23\" height=\"14\"/>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" weight=\"thin\" pointSize=\"11\"/>\n                                            <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                            <nil key=\"highlightedColor\"/>\n                                        </label>\n                                    </subviews>\n                                    <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                    <constraints>\n                                        <constraint firstItem=\"vbh-mk-BDd\" firstAttribute=\"centerY\" secondItem=\"GCa-df-5RS\" secondAttribute=\"centerY\" constant=\"-5\" id=\"B4b-cF-PPL\"/>\n                                        <constraint firstItem=\"E0E-uV-Wj2\" firstAttribute=\"top\" secondItem=\"vbh-mk-BDd\" secondAttribute=\"bottom\" constant=\"5\" id=\"InA-YX-bFD\"/>\n                                        <constraint firstItem=\"E0E-uV-Wj2\" firstAttribute=\"centerX\" secondItem=\"GCa-df-5RS\" secondAttribute=\"centerX\" id=\"lQ5-ZC-ec8\"/>\n                                        <constraint firstItem=\"vbh-mk-BDd\" firstAttribute=\"centerX\" secondItem=\"GCa-df-5RS\" secondAttribute=\"centerX\" id=\"yQc-o2-UdK\"/>\n                                    </constraints>\n                                </view>\n                                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"sCO-9H-yIx\">\n                                    <rect key=\"frame\" x=\"281.5\" y=\"15\" width=\"93.5\" height=\"50\"/>\n                                    <subviews>\n                                        <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"me_setting_account\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"SHd-zF-22y\">\n                                            <rect key=\"frame\" x=\"31\" y=\"5\" width=\"30\" height=\"30\"/>\n                                            <constraints>\n                                                <constraint firstAttribute=\"width\" secondItem=\"SHd-zF-22y\" secondAttribute=\"height\" id=\"19G-1v-wee\"/>\n                                                <constraint firstAttribute=\"width\" constant=\"30\" id=\"B9t-3o-4eI\"/>\n                                            </constraints>\n                                        </imageView>\n                                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"喜点\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Gac-Kr-utM\">\n                                            <rect key=\"frame\" x=\"35.5\" y=\"40\" width=\"23\" height=\"14\"/>\n                                            <fontDescription key=\"fontDescription\" type=\"system\" weight=\"thin\" pointSize=\"11\"/>\n                                            <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                            <nil key=\"highlightedColor\"/>\n                                        </label>\n                                    </subviews>\n                                    <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                    <constraints>\n                                        <constraint firstItem=\"SHd-zF-22y\" firstAttribute=\"centerX\" secondItem=\"sCO-9H-yIx\" secondAttribute=\"centerX\" id=\"86D-Yp-eft\"/>\n                                        <constraint firstItem=\"Gac-Kr-utM\" firstAttribute=\"top\" secondItem=\"SHd-zF-22y\" secondAttribute=\"bottom\" constant=\"5\" id=\"M3k-1v-Xoa\"/>\n                                        <constraint firstItem=\"Gac-Kr-utM\" firstAttribute=\"centerX\" secondItem=\"sCO-9H-yIx\" secondAttribute=\"centerX\" id=\"aTh-nD-SHF\"/>\n                                        <constraint firstItem=\"SHd-zF-22y\" firstAttribute=\"centerY\" secondItem=\"sCO-9H-yIx\" secondAttribute=\"centerY\" constant=\"-5\" id=\"lJt-Wy-ERu\"/>\n                                    </constraints>\n                                </view>\n                            </subviews>\n                            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            <constraints>\n                                <constraint firstItem=\"sCO-9H-yIx\" firstAttribute=\"centerY\" secondItem=\"DP7-Ty-XM2\" secondAttribute=\"centerY\" id=\"0uA-AP-jU8\"/>\n                                <constraint firstItem=\"sCO-9H-yIx\" firstAttribute=\"width\" secondItem=\"DP7-Ty-XM2\" secondAttribute=\"width\" id=\"8AN-bw-pD4\"/>\n                                <constraint firstItem=\"FFJ-2I-Cm7\" firstAttribute=\"height\" secondItem=\"DP7-Ty-XM2\" secondAttribute=\"height\" id=\"8sx-fD-J71\"/>\n                                <constraint firstItem=\"sCO-9H-yIx\" firstAttribute=\"height\" secondItem=\"DP7-Ty-XM2\" secondAttribute=\"height\" id=\"Gew-Bz-fg4\"/>\n                                <constraint firstItem=\"sCO-9H-yIx\" firstAttribute=\"leading\" secondItem=\"GCa-df-5RS\" secondAttribute=\"trailing\" id=\"Uj5-aX-bpp\"/>\n                                <constraint firstItem=\"DP7-Ty-XM2\" firstAttribute=\"top\" secondItem=\"ahb-bS-nIt\" secondAttribute=\"top\" constant=\"15\" id=\"Vr8-Pr-bj8\"/>\n                                <constraint firstItem=\"DP7-Ty-XM2\" firstAttribute=\"leading\" secondItem=\"ahb-bS-nIt\" secondAttribute=\"leading\" id=\"YJ4-46-P7h\"/>\n                                <constraint firstItem=\"GCa-df-5RS\" firstAttribute=\"leading\" secondItem=\"FFJ-2I-Cm7\" secondAttribute=\"trailing\" id=\"fSN-5d-IT8\"/>\n                                <constraint firstItem=\"GCa-df-5RS\" firstAttribute=\"height\" secondItem=\"DP7-Ty-XM2\" secondAttribute=\"height\" id=\"k2u-FD-7Tw\"/>\n                                <constraint firstAttribute=\"trailing\" secondItem=\"sCO-9H-yIx\" secondAttribute=\"trailing\" id=\"kZY-MO-2UI\"/>\n                                <constraint firstItem=\"FFJ-2I-Cm7\" firstAttribute=\"centerY\" secondItem=\"DP7-Ty-XM2\" secondAttribute=\"centerY\" id=\"nTg-z7-HyU\"/>\n                                <constraint firstItem=\"FFJ-2I-Cm7\" firstAttribute=\"leading\" secondItem=\"DP7-Ty-XM2\" secondAttribute=\"trailing\" id=\"wXG-S7-lkY\"/>\n                                <constraint firstItem=\"GCa-df-5RS\" firstAttribute=\"centerY\" secondItem=\"DP7-Ty-XM2\" secondAttribute=\"centerY\" id=\"x2e-lq-fSo\"/>\n                                <constraint firstItem=\"GCa-df-5RS\" firstAttribute=\"width\" secondItem=\"DP7-Ty-XM2\" secondAttribute=\"width\" id=\"xlQ-b8-uBW\"/>\n                                <constraint firstItem=\"FFJ-2I-Cm7\" firstAttribute=\"width\" secondItem=\"DP7-Ty-XM2\" secondAttribute=\"width\" id=\"y8C-yM-DFT\"/>\n                                <constraint firstItem=\"DP7-Ty-XM2\" firstAttribute=\"centerY\" secondItem=\"ahb-bS-nIt\" secondAttribute=\"centerY\" id=\"zWK-Q4-Sjp\"/>\n                            </constraints>\n                        </view>\n                    </subviews>\n                    <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"calibratedWhite\"/>\n                    <constraints>\n                        <constraint firstAttribute=\"bottom\" secondItem=\"ahb-bS-nIt\" secondAttribute=\"bottom\" id=\"0ik-bH-tV8\"/>\n                        <constraint firstItem=\"ahb-bS-nIt\" firstAttribute=\"top\" secondItem=\"3iJ-h1-dWO\" secondAttribute=\"top\" constant=\"10\" id=\"7QO-g5-cDW\"/>\n                        <constraint firstItem=\"ahb-bS-nIt\" firstAttribute=\"leading\" secondItem=\"3iJ-h1-dWO\" secondAttribute=\"leading\" id=\"FrR-ql-ioH\"/>\n                        <constraint firstAttribute=\"trailing\" secondItem=\"ahb-bS-nIt\" secondAttribute=\"trailing\" id=\"UO1-I0-OBo\"/>\n                    </constraints>\n                </view>\n            </subviews>\n            <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"calibratedWhite\"/>\n            <constraints>\n                <constraint firstItem=\"UjI-P0-H2w\" firstAttribute=\"top\" secondItem=\"iN0-l3-epB\" secondAttribute=\"top\" id=\"29Y-2X-eRN\"/>\n                <constraint firstItem=\"3iJ-h1-dWO\" firstAttribute=\"top\" secondItem=\"UjI-P0-H2w\" secondAttribute=\"bottom\" id=\"SZO-qA-3lQ\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"UjI-P0-H2w\" secondAttribute=\"trailing\" id=\"UIE-Kg-11o\"/>\n                <constraint firstItem=\"UjI-P0-H2w\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" id=\"cee-to-Kyl\"/>\n                <constraint firstItem=\"3iJ-h1-dWO\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" id=\"kQc-Ae-u15\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"3iJ-h1-dWO\" secondAttribute=\"bottom\" id=\"oBn-gC-BhM\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"3iJ-h1-dWO\" secondAttribute=\"trailing\" id=\"sz0-KB-aqE\"/>\n            </constraints>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <connections>\n                <outlet property=\"bottomView\" destination=\"3iJ-h1-dWO\" id=\"tiR-uF-fdO\"/>\n                <outlet property=\"loginImg\" destination=\"mWl-mT-hew\" id=\"EqC-7z-OOD\"/>\n                <outlet property=\"loginLab\" destination=\"xKC-TV-7U4\" id=\"yO6-I2-ux2\"/>\n            </connections>\n        </view>\n    </objects>\n    <resources>\n        <image name=\"me\" width=\"70\" height=\"70\"/>\n        <image name=\"me_setting_account\" width=\"25\" height=\"25\"/>\n        <image name=\"me_setting_achievement\" width=\"24\" height=\"24\"/>\n        <image name=\"me_setting_beAnchor\" width=\"24\" height=\"24\"/>\n        <image name=\"me_setting_boughttracks\" width=\"25\" height=\"25\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Mine/View/HCMineNavigationBar.swift",
    "content": "//\n//  HCMineNavigationBar.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/16.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\n// MARK:- 常量\nfileprivate struct Metric {\n        \n    static let homeBarWidth: CGFloat = kScreenW\n    static let homeBarHeight: CGFloat = 44.0\n}\n\nclass HCMineNavigationBar: UIView {\n    \n    private var mineAnchorsBackgroundView: UIView?\n    \n    typealias AddBlock = (_ model: HCNavigationBarItemModel)->Void;\n    var itemClicked: AddBlock? = { (_) in\n        return\n    }\n    \n    \n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        \n        initMineNavigationBar()\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n    \n    override func layoutSubviews() {\n        super.layoutSubviews()\n        \n        // 此处必须指定一个大小\n        self.snp.makeConstraints { (make) in\n            make.width.equalTo(Metric.homeBarWidth)\n            make.height.equalTo(Metric.homeBarHeight)\n        }\n        \n        // 剪切圆角 (放在 HCMineAnchorsable 剪切失效，视图未创建 )\n        let corners: UIRectCorner = [.bottomLeft,.topLeft]\n        mineAnchorsBackgroundView?.clipCorner(direction: corners, radius: 14)\n        mineAnchorsBackgroundView?.alpha = 0.35\n    }\n}\n\nextension HCMineNavigationBar: HCMineAnchorsable, HCNavUniversalable {\n    \n    // MARK:- 初始化 我的 导航栏组件\n    func initMineNavigationBar() {\n        \n        // 消息按钮\n        let message = self.universal(model: HCNavigationBarItemMetric.meMessage) { [weak self]  (model) in\n            \n            guard let `self` = self else { return }\n            self.itemClicked!(model)\n            HCLog(model.description)\n        }\n        \n        // 设置\n        let setting = self.universal(model: HCNavigationBarItemMetric.setting) { [weak self]  (model) in\n            \n            guard let `self` = self else { return }\n            self.itemClicked!(model)\n            HCLog(model.description)\n        }\n        \n        // 主播工作台\n        let (mineAnchors, backgroundView) = self.mineAnchors(model: HCNavigationBarItemMetric.mineAnchors) { [weak self] (model) in\n            \n            guard let `self` = self else { return }\n            self.itemClicked!(model)\n            HCLog(model.description)\n        }\n        self.mineAnchorsBackgroundView = backgroundView\n        \n        // 布局\n        message.snp.makeConstraints { (make) in\n            make.centerY.equalToSuperview()\n            make.left.equalToSuperview()\n        }\n        \n        setting.snp.makeConstraints { (make) in\n            make.centerY.equalToSuperview()\n            make.left.equalTo(message.snp.right).offset(MetricGlobal.margin)\n        }\n        \n        mineAnchors.snp.makeConstraints { (make) in\n            make.centerY.equalToSuperview()\n            make.right.equalToSuperview()\n        }\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/HCPlayViewController.swift",
    "content": "//\n//  HCPlayViewController.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/1/23.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport NSObject_Rx\nimport RxDataSources\nimport ReusableKit\nimport Then\nimport RxGesture\n\n// MARK:- 复用\nprivate enum Reusable {\n    \n    static let playAlbumCell = ReusableCell<HCPlayAlbumCell>(nibName: \"HCPlayAlbumCell\")\n    static let playSynopsisCell = ReusableCell<HCPlaySynopsisCell>(nibName: \"HCPlaySynopsisCell\")\n    static let playRecommendHeaderCell = ReusableCell<HCPlayRecommendHeaderCell>(nibName: \"HCPlayRecommendHeaderCell\")\n    static let playRecommendCell = ReusableCell<HCPlayRecommendCell>(nibName: \"HCPlayRecommendCell\")\n    static let playRecommendFooterCell = ReusableCell<HCPlayRecommendFooterCell>(nibName: \"HCPlayRecommendFooterCell\")\n    static let playUserInfoCell = ReusableCell<HCPlayUserInfoCell>(nibName: \"HCPlayUserInfoCell\")\n}\n\n// MARK:- 常量\nfileprivate struct Metric {\n    \n    static let sectionHeight: CGFloat = 10.0\n    \n    static let changeColorPoint: CGFloat = 100.0 // 调整顶部背景图片位置\n}\n\nclass HCPlayViewController: HCBaseViewController {\n\n    // viewModel\n    private var viewModel = HCPlayViewModel()\n    private var vmOutput: HCPlayViewModel.HCPlayOutput?\n    \n    // View\n    private var tableView: UITableView!\n    private var playSynopsisCell: HCPlaySynopsisCell?\n    private var headerView: HCPlayHeaderView?\n    private var titleView: HCPlayTitleView?\n\n    // DataSuorce\n    var dataSource : RxTableViewSectionedReloadDataSource<HCPlaySection>!\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        initEnableMudule()\n        initUI()\n        bindUI()\n        // 初始化 播放状态\n        if let isPlay = mainViewController?.playView.isPlay.value {\n            updatePlayStatus(isPlay: isPlay)\n        }\n    }\n    \n    override func viewWillAppear(_ animated: Bool) {\n        super.viewWillAppear(animated)\n        \n        self.scrollViewDidScroll(tableView)\n\n        if let tabbarVC = self.tabBarController as? HCMainViewController {\n            tabbarVC.isHiddenPlayView(false)\n        }\n        \n        if let navigationBar = self.navigationController?.navigationBar {\n            view.insertSubview(navigationBar, aboveSubview: tableView)\n        }\n    }\n    \n    override func viewDidDisappear(_ animated: Bool) {\n        super.viewDidDisappear(animated)\n    }    \n}\n\n// MARK:- 初始化协议\nextension HCPlayViewController: HCNavBackable, HCNavUniversalable {\n    \n    // MARK:- 协议组件\n    private func initEnableMudule() {\n        \n        // 登录页面 返回、注册\n        let models = [HCNavigationBarItemMetric.downBack,\n                      HCNavigationBarItemMetric.share,\n                      HCNavigationBarItemMetric.more]\n        self.universals(modelArr: models) { [weak self] (model) in\n            guard let `self` = self else { return }\n            HCLog(model.description)\n            let type = model.type\n            switch type {\n            case .back:\n                self.navigationController?.dismiss(animated: true, completion: nil)\n                break\n            default: break\n            }\n        }\n        \n        // 设置 样式\n        self.navigationItem.rightBarButtonItem?.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: kThemeTomatoColor], for: .normal)\n    }\n}\n\n// MARK:- 初始化部分\nextension HCPlayViewController {\n    \n    // MARK:- 更新 播放状态\n    private func updatePlayStatus(isPlay: Bool) {\n        \n        // 需要更新状态\n        if let beel = self.headerView?.isPlay.value, beel != isPlay {\n            // 更新 头部按钮 播放状态\n            self.headerView?.isPlay.value = isPlay\n        }\n        \n        // 需要更新状态\n        if let beel = self.titleView?.isPlay.value, beel != isPlay {\n            // 更新 标题 播放状态\n            self.titleView?.isPlay.value = isPlay\n        }\n        \n        // 需要更新状态\n        if let beel = mainViewController?.playView.isPlay.value, beel != isPlay {\n            // 更新 标题 播放状态\n            mainViewController?.playView.isPlay.value = isPlay\n        }\n    }\n    \n    // MARK:- 初始化视图\n    private func initUI() {\n        \n        // TitleView\n        let titleView = HCPlayTitleView.loadFromNib()\n        titleView.playBtnClickedBlock = { [weak self] (isPlay) in\n            \n            guard let `self` = self else { return }\n            self.updatePlayStatus(isPlay: isPlay)\n        }\n        titleView.isHidden = true\n        self.titleView = titleView\n        self.navigationController?.navigationBar.addSubview(titleView)\n        titleView.snp.makeConstraints { (make) in\n            make.width.equalTo(titleView.width)\n            make.height.equalTo(titleView.height)\n            make.center.equalToSuperview()\n        }\n        \n        // TableView\n        let tableView = UITableView(frame: .zero, style: .plain)\n        tableView.backgroundColor = kThemeGainsboroColor\n        tableView.separatorStyle = .none\n        \n        let headerView = HCPlayHeaderView.loadFromNib()\n        headerView.playBtnClickedBlock = { [weak self] (isPlay) in\n            \n            guard let `self` = self else { return }\n            self.updatePlayStatus(isPlay: isPlay)\n        }\n        self.headerView = headerView\n        headerView.frame = CGRect(x: 0, y: kNavibarH, width: headerView.width, height: headerView.height)\n        let tableHeaderView = UIView()\n        tableHeaderView.backgroundColor = kThemeWhiteColor\n        tableHeaderView.frame = CGRect(x: 0, y: 0, width: headerView.width, height: headerView.height + kNavibarH)\n        tableHeaderView.addSubview(headerView)\n        tableView.tableHeaderView = tableHeaderView\n        tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: 60.0))\n        // 调整视图范围\n        tableView.contentInset = UIEdgeInsetsMake(-kNavibarH, 0, 0, 0)\n        // 调整滚动条范围\n        tableView.scrollIndicatorInsets = UIEdgeInsetsMake(-kNavibarH, 0, 0, 0)\n\n        view.addSubview(tableView)\n        self.tableView = tableView\n        \n        tableView.snp.makeConstraints { (make) in\n            make.left.top.right.bottom.equalToSuperview()\n        }\n        \n        // 设置代理\n        tableView.rx.setDelegate(self).disposed(by: rx.disposeBag)\n        \n        // 注册cell\n        tableView.register(Reusable.playAlbumCell)\n        tableView.register(Reusable.playSynopsisCell)\n        tableView.register(Reusable.playRecommendHeaderCell)\n        tableView.register(Reusable.playRecommendCell)\n        tableView.register(Reusable.playRecommendFooterCell)\n        tableView.register(Reusable.playUserInfoCell)\n    }\n    \n    // MARK:- 绑定视图\n    func bindUI() {\n\n        dataSource = RxTableViewSectionedReloadDataSource(configureCell: { [weak self] (ds, tv, indexPath, item) -> UITableViewCell in\n            \n            guard let `self` = self else { return UITableViewCell.init() }\n            \n            let dsSection = ds[indexPath.section]\n            \n            if indexPath.row == 0 {\n                // 充当 SectionHeader 占位\n                let placeCell = UITableViewCell()\n                placeCell.selectionStyle = .none\n                placeCell.backgroundColor = kThemeGainsboroColor\n                return placeCell\n            }\n            else if indexPath.section == 0 &&  indexPath.row == 1 {\n                \n                let cell = tv.dequeue(Reusable.playAlbumCell, for: indexPath)\n                cell.selectionStyle = .none\n                cell.playModel.value = dsSection.playModel\n                return cell\n            }\n            else if indexPath.section == 0 && indexPath.row == 2 {\n                \n                let cell = tv.dequeue(Reusable.playSynopsisCell, for: indexPath)\n                cell.selectionStyle = .none\n                // 更新UI\n                cell.updatelUI = { [weak self] in\n                    guard let `self` = self else { return }\n                    self.tableView.reloadData()\n                }\n                cell.playModel.value = dsSection.playModel\n                self.playSynopsisCell = cell\n                return cell\n            }\n            else if indexPath.section == 1 && indexPath.row == 1 {\n               \n                let cell = tv.dequeue(Reusable.playRecommendHeaderCell, for: indexPath)\n                cell.selectionStyle = .none\n                cell.playModel.value = dsSection.playModel\n                return cell\n            }\n                // 相关推荐 部分\n            else if indexPath.section == 1 && indexPath.row == 2 {\n                \n                let cell = tv.dequeue(Reusable.playRecommendCell, for: indexPath)\n                cell.selectionStyle = .none\n                cell.albumsInfoModel.value = dsSection.playModel?.noCacheInfo?.associationAlbumsInfo?.first\n                return cell\n            }\n            else if indexPath.section == 1 && indexPath.row == 3 {\n                \n                let cell = tv.dequeue(Reusable.playRecommendFooterCell, for: indexPath)\n                cell.selectionStyle = .none\n                return cell\n            }\n                // 主播介绍 部分\n            else if indexPath.section == 2 && indexPath.row == 1 {\n                \n                let cell = tv.dequeue(Reusable.playUserInfoCell, for: indexPath)\n                cell.selectionStyle = .none\n                cell.userInfoModel.value = dsSection.playModel?.userInfo\n                return cell\n            }\n\n            return UITableViewCell()\n            \n            }, titleForHeaderInSection: { [weak self] (ds, section) -> String? in\n                \n                let dsSection = ds[section]\n                guard let `self` = self else { return nil }\n                self.headerView?.playModel.value = dsSection.playModel\n                return nil\n        })\n        \n        vmOutput = viewModel.transform(input: HCPlayViewModel.HCPlayInput())\n        vmOutput?.requestCommand.onNext(true)\n        vmOutput?.sections.asDriver().drive(tableView.rx.items(dataSource: dataSource)).disposed(by: rx.disposeBag)\n    }\n}\n\n// MARK:- UITableViewDelegate\nextension HCPlayViewController: UITableViewDelegate {\n    \n    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {\n        \n        // 充当 SectionHeader 数据模型\n        if indexPath.row == 0 {\n            \n            return Metric.sectionHeight\n        }\n        else if indexPath.section == 0 && indexPath.row == 1 {\n            \n            return HCPlayAlbumCell.cellHeight()\n        }\n        else if indexPath.section == 0 &&  indexPath.row == 2 {\n            \n            if let cellHeight = playSynopsisCell?.cellHeight() {\n                \n                return cellHeight\n            }\n            return HCPlaySynopsisCell.cellHeight()\n        }\n        else if indexPath.section == 1 &&  indexPath.row == 1 {\n            \n            return HCPlayRecommendHeaderCell.defaultCellHeight()\n        }\n        else if indexPath.section == 1 &&  indexPath.row == 2 {\n            \n            return HCPlayRecommendCell.cellHeight()\n        }\n        else if indexPath.section == 1 &&  indexPath.row == 3 {\n            \n            return HCPlayRecommendFooterCell.cellHeight()\n        }\n        else if indexPath.section == 2 &&  indexPath.row == 1 {\n            \n            return HCPlayUserInfoCell.cellHeight()\n        }\n\n        return HCPlayAlbumCell.cellHeight()\n    }\n    \n    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {\n        \n        tableView.deselectRow(at: indexPath, animated: true)\n        \n        // 充当 SectionHeader 数据模型\n        if indexPath.row == 0 { return }\n    }\n}\n\n// MARK:- UIScrollView\nextension HCPlayViewController {\n    \n    func scrollViewDidScroll(_ scrollView: UIScrollView) {\n        \n        // 调整导航栏背景色渐变\n        let offsetY: CGFloat = scrollView.contentOffset.y\n        HCLog(\" offsetY:\\(offsetY)\")\n        \n        if offsetY > Metric.changeColorPoint {\n            \n            let alpha: CGFloat = min(1, (offsetY - Metric.changeColorPoint) / Metric.changeColorPoint)\n            HCLog(\" alpha:\\(alpha)\")\n            \n            // 不透明才显示标题栏\n            if alpha >= 1 {\n                self.titleView?.isHidden = false\n            } else {\n                self.titleView?.isHidden = true\n            }\n            \n            // 改变导航栏背景色\n            let changeColor = kThemeWhiteColor.withAlphaComponent(alpha)\n            \n            self.navigationController?.navigationBar.backgroundColor = changeColor\n            self.navigationController?.navigationBar.barTintColor = changeColor\n            self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)\n            self.navigationController?.navigationBar.Mg_setBackgroundColor(backgroundColor: changeColor)\n\n        } else {\n            self.navigationController?.navigationBar.Mg_setBackgroundColor(backgroundColor: kThemeWhiteColor.withAlphaComponent(0))\n        }\n    }\n}\n\n// MARK:- 控制器跳转\nextension HCPlayViewController {\n    \n    // MARK:- 登录\n    func jump2Login() {\n        \n        let VC = HCBaseNavigationController(rootViewController: HCLoginViewController())\n        self.present(VC, animated: true, completion: nil)\n    }\n    \n    // MARK:- 设置\n    func jump2Setting() {\n        \n        let VC = HCSettingViewController()\n        VC.hidesBottomBarWhenPushed = true\n        if let tabbarVC = self.tabBarController as? HCMainViewController {\n            tabbarVC.isHiddenPlayView(true)\n        }\n        self.navigationController?.pushViewController(VC, animated: true)\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/Model/HCAlbumInfoModel.swift",
    "content": "//\n//  HCAlbumInfoModel.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/2/4.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport Foundation\nimport ObjectMapper\n\n/*\n \n albumId : 9996644\n canInviteListen : true\n canShareAndStealListen : true\n categoryId : 8\n coverLarge : \"http://fdfs.xmcdn.com/group19/M03/D0/0D/wKgJK1mUGpDhtaU9AAJ-8Z3LCyo849_mobile_large.jpg\"\n coverMiddle : \"http://fdfs.xmcdn.com/group19/M03/D0/0D/wKgJK1mUGpDhtaU9AAJ-8Z3LCyo849_mobile_meduim.jpg\"\n coverOrigin : \"http://fdfs.xmcdn.com/group19/M03/D0/0D/wKgJK1mUGpDhtaU9AAJ-8Z3LCyo849.jpg\"\n coverSmall : \"http://fdfs.xmcdn.com/group19/M03/D0/0D/wKgJK1mUGpDhtaU9AAJ-8Z3LCyo849_mobile_small.jpg\"\n coverWebLarge : \"http://fdfs.xmcdn.com/group19/M03/D0/0D/wKgJK1mUGpDhtaU9AAJ-8Z3LCyo849_web_large.jpg\"\n createdAt : 1502879298000\n discountedPrice : 180\n displayDiscountedPrice : \"180.00喜点\"\n displayPrice : \"180.00喜点\"\n displayVipPrice : \"171.00喜点\"\n hasNew : true\n intro : \"冯仑，柳传志，雷军，梁文道强烈推荐 每天5分钟，听吴晓波唤醒你的商业智慧 世界如此喧嚣，真相何其稀少，你需要《每天听见吴晓波》，每天五分钟的商业日课，吴晓波为你分析当前的经济形势，评说时下的财经热点，告诉你那些使他大受启发的经典书籍。\"\n isAlbumOpenGift : false\n isAuthorized : false\n isDraft : false\n isFavorite : false\n isPaid : true\n isVipFree : false\n paidVoiceAlertTemplate\n price : 180\n priceTypeEnum : 2\n priceTypeId : 2\n priceUnit : \"喜点\"\n refundSupportType : 0\n saleScope : 0\n serializeStatus : 1\n status : 1\n tags : \"吴晓波,腾讯传,财经,房地产,互联网,经济,商业,吴晓波频道,每天听见吴晓波,马云,创业\"\n title : \"每天听见吴晓波·第二季\"\n uid : 12495477\n updatedAt : 1517528176000\n vipPrice : 171\n \n */\n\nstruct HCAlbumInfoModel: Mappable {\n\n    init?(map: Map) {\n        \n    }\n    \n    mutating func mapping(map: Map) {\n        \n        albumId <- map[\"albumId\"]\n        intro <- map[\"intro\"]\n        tags <- map[\"tags\"]\n        title <- map[\"title\"]\n        coverLarge <- map[\"coverLarge\"]\n    }\n    \n    var albumId: UInt32 = 0\n    var intro = \"\"\n    var tags = \"\"\n    var title = \"\"\n    var coverLarge = \"\"\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/Model/HCAssociationAlbumsInfoModel.swift",
    "content": "//\n//  HCAssociationAlbumsInfoModel.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/2/6.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\n/*\n \n albumId : 4633831\n coverMiddle : \"http://fdfs.xmcdn.com/group26/M03/24/99/wKgJWFjKkOfhtj-SAAFdYJM1p44447_mobile_small.jpg\"\n coverSmall : \"http://fdfs.xmcdn.com/group26/M03/24/99/wKgJWFjKkOfhtj-SAAFdYJM1p44447_mobile_small.jpg\"\n discountedPrice : 180\n displayDiscountedPrice : \"180.00喜点\"\n displayPrice : \"180.00喜点\"\n displayVipPrice : \"171.00喜点\"\n intro : \"此专辑《每天听见吴晓波2016-2017》已经完更\"\n isDraft : false\n isPaid : true\n isVipFree : false\n price : 180\n priceTypeEnum : 2\n priceTypeId : 2\n priceUnit : \"喜点\"\n recSrc : \"MAIN\"\n recTrack : \"ItemG.5\"\n refundSupportType : 0\n title : \"每天听见吴晓波·第一季\"\n uid : 12495477\n updatedAt : 1517463574000\n vipPrice : 171\n \n */\n\nimport Foundation\nimport ObjectMapper\n\nstruct HCAssociationAlbumsInfoModel: Mappable {\n\n    init?(map: Map) {\n        \n    }\n    \n    mutating func mapping(map: Map) {\n        \n        albumId <- map[\"albumId\"]\n        coverMiddle <- map[\"coverMiddle\"]\n        displayDiscountedPrice <- map[\"displayDiscountedPrice\"]\n        intro <- map[\"intro\"]\n        title <- map[\"title\"]\n        \n        updatedAt <- map[\"updatedAt\"]\n        discountedPrice <- map[\"discountedPrice\"]\n        uid <- map[\"uid\"]\n        isVipFree <- map[\"isVipFree\"]\n        isPaid <- map[\"isPaid\"]\n    }\n    \n    var albumId: UInt32 = 0\n    var coverMiddle = \"\"\n    var displayDiscountedPrice = \"\"\n    var intro = \"\"\n    var title = \"\"\n    \n    var updatedAt: UInt32 = 0\n    var discountedPrice: CGFloat = 0\n    var uid: UInt32 = 0\n    var isVipFree: Bool = false\n    var isPaid: Bool = false\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/Model/HCNoCacheInfoModel.swift",
    "content": "//\n//  HCNoCacheInfoModel.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/2/4.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport Foundation\nimport ObjectMapper\n\n/*\n \n countInfo\n associationAlbumsInfo\n groupInfo\n otherInfo\n recAlbumsPanelTitle : \"购买过本专辑的人也喜欢\"\n authorizeInfo\n commentInfo\n giftTopUsersInfo\n \n */\n\nstruct HCNoCacheInfoModel: Mappable {\n\n    init?(map: Map) {\n        \n    }\n    \n    mutating func mapping(map: Map) {\n        \n        recAlbumsPanelTitle <- map[\"recAlbumsPanelTitle\"]\n        countInfo <- map[\"countInfo\"]\n        associationAlbumsInfo <- map[\"associationAlbumsInfo\"]\n    }\n    \n    var recAlbumsPanelTitle = \"\"\n    var countInfo: [String: Any]?\n    var associationAlbumsInfo: [HCAssociationAlbumsInfoModel]?\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/Model/HCPlayCellModel.swift",
    "content": "//\n//  HCPlayCellModel.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/2/2.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\npublic struct HCPlayCellModel {\n\n    var cellHeight: CGFloat = 0.0\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/Model/HCPlayModel.swift",
    "content": "//\n//  HCPlayModel.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/2/4.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport Foundation\nimport ObjectMapper\n\n/*\n \n ret : 0\n albumInfo\n associationAlbumsInfo\n noCacheInfo\n trackInfo\n userInfo\n msg : \"0\"\n \n */\n\nstruct HCPlayModel: Mappable {\n\n    init() {\n        \n    }\n    \n    init?(map: Map) {\n        \n    }\n    \n    mutating func mapping(map: Map) {\n        \n        ret <- map[\"ret\"]\n        albumInfo <- map[\"albumInfo\"]\n        noCacheInfo <- map[\"noCacheInfo\"]\n        trackInfo <- map[\"trackInfo\"]\n        userInfo <- map[\"userInfo\"]\n        \n        msg <- map[\"msg\"]\n    }\n    \n    var ret = 0\n    var albumInfo: HCAlbumInfoModel?\n    var noCacheInfo: HCNoCacheInfoModel?\n    var trackInfo: HCTrackInfoModel?\n    var userInfo: HCPlayUserInfoModel?\n    \n    var msg = \"\"\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/Model/HCPlayUserInfoModel.swift",
    "content": "//\n//  HCPlayUserInfoModel.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/2/4.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport Foundation\nimport ObjectMapper\n\n/*\n \n albums : 9\n anchorGrade : 15\n answerCount : 0\n askAndAnswerBrief : \"\"\n askPrice : \"0.00\"\n followers : 1542581\n isOpenAskAndAnswer : false\n isVerified : true\n isVip : false\n nickname : \"吴晓波频道\"\n personDescribe : \"解密商业世界各种“真相”\"\n personalSignature : \"著名财经作家吴晓波，推出国内第一档财经脱口秀。只与最好玩的商业世界有关：细数那些企业家们犯过的错、解析经济发展的大小事件、讲述财经热点...\"\n ptitle : \"财经作家，吴晓波频道创始人\"\n skilledTopic : \"\"\n smallLogo : \"http://fdfs.xmcdn.com/group4/M04/D0/51/wKgDtFP2qljgWGrYAAR86TSbKQg782_mobile_small.jpg\"\n tracks : 753\n uid : 12495477\n verifyType : 1\n \n */\n\nstruct HCPlayUserInfoModel: Mappable {\n\n    init?(map: Map) {\n        \n    }\n    \n    mutating func mapping(map: Map) {\n        \n        albums <- map[\"albums\"]\n        nickname <- map[\"nickname\"]\n        personDescribe <- map[\"personDescribe\"]\n        personalSignature <- map[\"personalSignature\"]\n        ptitle <- map[\"ptitle\"]\n        \n        smallLogo <- map[\"smallLogo\"]\n        followers <- map[\"followers\"]\n    }\n    \n    var albums = 0\n    var nickname = \"\"\n    var personDescribe = \"\"\n    var personalSignature = \"\"\n    var ptitle = \"\"\n    \n    var smallLogo = \"\"\n    var followers = 0\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/Model/HCTrackInfoModel.swift",
    "content": "\n//\n//  HCTrackInfoModel.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/2/4.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport Foundation\nimport ObjectMapper\n\n/*\n \n albumId : 9996644\n bulletSwitchType : 2\n categoryId : 8\n categoryName : \"商业财经\"\n comments : 172\n coverLarge : \"http://fdfs.xmcdn.com/group17/M03/D0/07/wKgJJFmUHkKTmXH5AAJ-8Z3LCyo239_mobile_large.jpg\"\n coverMiddle : \"http://fdfs.xmcdn.com/group17/M03/D0/07/wKgJJFmUHkKTmXH5AAJ-8Z3LCyo239_web_large.jpg\"\n coverSmall : \"http://fdfs.xmcdn.com/group17/M03/D0/07/wKgJJFmUHkKTmXH5AAJ-8Z3LCyo239_web_meduim.jpg\"\n createdAt : 1502889129000\n discountedPrice : 180\n displayDiscountedPrice : \"180.00喜点\"\n displayPrice : \"180.00喜点\"\n displayVipPrice : \"171.00喜点\"\n downloadAacSize : 1224683\n downloadAacUrl : \"http://download.xmcdn.com/group17/M04/D1/5D/wKgJKVmUbSbjsUx6ABKv66-_PX4884.m4a\"\n downloadSize : 1582049\n downloadUrl : \"http://download.xmcdn.com/group26/M04/F9/BA/wKgJWFmURKbi8m1WABgj4QkX9HU465.aac\"\n duration : 395\n images\n isAuthorized : false\n isDraft : false\n isFree : true\n isLike : false\n isPaid : true\n isPublic : true\n isRichAudio : false\n isVideo : false\n isVipFree : false\n likes : 500\n playPathAacv164 : \"http://audio.xmcdn.com/group18/M0B/CF/E1/wKgJJVmURKSjsNCCADDZfM8XhW4400.m4a\"\n playPathAacv224 : \"http://audio.xmcdn.com/group17/M04/D1/5D/wKgJKVmUbSbjsUx6ABKv66-_PX4884.m4a\"\n playPathHq : \"\"\n playUrl32 : \"http://fdfs.xmcdn.com/group22/M06/F0/FC/wKgJM1mURP6xNY8nABggNBewHCk372.mp3\"\n playUrl64 : \"http://fdfs.xmcdn.com/group18/M0B/CF/E1/wKgJJVmURKODBl0dADBAH7PA14c520.mp3\"\n playtimes : 207172\n price : 180\n priceTypeEnum : 2\n priceTypeId : 2\n priceTypes\n processState : 2\n ret : 0\n sampleDuration : 90\n shortRichIntro : \"\n 听前思考：\n \n 有一个词呢最近很流行，叫做Freestyle，好像是一夜之间嘻哈文化进入到了中国，今天我们就来谈一谈嘻哈文化是怎么产生的，而今天中国为什么它会突然地流行起来？\n \n \"\n status : 1\n title : \"【免费试听】中国有嘻哈火了，是因为经济不好了？\"\n trackId : 47581915\n type : 0\n uid : 12495477\n vipPrice : 171\n \n */\n\nstruct HCTrackInfoModel: Mappable {\n\n    init?(map: Map) {\n        \n    }\n    \n    mutating func mapping(map: Map) {\n        \n        albumId <- map[\"albumId\"]\n        shortRichIntro <- map[\"shortRichIntro\"]\n        title <- map[\"title\"]\n        trackId <- map[\"trackId\"]\n        categoryName <- map[\"categoryName\"]\n        \n        categoryId <- map[\"categoryId\"]\n        coverLarge <- map[\"coverLarge\"]\n    }\n    \n    var albumId = 0\n    var shortRichIntro = \"\"\n    var title = \"\"\n    var trackId: UInt32 = 0\n    var categoryName = \"\"\n    \n    var categoryId: UInt32 = 0\n    var coverLarge = \"\"\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/View/Cell/HCPlayAlbumCell.swift",
    "content": "//\n//  HCPlayAlbumCell.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/2/2.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//  订阅专辑\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport RxDataSources\nimport ReusableKit\nimport NSObject_Rx\n\n// MARK:- 常量\nfileprivate struct Metric {\n    \n    static let cellHeight: CGFloat = 80.0\n}\n\nclass HCPlayAlbumCell: UITableViewCell {\n    \n    @IBOutlet weak var iconImg: UIImageView!\n    @IBOutlet weak var titleLab: UILabel!\n    @IBOutlet weak var subTitleLab: UILabel!\n    @IBOutlet weak var albumView: UIView!\n    @IBOutlet weak var albumLab: UILabel!\n    \n    var playModel: Variable<HCPlayModel?> = Variable(nil)\n\n    override func awakeFromNib() {\n        super.awakeFromNib()\n        \n        initEnableMudule()\n        initUI()\n        bindUI()\n    }\n}\n\n// MARK:- 初始化\nextension HCPlayAlbumCell {\n    \n    func initUI() {\n        \n        // 设置样式\n        self.albumView.layer.masksToBounds = true\n        self.albumView.layer.cornerRadius = self.albumView.height / 2\n        self.albumView.backgroundColor = kThemeMistyRoseColor\n        self.albumLab.textColor = kThemeTomatoColor\n        \n        // 初始化\n        self.iconImg.image = UIImage(named: \"favicon\")\n        self.titleLab.text = \"\"\n        self.subTitleLab.text = \"6.3万人订阅\"\n        self.albumLab.text = \"订阅专辑\"\n    }\n    \n    private func bindUI() {\n        \n        playModel.asObservable().subscribe(onNext: { [weak self] model in\n            \n            guard let `self` = self else { return }\n\n            self.titleLab.text = model?.albumInfo?.title\n            \n        }).disposed(by: rx.disposeBag)\n    }\n    \n    static func cellHeight() -> CGFloat {\n        \n        return Metric.cellHeight\n    }\n}\n\n// MARK:- 协议组件\nextension HCPlayAlbumCell: HCCellStyleable {\n    \n    // MARK:- 协议组件\n    private func initEnableMudule() {\n        \n        // 横线\n        _ = bottomLine(style: .margin)\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/View/Cell/HCPlayAlbumCell.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"13771\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"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=\"13772\"/>\n        <capability name=\"Aspect ratio constraints\" minToolsVersion=\"5.1\"/>\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\" id=\"KGk-i7-Jjw\" customClass=\"HCPlayAlbumCell\" customModule=\"RxXMLY\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"80\"/>\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=\"320\" height=\"79.5\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ke4-Il-oY1\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"79.5\"/>\n                        <subviews>\n                            <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"6GD-Me-enA\">\n                                <rect key=\"frame\" x=\"15\" y=\"19\" width=\"40\" height=\"40\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" constant=\"40\" id=\"5kP-DU-9Ej\"/>\n                                    <constraint firstAttribute=\"width\" secondItem=\"6GD-Me-enA\" secondAttribute=\"height\" id=\"sTQ-Uf-cT8\"/>\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=\"rLn-NR-ZvG\">\n                                <rect key=\"frame\" x=\"60\" y=\"19\" width=\"37.5\" height=\"18\"/>\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=\"Label\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"2jU-7i-4WT\">\n                                <rect key=\"frame\" x=\"60\" y=\"43\" width=\"33\" height=\"16\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"jwd-We-Lye\">\n                                <rect key=\"frame\" x=\"241\" y=\"25.5\" width=\"64\" height=\"30\"/>\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=\"7DM-DJ-wnE\">\n                                        <rect key=\"frame\" x=\"12\" y=\"6\" width=\"40\" height=\"18\"/>\n                                        <fontDescription key=\"fontDescription\" type=\"boldSystem\" pointSize=\"15\"/>\n                                        <color key=\"textColor\" red=\"0.98431372549999996\" green=\"0.28235294119999998\" blue=\"0.30980392159999998\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                </subviews>\n                                <color key=\"backgroundColor\" red=\"0.99607843139999996\" green=\"0.92156862750000001\" blue=\"0.71372549019999998\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                <constraints>\n                                    <constraint firstItem=\"7DM-DJ-wnE\" firstAttribute=\"top\" secondItem=\"jwd-We-Lye\" secondAttribute=\"top\" constant=\"6\" id=\"14x-c1-NDy\"/>\n                                    <constraint firstItem=\"7DM-DJ-wnE\" firstAttribute=\"centerX\" secondItem=\"jwd-We-Lye\" secondAttribute=\"centerX\" id=\"GHI-WU-9pB\"/>\n                                    <constraint firstItem=\"7DM-DJ-wnE\" firstAttribute=\"leading\" secondItem=\"jwd-We-Lye\" secondAttribute=\"leading\" constant=\"12\" id=\"eK7-Ef-zMZ\"/>\n                                    <constraint firstItem=\"7DM-DJ-wnE\" firstAttribute=\"centerY\" secondItem=\"jwd-We-Lye\" secondAttribute=\"centerY\" id=\"gO9-rp-kTd\"/>\n                                </constraints>\n                            </view>\n                        </subviews>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                        <constraints>\n                            <constraint firstItem=\"jwd-We-Lye\" firstAttribute=\"centerY\" secondItem=\"ke4-Il-oY1\" secondAttribute=\"centerY\" id=\"3KP-9Z-qRt\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"jwd-We-Lye\" secondAttribute=\"trailing\" constant=\"15\" id=\"3hc-zR-SNC\"/>\n                            <constraint firstItem=\"jwd-We-Lye\" firstAttribute=\"leading\" relation=\"greaterThanOrEqual\" secondItem=\"rLn-NR-ZvG\" secondAttribute=\"trailing\" constant=\"5\" id=\"FZu-lR-O4j\"/>\n                            <constraint firstItem=\"rLn-NR-ZvG\" firstAttribute=\"top\" secondItem=\"6GD-Me-enA\" secondAttribute=\"top\" id=\"LCv-vM-ZQm\"/>\n                            <constraint firstItem=\"2jU-7i-4WT\" firstAttribute=\"leading\" secondItem=\"rLn-NR-ZvG\" secondAttribute=\"leading\" id=\"OCF-0k-b5U\"/>\n                            <constraint firstItem=\"2jU-7i-4WT\" firstAttribute=\"bottom\" secondItem=\"6GD-Me-enA\" secondAttribute=\"bottom\" id=\"ZCh-Mn-DGr\"/>\n                            <constraint firstItem=\"rLn-NR-ZvG\" firstAttribute=\"leading\" secondItem=\"6GD-Me-enA\" secondAttribute=\"trailing\" constant=\"5\" id=\"qq1-Yy-ZVf\"/>\n                            <constraint firstItem=\"6GD-Me-enA\" firstAttribute=\"leading\" secondItem=\"ke4-Il-oY1\" secondAttribute=\"leading\" constant=\"15\" id=\"t5R-0v-X88\"/>\n                            <constraint firstItem=\"6GD-Me-enA\" firstAttribute=\"centerY\" secondItem=\"ke4-Il-oY1\" secondAttribute=\"centerY\" id=\"vSF-4A-G2T\"/>\n                        </constraints>\n                    </view>\n                </subviews>\n                <constraints>\n                    <constraint firstItem=\"ke4-Il-oY1\" firstAttribute=\"leading\" secondItem=\"H2p-sc-9uM\" secondAttribute=\"leading\" id=\"8HD-2K-6GR\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"ke4-Il-oY1\" secondAttribute=\"trailing\" id=\"JPs-nQ-fHU\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"ke4-Il-oY1\" secondAttribute=\"bottom\" id=\"U7G-F3-lyV\"/>\n                    <constraint firstItem=\"ke4-Il-oY1\" firstAttribute=\"top\" secondItem=\"H2p-sc-9uM\" secondAttribute=\"top\" id=\"m4M-nX-tB6\"/>\n                </constraints>\n            </tableViewCellContentView>\n            <connections>\n                <outlet property=\"albumLab\" destination=\"7DM-DJ-wnE\" id=\"m7L-K1-17O\"/>\n                <outlet property=\"albumView\" destination=\"jwd-We-Lye\" id=\"s4p-R7-Tn9\"/>\n                <outlet property=\"iconImg\" destination=\"6GD-Me-enA\" id=\"BVZ-vz-PEG\"/>\n                <outlet property=\"subTitleLab\" destination=\"2jU-7i-4WT\" id=\"WC1-do-wpZ\"/>\n                <outlet property=\"titleLab\" destination=\"rLn-NR-ZvG\" id=\"bcc-Gy-scu\"/>\n            </connections>\n        </tableViewCell>\n    </objects>\n</document>\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/View/Cell/HCPlayRecommendCell.swift",
    "content": "//\n//  HCPlayRecommendCell.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/2/6.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport RxDataSources\nimport ReusableKit\nimport NSObject_Rx\n\nfileprivate struct Metric {\n    \n    static let scale : CGFloat = 120 / 375\n    static let column: CGFloat = 1\n    static let margin : CGFloat = 5\n}\n\npublic enum HCPlayRecommendType {\n    case play\n    case read\n}\n\nclass HCPlayRecommendCell: UITableViewCell {\n    \n    @IBOutlet weak var leftTopLabCons: NSLayoutConstraint!\n    @IBOutlet weak var leftImgView: UIImageView!\n    @IBOutlet weak var leftTopTipView: UIView!\n    @IBOutlet weak var leftTopTipLab: UILabel!\n    @IBOutlet weak var leftTopLab: UILabel!\n    @IBOutlet weak var leftCenterLab: UILabel!\n    \n    @IBOutlet weak var leftBottomImgView1: UIImageView!\n    @IBOutlet weak var leftBottomImgView2: UIImageView!\n    @IBOutlet weak var leftBottomLab1: UILabel!\n    @IBOutlet weak var leftBottomLab2: UILabel!\n    \n    // 下划线\n    var bottomLine: UIView?\n    \n    var cellType: HCRecommendSingleType = .read\n    var albumsInfoModel: Variable<HCAssociationAlbumsInfoModel?> = Variable(nil)\n\n    override func awakeFromNib() {\n        super.awakeFromNib()\n        \n        initEnableMudule()\n        initUI()\n        bindUI()\n    }\n    \n    override func layoutSubviews() {\n        super.layoutSubviews()\n    }\n}\n\n// MARK:- 初始化\nextension HCPlayRecommendCell {\n    \n    private func initUI() {\n        \n        self.leftImgView.layer.masksToBounds = true\n        self.leftImgView.layer.borderColor = kThemeGainsboroColor.cgColor\n        self.leftImgView.layer.borderWidth = 0.6\n    }\n    \n    private func bindUI() {\n        \n        albumsInfoModel.asObservable().subscribe(onNext: { [weak self] model in\n            \n            guard let `self` = self else { return }\n            \n            self.leftTopLab.text = model?.title\n            if let coverMiddle = model?.coverMiddle {\n                self.leftImgView.kf.setImage(with: URL(string: coverMiddle))\n            }\n            self.leftBottomImgView1.image = UIImage(named: \"album_play\")\n            self.leftBottomImgView2.isHidden = false\n            if let intro = model?.intro {\n                self.leftCenterLab.text = intro\n            }\n            \n            self.leftBottomLab1.text = self.defaultPlaysCount(524300)\n            if let discountedPrice = model?.discountedPrice {\n                self.leftBottomLab2.text = \"\\(discountedPrice)集\"\n            }\n\n        }).disposed(by: rx.disposeBag)\n    }\n    \n    private func defaultPlaysCount(_ playsCount: Int) -> String {\n        if playsCount < 10000 {\n            return \"\\(playsCount)\"\n        } else {\n            let result = String(format: \"%.1f万\", Float(playsCount) / 10000.0)\n            return result\n        }\n    }\n    \n    static func cellHeight() -> CGFloat {\n        // 结合 FlowLayout 设置\n        let width = kScreenW\n        let height = width * Metric.scale\n        \n        return height\n    }\n}\n\nextension HCPlayRecommendCell: HCCellStyleable {\n    \n    // MARK:- 协议组件\n    private func initEnableMudule() {\n        \n        // 横线\n        bottomLine = bottomLine(style: .marginLeft)\n        bottomLine?.backgroundColor = kThemeLightGreyColor\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/View/Cell/HCPlayRecommendCell.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"13771\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"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=\"13772\"/>\n        <capability name=\"Aspect ratio constraints\" minToolsVersion=\"5.1\"/>\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\" id=\"KGk-i7-Jjw\" customClass=\"HCPlayRecommendCell\" customModule=\"RxXMLY\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"120\"/>\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=\"320\" height=\"119.5\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Jrp-Ew-YOg\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"119.5\"/>\n                        <subviews>\n                            <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"eW3-GQ-2gj\">\n                                <rect key=\"frame\" x=\"15\" y=\"25.5\" width=\"70\" height=\"69.5\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" secondItem=\"eW3-GQ-2gj\" secondAttribute=\"height\" id=\"hJL-hc-NMR\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"70\" id=\"mhq-ak-bJj\"/>\n                                </constraints>\n                            </imageView>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"349-rj-hvq\">\n                                <rect key=\"frame\" x=\"90\" y=\"25.5\" width=\"35\" height=\"16.5\"/>\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=\"245-ng-sr4\">\n                                        <rect key=\"frame\" x=\"2\" y=\"1\" width=\"31\" height=\"14.5\"/>\n                                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"12\"/>\n                                        <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                </subviews>\n                                <color key=\"backgroundColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                <constraints>\n                                    <constraint firstItem=\"245-ng-sr4\" firstAttribute=\"centerY\" secondItem=\"349-rj-hvq\" secondAttribute=\"centerY\" id=\"9Ba-3H-WHS\"/>\n                                    <constraint firstAttribute=\"bottom\" secondItem=\"245-ng-sr4\" secondAttribute=\"bottom\" constant=\"1\" id=\"C7P-Un-ffn\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"245-ng-sr4\" secondAttribute=\"trailing\" constant=\"2\" id=\"MWJ-Q8-CY4\"/>\n                                    <constraint firstItem=\"245-ng-sr4\" firstAttribute=\"top\" secondItem=\"349-rj-hvq\" secondAttribute=\"top\" constant=\"1\" id=\"RqZ-TC-1zi\"/>\n                                    <constraint firstItem=\"245-ng-sr4\" firstAttribute=\"centerX\" secondItem=\"349-rj-hvq\" secondAttribute=\"centerX\" id=\"aSQ-gk-RGC\"/>\n                                    <constraint firstItem=\"245-ng-sr4\" firstAttribute=\"leading\" secondItem=\"349-rj-hvq\" secondAttribute=\"leading\" constant=\"2\" id=\"bhz-8n-tNI\"/>\n                                </constraints>\n                            </view>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Label\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"hWj-m1-JEi\">\n                                <rect key=\"frame\" x=\"130\" y=\"23.5\" width=\"39.5\" height=\"19.5\"/>\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=\"ht0-1B-FgP\">\n                                <rect key=\"frame\" x=\"90\" y=\"51.5\" width=\"35.5\" height=\"17\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"album_play\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"epj-aK-mPh\">\n                                <rect key=\"frame\" x=\"89.5\" y=\"82.5\" width=\"10\" height=\"10\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" secondItem=\"epj-aK-mPh\" secondAttribute=\"height\" multiplier=\"1:1\" id=\"7ER-Kg-7c5\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"10\" id=\"j36-2N-CDG\"/>\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=\"O04-ad-LEd\">\n                                <rect key=\"frame\" x=\"104.5\" y=\"80.5\" width=\"31\" height=\"14.5\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"12\"/>\n                                <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"album_tracks\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"uaI-i1-VWD\">\n                                <rect key=\"frame\" x=\"140.5\" y=\"81.5\" width=\"12\" height=\"12\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" constant=\"12\" id=\"ddd-Th-fhc\"/>\n                                    <constraint firstAttribute=\"width\" secondItem=\"uaI-i1-VWD\" secondAttribute=\"height\" multiplier=\"1:1\" id=\"eTt-mJ-h6n\"/>\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=\"dxN-IB-pwZ\">\n                                <rect key=\"frame\" x=\"157.5\" y=\"80.5\" width=\"31\" height=\"14.5\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"12\"/>\n                                <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                        </subviews>\n                        <constraints>\n                            <constraint firstItem=\"epj-aK-mPh\" firstAttribute=\"bottom\" secondItem=\"eW3-GQ-2gj\" secondAttribute=\"bottom\" priority=\"500\" id=\"0fK-xs-cyO\"/>\n                            <constraint firstItem=\"eW3-GQ-2gj\" firstAttribute=\"leading\" secondItem=\"Jrp-Ew-YOg\" secondAttribute=\"leading\" constant=\"15\" id=\"2NG-Yb-6Aw\"/>\n                            <constraint firstItem=\"dxN-IB-pwZ\" firstAttribute=\"leading\" secondItem=\"uaI-i1-VWD\" secondAttribute=\"trailing\" constant=\"5\" id=\"5RH-3L-ryz\"/>\n                            <constraint firstItem=\"dxN-IB-pwZ\" firstAttribute=\"centerY\" secondItem=\"epj-aK-mPh\" secondAttribute=\"centerY\" id=\"7rh-eW-ged\"/>\n                            <constraint firstItem=\"ht0-1B-FgP\" firstAttribute=\"leading\" secondItem=\"eW3-GQ-2gj\" secondAttribute=\"trailing\" constant=\"5\" id=\"B2h-P2-ZBM\"/>\n                            <constraint firstAttribute=\"trailing\" relation=\"greaterThanOrEqual\" secondItem=\"ht0-1B-FgP\" secondAttribute=\"trailing\" constant=\"5\" id=\"DOp-Pi-4Ci\"/>\n                            <constraint firstItem=\"eW3-GQ-2gj\" firstAttribute=\"centerY\" secondItem=\"Jrp-Ew-YOg\" secondAttribute=\"centerY\" id=\"FYn-km-deC\"/>\n                            <constraint firstItem=\"O04-ad-LEd\" firstAttribute=\"leading\" secondItem=\"epj-aK-mPh\" secondAttribute=\"trailing\" constant=\"5\" id=\"Gcn-E0-D6Z\"/>\n                            <constraint firstItem=\"hWj-m1-JEi\" firstAttribute=\"leading\" secondItem=\"349-rj-hvq\" secondAttribute=\"trailing\" constant=\"5\" id=\"Hrr-WO-bXu\"/>\n                            <constraint firstItem=\"349-rj-hvq\" firstAttribute=\"leading\" secondItem=\"eW3-GQ-2gj\" secondAttribute=\"trailing\" constant=\"5\" id=\"Rsr-jP-tb1\"/>\n                            <constraint firstItem=\"O04-ad-LEd\" firstAttribute=\"centerY\" secondItem=\"epj-aK-mPh\" secondAttribute=\"centerY\" id=\"Uez-rR-Vnp\"/>\n                            <constraint firstAttribute=\"trailing\" relation=\"greaterThanOrEqual\" secondItem=\"dxN-IB-pwZ\" secondAttribute=\"trailing\" constant=\"5\" id=\"cKK-QQ-pg3\"/>\n                            <constraint firstItem=\"epj-aK-mPh\" firstAttribute=\"leading\" secondItem=\"eW3-GQ-2gj\" secondAttribute=\"trailing\" constant=\"5\" id=\"cyq-pi-wJM\"/>\n                            <constraint firstItem=\"uaI-i1-VWD\" firstAttribute=\"leading\" secondItem=\"O04-ad-LEd\" secondAttribute=\"trailing\" constant=\"5\" id=\"e8D-vu-lvi\"/>\n                            <constraint firstItem=\"O04-ad-LEd\" firstAttribute=\"bottom\" secondItem=\"eW3-GQ-2gj\" secondAttribute=\"bottom\" id=\"ehE-i3-nDo\"/>\n                            <constraint firstAttribute=\"trailing\" relation=\"greaterThanOrEqual\" secondItem=\"hWj-m1-JEi\" secondAttribute=\"trailing\" constant=\"5\" id=\"gPs-Lj-F32\"/>\n                            <constraint firstItem=\"uaI-i1-VWD\" firstAttribute=\"centerY\" secondItem=\"epj-aK-mPh\" secondAttribute=\"centerY\" id=\"mbJ-42-6GH\"/>\n                            <constraint firstItem=\"349-rj-hvq\" firstAttribute=\"top\" secondItem=\"eW3-GQ-2gj\" secondAttribute=\"top\" id=\"n2I-Up-eUk\"/>\n                            <constraint firstItem=\"ht0-1B-FgP\" firstAttribute=\"centerY\" secondItem=\"eW3-GQ-2gj\" secondAttribute=\"centerY\" id=\"pG3-Kt-Z6X\"/>\n                            <constraint firstItem=\"hWj-m1-JEi\" firstAttribute=\"centerY\" secondItem=\"245-ng-sr4\" secondAttribute=\"centerY\" id=\"rla-a4-SAv\"/>\n                        </constraints>\n                    </view>\n                </subviews>\n                <constraints>\n                    <constraint firstItem=\"Jrp-Ew-YOg\" firstAttribute=\"leading\" secondItem=\"H2p-sc-9uM\" secondAttribute=\"leading\" id=\"9Ju-h9-ESU\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"Jrp-Ew-YOg\" secondAttribute=\"bottom\" id=\"IcB-iS-7lb\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"Jrp-Ew-YOg\" secondAttribute=\"trailing\" id=\"mlO-jm-r5S\"/>\n                    <constraint firstItem=\"Jrp-Ew-YOg\" firstAttribute=\"top\" secondItem=\"H2p-sc-9uM\" secondAttribute=\"top\" id=\"qd9-h9-eKI\"/>\n                </constraints>\n            </tableViewCellContentView>\n            <connections>\n                <outlet property=\"leftBottomImgView1\" destination=\"epj-aK-mPh\" id=\"T8c-50-wN6\"/>\n                <outlet property=\"leftBottomImgView2\" destination=\"uaI-i1-VWD\" id=\"thK-6n-Egf\"/>\n                <outlet property=\"leftBottomLab1\" destination=\"O04-ad-LEd\" id=\"Sfn-zW-z1r\"/>\n                <outlet property=\"leftBottomLab2\" destination=\"dxN-IB-pwZ\" id=\"QUI-fT-51Z\"/>\n                <outlet property=\"leftCenterLab\" destination=\"ht0-1B-FgP\" id=\"9tZ-bN-5Lh\"/>\n                <outlet property=\"leftImgView\" destination=\"eW3-GQ-2gj\" id=\"NjK-HH-uFO\"/>\n                <outlet property=\"leftTopLab\" destination=\"hWj-m1-JEi\" id=\"Nbn-Eb-YdR\"/>\n                <outlet property=\"leftTopLabCons\" destination=\"Rsr-jP-tb1\" id=\"3PL-fH-PNP\"/>\n                <outlet property=\"leftTopTipLab\" destination=\"245-ng-sr4\" id=\"n4e-hv-Z98\"/>\n                <outlet property=\"leftTopTipView\" destination=\"349-rj-hvq\" id=\"9PK-Hu-iDB\"/>\n            </connections>\n        </tableViewCell>\n    </objects>\n    <resources>\n        <image name=\"album_play\" width=\"12\" height=\"12\"/>\n        <image name=\"album_tracks\" width=\"14\" height=\"14\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/View/Cell/HCPlayRecommendFooterCell.swift",
    "content": "//\n//  HCPlayRecommendFooterCell.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/2/6.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\n// MARK:- 常量\nfileprivate struct Metric {\n    \n    static let cellHeight : CGFloat = 60.0\n}\n\nclass HCPlayRecommendFooterCell: UITableViewCell {\n\n    override func awakeFromNib() {\n        super.awakeFromNib()\n    }\n    \n    static func cellHeight() -> CGFloat {\n        \n        return Metric.cellHeight\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/View/Cell/HCPlayRecommendFooterCell.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"13771\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"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=\"13772\"/>\n        <capability name=\"Aspect ratio constraints\" minToolsVersion=\"5.1\"/>\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\" id=\"KGk-i7-Jjw\" customClass=\"HCPlayRecommendFooterCell\" customModule=\"RxXMLY\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"60\"/>\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=\"320\" height=\"59.5\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"QQC-hh-igd\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"50\"/>\n                        <subviews>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Qi3-c5-35n\">\n                                <rect key=\"frame\" x=\"16\" y=\"0.0\" width=\"288\" height=\"0.5\"/>\n                                <color key=\"backgroundColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"0.5\" id=\"ZMp-oC-INL\"/>\n                                </constraints>\n                            </view>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"查看更多推荐\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"iNL-gs-kwM\">\n                                <rect key=\"frame\" x=\"120\" y=\"17\" width=\"80\" height=\"16\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"cell_arrow_all\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8i7-QO-mvy\">\n                                <rect key=\"frame\" x=\"203\" y=\"17.5\" width=\"15\" height=\"15\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" secondItem=\"8i7-QO-mvy\" secondAttribute=\"height\" id=\"LDP-LE-Pgj\"/>\n                                    <constraint firstAttribute=\"width\" constant=\"15\" id=\"z5N-GC-Eej\"/>\n                                </constraints>\n                            </imageView>\n                        </subviews>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                        <constraints>\n                            <constraint firstItem=\"Qi3-c5-35n\" firstAttribute=\"top\" secondItem=\"QQC-hh-igd\" secondAttribute=\"top\" id=\"Bnh-DH-WLi\"/>\n                            <constraint firstItem=\"8i7-QO-mvy\" firstAttribute=\"centerY\" secondItem=\"QQC-hh-igd\" secondAttribute=\"centerY\" id=\"DVQ-me-9iR\"/>\n                            <constraint firstItem=\"8i7-QO-mvy\" firstAttribute=\"leading\" secondItem=\"iNL-gs-kwM\" secondAttribute=\"trailing\" constant=\"3\" id=\"U4h-HF-EcD\"/>\n                            <constraint firstItem=\"iNL-gs-kwM\" firstAttribute=\"centerY\" secondItem=\"QQC-hh-igd\" secondAttribute=\"centerY\" id=\"Zqi-Pe-yW9\"/>\n                            <constraint firstItem=\"iNL-gs-kwM\" firstAttribute=\"centerY\" secondItem=\"QQC-hh-igd\" secondAttribute=\"centerY\" id=\"bSa-Uf-MUl\"/>\n                            <constraint firstItem=\"Qi3-c5-35n\" firstAttribute=\"leading\" secondItem=\"QQC-hh-igd\" secondAttribute=\"leading\" constant=\"16\" id=\"gA8-uV-2Bk\"/>\n                            <constraint firstItem=\"iNL-gs-kwM\" firstAttribute=\"centerX\" secondItem=\"QQC-hh-igd\" secondAttribute=\"centerX\" id=\"nbg-nM-GaF\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"Qi3-c5-35n\" secondAttribute=\"trailing\" constant=\"16\" id=\"xOV-8O-PmY\"/>\n                        </constraints>\n                    </view>\n                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"CLU-5u-ZsJ\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"50\" width=\"320\" height=\"10\"/>\n                        <color key=\"backgroundColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" constant=\"10\" id=\"h2V-cU-pdU\"/>\n                        </constraints>\n                    </view>\n                </subviews>\n                <constraints>\n                    <constraint firstItem=\"QQC-hh-igd\" firstAttribute=\"top\" secondItem=\"H2p-sc-9uM\" secondAttribute=\"top\" id=\"D03-Uv-9FE\"/>\n                    <constraint firstItem=\"QQC-hh-igd\" firstAttribute=\"leading\" secondItem=\"H2p-sc-9uM\" secondAttribute=\"leading\" id=\"GRj-69-235\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"CLU-5u-ZsJ\" secondAttribute=\"bottom\" id=\"HVB-eo-jte\"/>\n                    <constraint firstItem=\"CLU-5u-ZsJ\" firstAttribute=\"top\" secondItem=\"QQC-hh-igd\" secondAttribute=\"bottom\" id=\"N8q-yH-9XR\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"QQC-hh-igd\" secondAttribute=\"trailing\" id=\"NBU-Y6-xEe\"/>\n                    <constraint firstItem=\"CLU-5u-ZsJ\" firstAttribute=\"leading\" secondItem=\"H2p-sc-9uM\" secondAttribute=\"leading\" id=\"PwJ-Xb-e7e\"/>\n                    <constraint firstItem=\"CLU-5u-ZsJ\" firstAttribute=\"top\" secondItem=\"QQC-hh-igd\" secondAttribute=\"bottom\" id=\"WAU-nZ-I2X\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"CLU-5u-ZsJ\" secondAttribute=\"trailing\" id=\"gOT-gp-0wS\"/>\n                </constraints>\n            </tableViewCellContentView>\n        </tableViewCell>\n    </objects>\n    <resources>\n        <image name=\"cell_arrow_all\" width=\"7\" height=\"14\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/View/Cell/HCPlayRecommendHeaderCell.swift",
    "content": "//\n//  HCPlayRecommendHeaderCell.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/2/6.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//  推荐部分\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport RxGesture\nimport RxDataSources\nimport ReusableKit\nimport NSObject_Rx\n\n// MARK:- 常量\nfileprivate struct Metric {\n    \n    static let defaultHeight : CGFloat = 90.0\n    static let minHeight : CGFloat = 50.0\n}\n\nclass HCPlayRecommendHeaderCell: UITableViewCell {\n\n    @IBOutlet weak var topView: UIView!\n    @IBOutlet weak var bottomView: UIView!\n    \n    @IBOutlet weak var leftTitle: UILabel!\n    @IBOutlet weak var leftSubView: UIView!\n    @IBOutlet weak var leftSubTitle: UILabel!\n    \n    @IBOutlet weak var rightSubView: UIView!\n    @IBOutlet weak var rightSubTitle: UILabel!\n    \n    @IBOutlet weak var tagView1: UIView!\n    @IBOutlet weak var tagView2: UIView!\n    @IBOutlet weak var tagView3: UIView!\n    @IBOutlet weak var tagView4: UIView!\n    \n    @IBOutlet weak var tagLab1: UILabel!\n    @IBOutlet weak var tagLab2: UILabel!\n    @IBOutlet weak var tagLab3: UILabel!\n    @IBOutlet weak var tagLab4: UILabel!\n    \n    var playModel: Variable<HCPlayModel?> = Variable(nil)\n\n    override func awakeFromNib() {\n        super.awakeFromNib()\n        \n        initUI()\n        bindUI()\n    }\n}\n\n// MARK:- 初始化\nextension HCPlayRecommendHeaderCell {\n    \n    private func initUI() {\n        \n        tagView1.backgroundColor = .clear\n        tagView1.layer.cornerRadius = tagView1.height / 2\n        tagView1.layer.masksToBounds = true\n        tagView1.layer.borderColor = UIColor.darkGray.cgColor\n        tagView1.layer.borderWidth = 0.6\n        \n        tagView2.backgroundColor = .clear\n        tagView2.layer.cornerRadius = tagView2.height / 2\n        tagView2.layer.masksToBounds = true\n        tagView2.layer.borderColor = UIColor.darkGray.cgColor\n        tagView2.layer.borderWidth = 0.6\n        \n        tagView3.backgroundColor = .clear\n        tagView3.layer.cornerRadius = tagView3.height / 2\n        tagView3.layer.masksToBounds = true\n        tagView3.layer.borderColor = UIColor.darkGray.cgColor\n        tagView3.layer.borderWidth = 0.6\n        \n        tagView4.backgroundColor = .clear\n        tagView4.layer.cornerRadius = tagView4.height / 2\n        tagView4.layer.masksToBounds = true\n        tagView4.layer.borderColor = UIColor.darkGray.cgColor\n        tagView4.layer.borderWidth = 0.6\n    }\n    \n    private func bindUI() {\n        \n        playModel.asObservable().subscribe(onNext: { [weak self] model in\n            \n            guard let `self` = self else { return }\n\n            self.leftSubView.isHidden = true\n            self.rightSubView.isHidden = true\n            \n            self.leftTitle.text = model?.noCacheInfo?.recAlbumsPanelTitle\n            \n            if let keywordStr = model?.albumInfo?.tags {\n                \n                let keywords = keywordStr.components(separatedBy: \",\")\n                \n                if keywords.count >= 4 {\n                    self.height = Metric.defaultHeight\n                    self.bottomView.isHidden = false\n                    \n                    self.tagLab1.text = keywords[0]\n                    self.tagLab2.text = keywords[1]\n                    self.tagLab3.text = keywords[2]\n                    self.tagLab4.text = keywords[3]\n                    return\n                }\n            }\n            self.height = Metric.minHeight\n            self.bottomView.isHidden = true\n            return\n            \n        }).disposed(by: rx.disposeBag)\n    }\n    \n    static func defaultCellHeight() -> CGFloat {\n        \n        return Metric.defaultHeight\n    }\n    \n    static func minCellHeight() -> CGFloat {\n        \n        return  Metric.minHeight\n    }\n}\n\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/View/Cell/HCPlayRecommendHeaderCell.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"13771\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"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=\"13772\"/>\n        <capability name=\"Aspect ratio constraints\" minToolsVersion=\"5.1\"/>\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\" id=\"KGk-i7-Jjw\" customClass=\"HCPlayRecommendHeaderCell\" customModule=\"RxXMLY\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"90\"/>\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=\"320\" height=\"89.5\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"FAL-Vk-LGG\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"45\"/>\n                        <subviews>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"最热有声读物\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"zhf-NA-Rw9\">\n                                <rect key=\"frame\" x=\"16\" y=\"17.5\" width=\"104\" height=\"20.5\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                <nil key=\"textColor\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Liz-G6-ySo\">\n                                <rect key=\"frame\" x=\"125\" y=\"10\" width=\"87.5\" height=\"35\"/>\n                                <subviews>\n                                    <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"cgz_ic_accuracy\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"gbt-S9-JFe\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"8.5\" width=\"18\" height=\"18\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" secondItem=\"gbt-S9-JFe\" secondAttribute=\"height\" multiplier=\"1:1\" id=\"kQ1-04-mbh\"/>\n                                        </constraints>\n                                    </imageView>\n                                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"点我猜更准\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"w2O-Eu-q96\">\n                                        <rect key=\"frame\" x=\"21\" y=\"10\" width=\"66.5\" height=\"16\"/>\n                                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                        <color key=\"textColor\" red=\"1\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                </subviews>\n                                <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                <constraints>\n                                    <constraint firstItem=\"gbt-S9-JFe\" firstAttribute=\"centerY\" secondItem=\"Liz-G6-ySo\" secondAttribute=\"centerY\" id=\"88Y-Ek-0LV\"/>\n                                    <constraint firstItem=\"w2O-Eu-q96\" firstAttribute=\"leading\" secondItem=\"gbt-S9-JFe\" secondAttribute=\"trailing\" constant=\"3\" id=\"9D2-29-Ttq\"/>\n                                    <constraint firstItem=\"gbt-S9-JFe\" firstAttribute=\"leading\" secondItem=\"Liz-G6-ySo\" secondAttribute=\"leading\" id=\"KkX-sq-JjU\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"w2O-Eu-q96\" secondAttribute=\"trailing\" id=\"NBW-Ji-a8P\"/>\n                                    <constraint firstItem=\"w2O-Eu-q96\" firstAttribute=\"centerY\" secondItem=\"Liz-G6-ySo\" secondAttribute=\"centerY\" id=\"eVF-Ns-z0p\"/>\n                                </constraints>\n                            </view>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"lC1-98-GqR\">\n                                <rect key=\"frame\" x=\"262\" y=\"12.5\" width=\"42\" height=\"30\"/>\n                                <subviews>\n                                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"更多\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"JEO-mR-FLX\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"7.5\" width=\"27\" height=\"16\"/>\n                                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                        <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                    <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"live_ic_arrow_right\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Cfh-zn-n6Y\">\n                                        <rect key=\"frame\" x=\"30\" y=\"9\" width=\"12\" height=\"12\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" secondItem=\"Cfh-zn-n6Y\" secondAttribute=\"height\" id=\"1Rg-53-vZV\"/>\n                                        </constraints>\n                                    </imageView>\n                                </subviews>\n                                <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"Cfh-zn-n6Y\" secondAttribute=\"trailing\" id=\"MLn-hJ-s07\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"30\" id=\"cJs-98-aGx\"/>\n                                    <constraint firstItem=\"Cfh-zn-n6Y\" firstAttribute=\"centerY\" secondItem=\"lC1-98-GqR\" secondAttribute=\"centerY\" id=\"fen-8V-yQA\"/>\n                                    <constraint firstItem=\"JEO-mR-FLX\" firstAttribute=\"centerY\" secondItem=\"lC1-98-GqR\" secondAttribute=\"centerY\" id=\"tKn-WO-Qrd\"/>\n                                    <constraint firstItem=\"Cfh-zn-n6Y\" firstAttribute=\"leading\" secondItem=\"JEO-mR-FLX\" secondAttribute=\"trailing\" constant=\"3\" id=\"xbA-Eg-e9Q\"/>\n                                    <constraint firstItem=\"JEO-mR-FLX\" firstAttribute=\"leading\" secondItem=\"lC1-98-GqR\" secondAttribute=\"leading\" id=\"xcu-JL-1kI\"/>\n                                </constraints>\n                            </view>\n                        </subviews>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                        <constraints>\n                            <constraint firstItem=\"zhf-NA-Rw9\" firstAttribute=\"leading\" secondItem=\"FAL-Vk-LGG\" secondAttribute=\"leading\" constant=\"16\" id=\"0Px-go-UC6\"/>\n                            <constraint firstItem=\"zhf-NA-Rw9\" firstAttribute=\"centerY\" secondItem=\"FAL-Vk-LGG\" secondAttribute=\"centerY\" constant=\"5\" id=\"SCT-wO-kZX\"/>\n                            <constraint firstItem=\"lC1-98-GqR\" firstAttribute=\"centerY\" secondItem=\"zhf-NA-Rw9\" secondAttribute=\"centerY\" id=\"T3O-cZ-DDi\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"lC1-98-GqR\" secondAttribute=\"trailing\" constant=\"16\" id=\"h2y-00-Qtv\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"Liz-G6-ySo\" secondAttribute=\"bottom\" id=\"heQ-8S-38Q\"/>\n                            <constraint firstAttribute=\"height\" constant=\"45\" id=\"rua-wj-XRi\"/>\n                            <constraint firstItem=\"Liz-G6-ySo\" firstAttribute=\"centerY\" secondItem=\"zhf-NA-Rw9\" secondAttribute=\"centerY\" id=\"wqA-IK-qUK\"/>\n                            <constraint firstItem=\"Liz-G6-ySo\" firstAttribute=\"leading\" secondItem=\"zhf-NA-Rw9\" secondAttribute=\"trailing\" constant=\"5\" id=\"xUR-tg-Hs4\"/>\n                        </constraints>\n                    </view>\n                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ZcK-zt-mgq\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"45\" width=\"320\" height=\"44.5\"/>\n                        <subviews>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"49D-sZ-qPz\">\n                                <rect key=\"frame\" x=\"16\" y=\"8.5\" width=\"69.5\" height=\"28\"/>\n                                <subviews>\n                                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"女生最爱\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3ij-q0-IeV\">\n                                        <rect key=\"frame\" x=\"8\" y=\"6\" width=\"53.5\" height=\"16\"/>\n                                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                        <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                </subviews>\n                                <color key=\"backgroundColor\" red=\"0.99607843139999996\" green=\"0.92156862750000001\" blue=\"0.71372549019999998\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"3ij-q0-IeV\" secondAttribute=\"trailing\" constant=\"8\" id=\"X0I-aT-bws\"/>\n                                    <constraint firstItem=\"3ij-q0-IeV\" firstAttribute=\"leading\" secondItem=\"49D-sZ-qPz\" secondAttribute=\"leading\" constant=\"8\" id=\"hbZ-g0-tKw\"/>\n                                    <constraint firstItem=\"3ij-q0-IeV\" firstAttribute=\"top\" secondItem=\"49D-sZ-qPz\" secondAttribute=\"top\" constant=\"6\" id=\"rbQ-Rq-Ul2\"/>\n                                    <constraint firstAttribute=\"bottom\" secondItem=\"3ij-q0-IeV\" secondAttribute=\"bottom\" constant=\"6\" id=\"zsq-LT-L18\"/>\n                                </constraints>\n                            </view>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"sGu-5v-Pfx\">\n                                <rect key=\"frame\" x=\"95.5\" y=\"8.5\" width=\"43\" height=\"28\"/>\n                                <subviews>\n                                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"文学\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"gpv-J0-cqh\">\n                                        <rect key=\"frame\" x=\"8\" y=\"6\" width=\"27\" height=\"16\"/>\n                                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                        <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                </subviews>\n                                <color key=\"backgroundColor\" red=\"0.99607843139999996\" green=\"0.92156862750000001\" blue=\"0.71372549019999998\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"gpv-J0-cqh\" secondAttribute=\"trailing\" constant=\"8\" id=\"3Lv-VU-Mgu\"/>\n                                    <constraint firstItem=\"gpv-J0-cqh\" firstAttribute=\"top\" secondItem=\"sGu-5v-Pfx\" secondAttribute=\"top\" constant=\"6\" id=\"CuI-jD-Uog\"/>\n                                    <constraint firstAttribute=\"bottom\" secondItem=\"gpv-J0-cqh\" secondAttribute=\"bottom\" constant=\"6\" id=\"LMS-8D-orH\"/>\n                                    <constraint firstItem=\"gpv-J0-cqh\" firstAttribute=\"centerX\" secondItem=\"sGu-5v-Pfx\" secondAttribute=\"centerX\" id=\"Nx2-7s-CsW\"/>\n                                    <constraint firstItem=\"gpv-J0-cqh\" firstAttribute=\"leading\" secondItem=\"sGu-5v-Pfx\" secondAttribute=\"leading\" constant=\"8\" id=\"cgg-V0-GWl\"/>\n                                </constraints>\n                            </view>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"KJO-W1-Bw5\">\n                                <rect key=\"frame\" x=\"148.5\" y=\"8.5\" width=\"43\" height=\"28\"/>\n                                <subviews>\n                                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"武侠\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"b3z-ZR-pgU\">\n                                        <rect key=\"frame\" x=\"8\" y=\"6\" width=\"27\" height=\"16\"/>\n                                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                        <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                </subviews>\n                                <color key=\"backgroundColor\" red=\"0.99607843139999996\" green=\"0.92156862750000001\" blue=\"0.71372549019999998\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                <constraints>\n                                    <constraint firstItem=\"b3z-ZR-pgU\" firstAttribute=\"centerX\" secondItem=\"KJO-W1-Bw5\" secondAttribute=\"centerX\" id=\"JUG-yI-Wur\"/>\n                                    <constraint firstAttribute=\"bottom\" secondItem=\"b3z-ZR-pgU\" secondAttribute=\"bottom\" constant=\"6\" id=\"Rwt-KY-0ic\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"b3z-ZR-pgU\" secondAttribute=\"trailing\" constant=\"8\" id=\"Wxa-0D-D3t\"/>\n                                    <constraint firstItem=\"b3z-ZR-pgU\" firstAttribute=\"top\" secondItem=\"KJO-W1-Bw5\" secondAttribute=\"top\" constant=\"6\" id=\"s7X-hx-cgC\"/>\n                                    <constraint firstItem=\"b3z-ZR-pgU\" firstAttribute=\"leading\" secondItem=\"KJO-W1-Bw5\" secondAttribute=\"leading\" constant=\"8\" id=\"vE5-ao-Ur2\"/>\n                                </constraints>\n                            </view>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"V4d-7D-eyL\">\n                                <rect key=\"frame\" x=\"201.5\" y=\"8.5\" width=\"43\" height=\"28\"/>\n                                <subviews>\n                                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"经管\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"asP-MK-82V\">\n                                        <rect key=\"frame\" x=\"8\" y=\"6\" width=\"27\" height=\"16\"/>\n                                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                        <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                </subviews>\n                                <color key=\"backgroundColor\" red=\"0.99607843139999996\" green=\"0.92156862750000001\" blue=\"0.71372549019999998\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                <constraints>\n                                    <constraint firstItem=\"asP-MK-82V\" firstAttribute=\"leading\" secondItem=\"V4d-7D-eyL\" secondAttribute=\"leading\" constant=\"8\" id=\"6cC-ar-Z6x\"/>\n                                    <constraint firstItem=\"asP-MK-82V\" firstAttribute=\"centerX\" secondItem=\"V4d-7D-eyL\" secondAttribute=\"centerX\" id=\"UaE-N8-p4k\"/>\n                                    <constraint firstItem=\"asP-MK-82V\" firstAttribute=\"top\" secondItem=\"V4d-7D-eyL\" secondAttribute=\"top\" constant=\"6\" id=\"cmx-o1-zPz\"/>\n                                    <constraint firstAttribute=\"bottom\" secondItem=\"asP-MK-82V\" secondAttribute=\"bottom\" constant=\"6\" id=\"q6L-HQ-w16\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"asP-MK-82V\" secondAttribute=\"trailing\" constant=\"8\" id=\"wyc-2w-AkX\"/>\n                                </constraints>\n                            </view>\n                        </subviews>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                        <constraints>\n                            <constraint firstItem=\"49D-sZ-qPz\" firstAttribute=\"leading\" secondItem=\"ZcK-zt-mgq\" secondAttribute=\"leading\" constant=\"16\" id=\"7CJ-BK-WOv\"/>\n                            <constraint firstItem=\"V4d-7D-eyL\" firstAttribute=\"centerY\" secondItem=\"49D-sZ-qPz\" secondAttribute=\"centerY\" id=\"9Dp-6E-pDj\"/>\n                            <constraint firstItem=\"KJO-W1-Bw5\" firstAttribute=\"leading\" secondItem=\"sGu-5v-Pfx\" secondAttribute=\"trailing\" constant=\"10\" id=\"GKp-EE-n0E\"/>\n                            <constraint firstItem=\"KJO-W1-Bw5\" firstAttribute=\"centerY\" secondItem=\"49D-sZ-qPz\" secondAttribute=\"centerY\" id=\"L1B-oU-nzM\"/>\n                            <constraint firstItem=\"sGu-5v-Pfx\" firstAttribute=\"centerY\" secondItem=\"49D-sZ-qPz\" secondAttribute=\"centerY\" id=\"NYl-Wn-kGV\"/>\n                            <constraint firstItem=\"49D-sZ-qPz\" firstAttribute=\"centerY\" secondItem=\"ZcK-zt-mgq\" secondAttribute=\"centerY\" id=\"UJB-Wx-kIP\"/>\n                            <constraint firstItem=\"V4d-7D-eyL\" firstAttribute=\"leading\" secondItem=\"KJO-W1-Bw5\" secondAttribute=\"trailing\" constant=\"10\" id=\"Vyk-ne-ZU7\"/>\n                            <constraint firstItem=\"sGu-5v-Pfx\" firstAttribute=\"leading\" secondItem=\"49D-sZ-qPz\" secondAttribute=\"trailing\" constant=\"10\" id=\"rCz-Wy-Epe\"/>\n                        </constraints>\n                    </view>\n                </subviews>\n                <constraints>\n                    <constraint firstItem=\"ZcK-zt-mgq\" firstAttribute=\"leading\" secondItem=\"H2p-sc-9uM\" secondAttribute=\"leading\" id=\"5xc-Mh-buO\"/>\n                    <constraint firstItem=\"ZcK-zt-mgq\" firstAttribute=\"top\" secondItem=\"FAL-Vk-LGG\" secondAttribute=\"bottom\" id=\"AfY-pl-UTk\"/>\n                    <constraint firstItem=\"FAL-Vk-LGG\" firstAttribute=\"top\" secondItem=\"H2p-sc-9uM\" secondAttribute=\"top\" id=\"EED-XB-BVJ\"/>\n                    <constraint firstItem=\"FAL-Vk-LGG\" firstAttribute=\"leading\" secondItem=\"H2p-sc-9uM\" secondAttribute=\"leading\" id=\"TF1-at-0Nu\"/>\n                    <constraint firstItem=\"ZcK-zt-mgq\" firstAttribute=\"top\" secondItem=\"FAL-Vk-LGG\" secondAttribute=\"bottom\" id=\"jv5-ZL-s4f\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"ZcK-zt-mgq\" secondAttribute=\"bottom\" id=\"ojN-PM-tew\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"FAL-Vk-LGG\" secondAttribute=\"trailing\" id=\"ta6-2g-k9h\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"ZcK-zt-mgq\" secondAttribute=\"trailing\" id=\"thq-cx-W5u\"/>\n                </constraints>\n            </tableViewCellContentView>\n            <connections>\n                <outlet property=\"bottomView\" destination=\"ZcK-zt-mgq\" id=\"ZDi-T4-skt\"/>\n                <outlet property=\"leftSubTitle\" destination=\"w2O-Eu-q96\" id=\"1LO-CR-V2i\"/>\n                <outlet property=\"leftSubView\" destination=\"Liz-G6-ySo\" id=\"Xbq-nN-5ov\"/>\n                <outlet property=\"leftTitle\" destination=\"zhf-NA-Rw9\" id=\"p2f-El-Asb\"/>\n                <outlet property=\"rightSubTitle\" destination=\"JEO-mR-FLX\" id=\"tRT-J1-REr\"/>\n                <outlet property=\"rightSubView\" destination=\"lC1-98-GqR\" id=\"N5Y-ZH-5EC\"/>\n                <outlet property=\"tagLab1\" destination=\"3ij-q0-IeV\" id=\"cRI-Ou-9eF\"/>\n                <outlet property=\"tagLab2\" destination=\"gpv-J0-cqh\" id=\"etN-WY-iVh\"/>\n                <outlet property=\"tagLab3\" destination=\"b3z-ZR-pgU\" id=\"GeQ-0M-01I\"/>\n                <outlet property=\"tagLab4\" destination=\"asP-MK-82V\" id=\"e6u-Bx-9ZP\"/>\n                <outlet property=\"tagView1\" destination=\"49D-sZ-qPz\" id=\"fyq-cx-6Ug\"/>\n                <outlet property=\"tagView2\" destination=\"sGu-5v-Pfx\" id=\"qz4-XX-EwB\"/>\n                <outlet property=\"tagView3\" destination=\"KJO-W1-Bw5\" id=\"f0C-mh-Xxq\"/>\n                <outlet property=\"tagView4\" destination=\"V4d-7D-eyL\" id=\"nSq-TO-YaY\"/>\n                <outlet property=\"topView\" destination=\"FAL-Vk-LGG\" id=\"Z56-47-IAo\"/>\n            </connections>\n        </tableViewCell>\n    </objects>\n    <resources>\n        <image name=\"cgz_ic_accuracy\" width=\"18\" height=\"16\"/>\n        <image name=\"live_ic_arrow_right\" width=\"7\" height=\"12\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/View/Cell/HCPlaySynopsisCell.swift",
    "content": "//\n//  HCPlaySynopsisCell.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/2/4.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//  声音简介\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport RxGesture\nimport RxDataSources\nimport ReusableKit\nimport NSObject_Rx\n\n// MARK:- 常量\nfileprivate struct Metric {\n    \n    static let cellHeight: CGFloat = 400.0\n}\n\nclass HCPlaySynopsisCell: UITableViewCell {\n\n    @IBOutlet weak var bottomView: UIView!\n    @IBOutlet weak var titleLab: UILabel!\n    @IBOutlet weak var webView: UIWebView!\n    @IBOutlet weak var webViewHeightCons: NSLayoutConstraint!\n    @IBOutlet weak var detailView: UIView!\n    @IBOutlet weak var detailTopView: UIView!\n    @IBOutlet weak var detailBottomView: UIView!\n    @IBOutlet weak var detailBottomLab: UILabel!\n    @IBOutlet weak var detailBottomImg: UIImageView!\n    \n    // MARK:- 成功回调\n    typealias AddBlock = ()->Void\n    var updatelUI: AddBlock? = {\n        () in return\n    }\n    \n    private var isMore: Variable<Bool> = Variable(false)        // 查看全文\n    private var isOpen: Bool = false                            // 展开状态\n    var playModel: Variable<HCPlayModel?> = Variable(nil)\n\n    override func awakeFromNib() {\n        super.awakeFromNib()\n        \n        initUI()\n        bindUI()\n        \n        // 本地测试\n        guard let path = Bundle.main.path(forResource: \"play_synopsis\", ofType:\"html\") else { return }\n        let urlStr = URL(fileURLWithPath: path)\n        HCLog(urlStr)\n        self.webView.loadRequest(URLRequest(url: urlStr))\n    }\n    \n    override func layoutSubviews() {\n        super.layoutSubviews()\n    }\n}\n\n// MARK:- 初始化\nextension HCPlaySynopsisCell {\n    \n    func initUI() {\n        \n        // 设置样式\n        self.clipsToBounds = true\n        \n        self.webView.scrollView.showsVerticalScrollIndicator = false\n        self.webView.scrollView.bounces = false\n        \n        // 背景透明\n        self.detailTopView.alpha = 0.6\n        // 初始化\n        self.titleLab.text = \"声音简介\"\n    }\n    \n    private func bindUI() {\n        \n        // 添加事件\n        detailBottomView.rx.tapGesture().when(.recognized).subscribe({ [weak self] _ in\n            guard let `self` = self else { return }\n            \n            self.isOpen = !self.isOpen\n            \n            if self.isOpen {\n                // 重置高度\n                let newHeight = self.bottomView.top + self.webView.scrollView.contentSize.height\n                self.updateUI(newHeight: newHeight)\n                \n            } else {\n                // 重置高度\n                let newHeight = Metric.cellHeight\n                self.updateUI(newHeight: newHeight)\n            }\n        }).disposed(by: rx.disposeBag)\n\n        isMore.asObservable().subscribe(onNext: { [weak self] beel in\n            \n            guard let `self` = self else { return }\n            self.detailView.isHidden = !beel\n            \n        }).disposed(by: rx.disposeBag)\n\n//        playModel.asObservable().subscribe(onNext: { [weak self] model in\n//\n//            guard let `self` = self else { return }\n//            if let shortRichIntro = model?.trackInfo?.shortRichIntro {\n//                HCLog(shortRichIntro)\n//                self.webView.loadHTMLString(shortRichIntro, baseURL: nil)\n//                let newHeight = self.bottomView.top + self.webView.scrollView.contentSize.height\n//                self.updateUI(newHeight: newHeight)\n//            }\n//        }).disposed(by: rx.disposeBag)\n    }\n\n    // MARK:- 更新UI\n    private func updateUI(newHeight: CGFloat) {\n        \n        // 误差大于1，重新设置高度\n        if fabs(self.height - newHeight) > 1.0 {\n            // 重置高度\n            self.webViewHeightCons.constant = self.webView.scrollView.contentSize.height\n            self.height = newHeight\n            // 通知更新\n            self.updatelUI?()\n        }\n        \n        // 展开状态\n        if self.isOpen {\n            self.detailTopView.isHidden = true\n            self.detailBottomLab.text = \"收起\"\n            self.detailBottomImg.image = UIImage(named: \"cell_arrow_all_up\")\n        } else {\n            self.detailTopView.isHidden = false\n            self.detailBottomLab.text = \"查看全文\"\n            self.detailBottomImg.image = UIImage(named: \"cell_arrow_all\")\n        }\n    }\n\n    func cellHeight() -> CGFloat {\n        \n        if isOpen {\n            return self.height\n        }\n        \n        if self.height < Metric.cellHeight {\n            self.isMore.value = false\n            return self.height\n        }\n        self.isMore.value = true\n        return Metric.cellHeight\n    }\n    \n    static func cellHeight() -> CGFloat {\n        return Metric.cellHeight\n    }\n}\n\n// MARK:- 代理\nextension HCPlaySynopsisCell: UIWebViewDelegate {\n\n    func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {\n        \n        // 重置高度\n        let newHeight = self.bottomView.top + self.webView.scrollView.contentSize.height\n        self.updateUI(newHeight: newHeight)\n        \n        return true\n    }\n    \n    func webViewDidStartLoad(_ webView: UIWebView) {\n        \n    }\n    \n    func webViewDidFinishLoad(_ webView: UIWebView) {\n        \n    }\n    \n    func webView(_ webView: UIWebView, didFailLoadWithError error: Error) {\n        \n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/View/Cell/HCPlaySynopsisCell.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"13771\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"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=\"13772\"/>\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\" id=\"KGk-i7-Jjw\" customClass=\"HCPlaySynopsisCell\" customModule=\"RxXMLY\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"400\"/>\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=\"320\" height=\"399.5\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"bqA-Ij-8Lt\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"399.5\"/>\n                        <subviews>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"WkE-fx-ml3\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"20\" width=\"320\" height=\"40\"/>\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=\"cNJ-u4-3bW\">\n                                        <rect key=\"frame\" x=\"15\" y=\"10\" width=\"44.5\" height=\"20.5\"/>\n                                        <fontDescription key=\"fontDescription\" type=\"boldSystem\" pointSize=\"17\"/>\n                                        <nil key=\"textColor\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                </subviews>\n                                <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"40\" id=\"WEQ-ce-qu9\"/>\n                                    <constraint firstItem=\"cNJ-u4-3bW\" firstAttribute=\"centerY\" secondItem=\"WkE-fx-ml3\" secondAttribute=\"centerY\" id=\"aT3-lb-wbv\"/>\n                                    <constraint firstItem=\"cNJ-u4-3bW\" firstAttribute=\"leading\" secondItem=\"WkE-fx-ml3\" secondAttribute=\"leading\" constant=\"15\" id=\"lNz-HK-dpR\"/>\n                                </constraints>\n                            </view>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Nqc-NY-nJ9\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"60\" width=\"320\" height=\"339\"/>\n                                <subviews>\n                                    <webView contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"R19-7H-MUs\">\n                                        <rect key=\"frame\" x=\"8\" y=\"0.0\" width=\"304\" height=\"100\"/>\n                                        <color key=\"backgroundColor\" red=\"0.36078431370000003\" green=\"0.38823529410000002\" blue=\"0.4039215686\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"height\" constant=\"100\" id=\"VCC-Oi-L5A\"/>\n                                        </constraints>\n                                        <connections>\n                                            <outlet property=\"delegate\" destination=\"KGk-i7-Jjw\" id=\"LhY-QL-3yY\"/>\n                                        </connections>\n                                    </webView>\n                                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"sg9-bV-e5u\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"209\" width=\"320\" height=\"130\"/>\n                                        <subviews>\n                                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8JD-Ho-DcV\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"90\"/>\n                                                <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                            </view>\n                                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Lmo-IY-Gwh\">\n                                                <rect key=\"frame\" x=\"0.0\" y=\"90\" width=\"320\" height=\"40\"/>\n                                                <subviews>\n                                                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"lyk-Fc-6wt\">\n                                                        <rect key=\"frame\" x=\"117.5\" y=\"8\" width=\"85.5\" height=\"24\"/>\n                                                        <subviews>\n                                                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"查看全文\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"l8T-xo-sRw\">\n                                                                <rect key=\"frame\" x=\"10\" y=\"4.5\" width=\"53.5\" height=\"16\"/>\n                                                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                                                <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                                <nil key=\"highlightedColor\"/>\n                                                            </label>\n                                                            <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"cell_arrow_all\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"0PX-DI-0KJ\">\n                                                                <rect key=\"frame\" x=\"68.5\" y=\"5\" width=\"7\" height=\"14\"/>\n                                                            </imageView>\n                                                        </subviews>\n                                                        <constraints>\n                                                            <constraint firstItem=\"l8T-xo-sRw\" firstAttribute=\"leading\" secondItem=\"lyk-Fc-6wt\" secondAttribute=\"leading\" constant=\"10\" id=\"3fc-82-2zQ\"/>\n                                                            <constraint firstItem=\"0PX-DI-0KJ\" firstAttribute=\"centerY\" secondItem=\"lyk-Fc-6wt\" secondAttribute=\"centerY\" id=\"Mw3-ql-9AK\"/>\n                                                            <constraint firstAttribute=\"trailing\" secondItem=\"0PX-DI-0KJ\" secondAttribute=\"trailing\" constant=\"10\" id=\"QWQ-qU-TVq\"/>\n                                                            <constraint firstItem=\"0PX-DI-0KJ\" firstAttribute=\"top\" secondItem=\"lyk-Fc-6wt\" secondAttribute=\"top\" constant=\"5\" id=\"ZgJ-Zf-vY2\"/>\n                                                            <constraint firstItem=\"0PX-DI-0KJ\" firstAttribute=\"leading\" secondItem=\"l8T-xo-sRw\" secondAttribute=\"trailing\" constant=\"5\" id=\"e9C-aV-aqI\"/>\n                                                            <constraint firstItem=\"l8T-xo-sRw\" firstAttribute=\"centerY\" secondItem=\"lyk-Fc-6wt\" secondAttribute=\"centerY\" id=\"hes-f1-8AL\"/>\n                                                            <constraint firstAttribute=\"bottom\" secondItem=\"0PX-DI-0KJ\" secondAttribute=\"bottom\" constant=\"5\" id=\"iyB-1t-UQc\"/>\n                                                        </constraints>\n                                                    </view>\n                                                </subviews>\n                                                <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                <constraints>\n                                                    <constraint firstAttribute=\"height\" constant=\"40\" id=\"Fdt-Ad-tBF\"/>\n                                                    <constraint firstItem=\"lyk-Fc-6wt\" firstAttribute=\"centerY\" secondItem=\"Lmo-IY-Gwh\" secondAttribute=\"centerY\" id=\"Sx6-qt-g93\"/>\n                                                    <constraint firstItem=\"lyk-Fc-6wt\" firstAttribute=\"centerX\" secondItem=\"Lmo-IY-Gwh\" secondAttribute=\"centerX\" id=\"i46-D0-NKz\"/>\n                                                </constraints>\n                                            </view>\n                                        </subviews>\n                                        <constraints>\n                                            <constraint firstItem=\"8JD-Ho-DcV\" firstAttribute=\"top\" secondItem=\"sg9-bV-e5u\" secondAttribute=\"top\" id=\"54Z-WP-JSX\"/>\n                                            <constraint firstAttribute=\"bottom\" secondItem=\"Lmo-IY-Gwh\" secondAttribute=\"bottom\" id=\"9tG-iC-T6h\"/>\n                                            <constraint firstAttribute=\"trailing\" secondItem=\"Lmo-IY-Gwh\" secondAttribute=\"trailing\" id=\"Foo-Wq-Rkm\"/>\n                                            <constraint firstItem=\"Lmo-IY-Gwh\" firstAttribute=\"top\" secondItem=\"8JD-Ho-DcV\" secondAttribute=\"bottom\" id=\"dYf-EF-D8a\"/>\n                                            <constraint firstAttribute=\"trailing\" secondItem=\"8JD-Ho-DcV\" secondAttribute=\"trailing\" id=\"eIg-eY-9lz\"/>\n                                            <constraint firstItem=\"Lmo-IY-Gwh\" firstAttribute=\"leading\" secondItem=\"sg9-bV-e5u\" secondAttribute=\"leading\" id=\"g2X-uR-tqI\"/>\n                                            <constraint firstItem=\"8JD-Ho-DcV\" firstAttribute=\"leading\" secondItem=\"sg9-bV-e5u\" secondAttribute=\"leading\" id=\"lcM-eb-ofO\"/>\n                                            <constraint firstAttribute=\"height\" constant=\"130\" id=\"zA0-hd-e2j\"/>\n                                        </constraints>\n                                    </view>\n                                </subviews>\n                                <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                <constraints>\n                                    <constraint firstItem=\"sg9-bV-e5u\" firstAttribute=\"leading\" secondItem=\"Nqc-NY-nJ9\" secondAttribute=\"leading\" id=\"U2R-BY-ExP\"/>\n                                    <constraint firstItem=\"R19-7H-MUs\" firstAttribute=\"top\" secondItem=\"Nqc-NY-nJ9\" secondAttribute=\"top\" id=\"bKD-Gd-eFq\"/>\n                                    <constraint firstAttribute=\"bottom\" secondItem=\"sg9-bV-e5u\" secondAttribute=\"bottom\" id=\"ddm-kS-GpL\"/>\n                                    <constraint firstItem=\"R19-7H-MUs\" firstAttribute=\"centerX\" secondItem=\"Nqc-NY-nJ9\" secondAttribute=\"centerX\" id=\"n0d-xg-2GD\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"sg9-bV-e5u\" secondAttribute=\"trailing\" id=\"oQu-fQ-kPu\"/>\n                                    <constraint firstItem=\"R19-7H-MUs\" firstAttribute=\"leading\" secondItem=\"Nqc-NY-nJ9\" secondAttribute=\"leading\" constant=\"8\" id=\"sP5-qg-gWF\"/>\n                                </constraints>\n                            </view>\n                        </subviews>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"Nqc-NY-nJ9\" secondAttribute=\"trailing\" id=\"4Il-F0-ngO\"/>\n                            <constraint firstItem=\"Nqc-NY-nJ9\" firstAttribute=\"top\" secondItem=\"WkE-fx-ml3\" secondAttribute=\"bottom\" id=\"60m-kd-i2h\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"WkE-fx-ml3\" secondAttribute=\"trailing\" id=\"FCT-MK-C7a\"/>\n                            <constraint firstItem=\"WkE-fx-ml3\" firstAttribute=\"leading\" secondItem=\"bqA-Ij-8Lt\" secondAttribute=\"leading\" id=\"NZN-ff-6Jz\"/>\n                            <constraint firstItem=\"Nqc-NY-nJ9\" firstAttribute=\"leading\" secondItem=\"bqA-Ij-8Lt\" secondAttribute=\"leading\" id=\"oj4-Oj-DrH\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"Nqc-NY-nJ9\" secondAttribute=\"bottom\" id=\"paL-BC-oZc\"/>\n                            <constraint firstItem=\"WkE-fx-ml3\" firstAttribute=\"top\" secondItem=\"bqA-Ij-8Lt\" secondAttribute=\"top\" constant=\"20\" id=\"ye5-5N-5XH\"/>\n                        </constraints>\n                    </view>\n                </subviews>\n                <constraints>\n                    <constraint firstItem=\"bqA-Ij-8Lt\" firstAttribute=\"top\" secondItem=\"H2p-sc-9uM\" secondAttribute=\"top\" id=\"28F-pf-A7a\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"bqA-Ij-8Lt\" secondAttribute=\"bottom\" id=\"Yrs-ua-9Hf\"/>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"bqA-Ij-8Lt\" secondAttribute=\"trailing\" id=\"e4J-zY-qX7\"/>\n                    <constraint firstItem=\"bqA-Ij-8Lt\" firstAttribute=\"leading\" secondItem=\"H2p-sc-9uM\" secondAttribute=\"leading\" id=\"gv9-AZ-S5o\"/>\n                </constraints>\n            </tableViewCellContentView>\n            <connections>\n                <outlet property=\"bottomView\" destination=\"Nqc-NY-nJ9\" id=\"HL5-Wa-MJu\"/>\n                <outlet property=\"detailBottomImg\" destination=\"0PX-DI-0KJ\" id=\"xbv-sy-f1u\"/>\n                <outlet property=\"detailBottomLab\" destination=\"l8T-xo-sRw\" id=\"K3I-Fr-79D\"/>\n                <outlet property=\"detailBottomView\" destination=\"lyk-Fc-6wt\" id=\"jY2-n5-eP2\"/>\n                <outlet property=\"detailTopView\" destination=\"8JD-Ho-DcV\" id=\"7MN-6P-4Gq\"/>\n                <outlet property=\"detailView\" destination=\"sg9-bV-e5u\" id=\"EFX-gG-P59\"/>\n                <outlet property=\"titleLab\" destination=\"cNJ-u4-3bW\" id=\"cx9-np-rJY\"/>\n                <outlet property=\"webView\" destination=\"R19-7H-MUs\" id=\"4lR-II-d3T\"/>\n                <outlet property=\"webViewHeightCons\" destination=\"VCC-Oi-L5A\" id=\"HN0-jc-5fm\"/>\n            </connections>\n        </tableViewCell>\n    </objects>\n    <resources>\n        <image name=\"cell_arrow_all\" width=\"7\" height=\"14\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/View/Cell/HCPlayUserInfoCell.swift",
    "content": "\n//\n//  HCPlayUserInfoCell.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/2/6.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport RxDataSources\nimport ReusableKit\nimport NSObject_Rx\n\nfileprivate struct Metric {\n    \n    static let cellHeight : CGFloat = 280\n}\n\nclass HCPlayUserInfoCell: UITableViewCell {\n    \n    @IBOutlet weak var titleLab: UILabel!\n    @IBOutlet weak var introLab: UILabel!\n    @IBOutlet weak var iconImg: UIImageView!\n    @IBOutlet weak var descLab: UILabel!\n    \n    var userInfoModel: Variable<HCPlayUserInfoModel?> = Variable(nil)\n\n    override func awakeFromNib() {\n        super.awakeFromNib()\n        \n        initUI()\n        bindUI()\n    }\n}\n\n// MARK:- 初始化\nextension HCPlayUserInfoCell {\n    \n    private func initUI() {\n        \n        iconImg.layer.masksToBounds = true\n        iconImg.layer.cornerRadius =  iconImg.width / 2\n    }\n    \n    private func bindUI() {\n        \n        userInfoModel.asObservable().subscribe(onNext: { [weak self] model in\n            \n            guard let `self` = self else { return }\n            \n            if let smallLogo = model?.smallLogo {\n                self.iconImg.kf.setImage(with: URL(string: smallLogo))\n            }\n            self.titleLab.text = model?.nickname\n            \n            if let count = model?.followers {\n                let introStr = \"已被\\(self.defaultPlaysCount(count))万人关注\"\n                self.introLab.text = introStr\n            }\n            \n            self.descLab.text = model?.personalSignature\n            \n        }).disposed(by: rx.disposeBag)\n    }\n    \n    private func defaultPlaysCount(_ playsCount: Int) -> String {\n        if playsCount < 10000 {\n            return \"\\(playsCount)\"\n        } else {\n            let result = String(format: \"%.1f万\", Float(playsCount) / 10000.0)\n            return result\n        }\n    }\n\n    static func cellHeight() -> CGFloat {\n        \n        return Metric.cellHeight\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/View/Cell/HCPlayUserInfoCell.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"13771\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"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=\"13772\"/>\n        <capability name=\"Aspect ratio constraints\" minToolsVersion=\"5.1\"/>\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\" id=\"KGk-i7-Jjw\" customClass=\"HCPlayUserInfoCell\" customModule=\"RxXMLY\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"300\"/>\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=\"320\" height=\"299.5\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"lw1-DZ-eTm\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"299.5\"/>\n                        <subviews>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kM7-Od-kEY\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"10\" width=\"320\" height=\"40\"/>\n                                <subviews>\n                                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"主播\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"L25-nq-q7J\">\n                                        <rect key=\"frame\" x=\"15\" y=\"10.5\" width=\"35\" height=\"20.5\"/>\n                                        <fontDescription key=\"fontDescription\" type=\"boldSystem\" pointSize=\"17\"/>\n                                        <nil key=\"textColor\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                </subviews>\n                                <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                <constraints>\n                                    <constraint firstItem=\"L25-nq-q7J\" firstAttribute=\"leading\" secondItem=\"kM7-Od-kEY\" secondAttribute=\"leading\" constant=\"15\" id=\"biH-mu-1yq\"/>\n                                    <constraint firstItem=\"L25-nq-q7J\" firstAttribute=\"centerY\" secondItem=\"kM7-Od-kEY\" secondAttribute=\"centerY\" id=\"j3Z-Fa-hmM\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"40\" id=\"wfu-aG-9Fu\"/>\n                                </constraints>\n                            </view>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"sIK-an-QGD\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"50\" width=\"320\" height=\"80\"/>\n                                <subviews>\n                                    <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"7rO-Le-LM5\">\n                                        <rect key=\"frame\" x=\"15\" y=\"15\" width=\"50\" height=\"50\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"width\" secondItem=\"7rO-Le-LM5\" secondAttribute=\"height\" multiplier=\"1:1\" id=\"1xs-Aj-d2G\"/>\n                                            <constraint firstAttribute=\"width\" constant=\"50\" id=\"LtX-pI-lMi\"/>\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=\"H0D-yz-zdu\">\n                                        <rect key=\"frame\" x=\"75\" y=\"15\" width=\"37.5\" height=\"18\"/>\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=\"Label\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"e5A-Kn-Hpu\">\n                                        <rect key=\"frame\" x=\"75\" y=\"49\" width=\"33\" height=\"16\"/>\n                                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                        <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                    <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"cell_arrow_all\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"bL5-gh-G3T\">\n                                        <rect key=\"frame\" x=\"298\" y=\"33\" width=\"7\" height=\"14\"/>\n                                    </imageView>\n                                </subviews>\n                                <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                <constraints>\n                                    <constraint firstItem=\"e5A-Kn-Hpu\" firstAttribute=\"bottom\" secondItem=\"7rO-Le-LM5\" secondAttribute=\"bottom\" id=\"2wx-Yp-LX0\"/>\n                                    <constraint firstAttribute=\"trailing\" secondItem=\"bL5-gh-G3T\" secondAttribute=\"trailing\" constant=\"15\" id=\"DVA-Km-f2Y\"/>\n                                    <constraint firstItem=\"bL5-gh-G3T\" firstAttribute=\"centerY\" secondItem=\"sIK-an-QGD\" secondAttribute=\"centerY\" id=\"IGa-rC-cXB\"/>\n                                    <constraint firstItem=\"7rO-Le-LM5\" firstAttribute=\"leading\" secondItem=\"sIK-an-QGD\" secondAttribute=\"leading\" constant=\"15\" id=\"f9p-4e-MP1\"/>\n                                    <constraint firstItem=\"H0D-yz-zdu\" firstAttribute=\"leading\" secondItem=\"7rO-Le-LM5\" secondAttribute=\"trailing\" constant=\"10\" id=\"kFd-ga-NNp\"/>\n                                    <constraint firstItem=\"7rO-Le-LM5\" firstAttribute=\"centerY\" secondItem=\"sIK-an-QGD\" secondAttribute=\"centerY\" id=\"o2p-dC-JNU\"/>\n                                    <constraint firstItem=\"H0D-yz-zdu\" firstAttribute=\"top\" secondItem=\"7rO-Le-LM5\" secondAttribute=\"top\" id=\"qwR-iM-m23\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"80\" id=\"yNt-yz-TbM\"/>\n                                    <constraint firstItem=\"e5A-Kn-Hpu\" firstAttribute=\"leading\" secondItem=\"7rO-Le-LM5\" secondAttribute=\"trailing\" constant=\"10\" id=\"zyz-G4-yEj\"/>\n                                </constraints>\n                            </view>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"0gA-Sp-qXI\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"130\" width=\"320\" height=\"120\"/>\n                                <subviews>\n                                    <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"bVb-K2-2RK\">\n                                        <rect key=\"frame\" x=\"15\" y=\"5\" width=\"290\" height=\"110\"/>\n                                    </imageView>\n                                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Label\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" numberOfLines=\"0\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"cNg-Se-PCB\">\n                                        <rect key=\"frame\" x=\"25\" y=\"15\" width=\"270\" height=\"90\"/>\n                                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"15\"/>\n                                        <nil key=\"textColor\"/>\n                                        <nil key=\"highlightedColor\"/>\n                                    </label>\n                                </subviews>\n                                <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                <constraints>\n                                    <constraint firstItem=\"bVb-K2-2RK\" firstAttribute=\"top\" secondItem=\"0gA-Sp-qXI\" secondAttribute=\"top\" constant=\"5\" id=\"9je-1m-PCS\"/>\n                                    <constraint firstItem=\"cNg-Se-PCB\" firstAttribute=\"height\" secondItem=\"bVb-K2-2RK\" secondAttribute=\"height\" constant=\"-20\" id=\"WSN-xR-Y75\"/>\n                                    <constraint firstItem=\"cNg-Se-PCB\" firstAttribute=\"width\" secondItem=\"bVb-K2-2RK\" secondAttribute=\"width\" constant=\"-20\" id=\"cqA-nx-ccc\"/>\n                                    <constraint firstItem=\"bVb-K2-2RK\" firstAttribute=\"centerX\" secondItem=\"0gA-Sp-qXI\" secondAttribute=\"centerX\" id=\"dws-eS-J2p\"/>\n                                    <constraint firstItem=\"bVb-K2-2RK\" firstAttribute=\"centerY\" secondItem=\"0gA-Sp-qXI\" secondAttribute=\"centerY\" id=\"hQI-TD-92L\"/>\n                                    <constraint firstItem=\"cNg-Se-PCB\" firstAttribute=\"centerY\" secondItem=\"bVb-K2-2RK\" secondAttribute=\"centerY\" id=\"jlN-1Q-3Jj\"/>\n                                    <constraint firstItem=\"cNg-Se-PCB\" firstAttribute=\"centerX\" secondItem=\"bVb-K2-2RK\" secondAttribute=\"centerX\" id=\"qkn-9Z-YsQ\"/>\n                                    <constraint firstItem=\"bVb-K2-2RK\" firstAttribute=\"leading\" secondItem=\"0gA-Sp-qXI\" secondAttribute=\"leading\" constant=\"15\" id=\"yzN-3S-mQQ\"/>\n                                </constraints>\n                            </view>\n                            <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"spf-kX-Mgd\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"250\" width=\"320\" height=\"39.5\"/>\n                                <subviews>\n                                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kpg-pu-wIj\">\n                                        <rect key=\"frame\" x=\"53\" y=\"6.5\" width=\"214.5\" height=\"26\"/>\n                                        <subviews>\n                                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"想向主播提问？\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"L9g-R1-VKb\">\n                                                <rect key=\"frame\" x=\"5\" y=\"5\" width=\"93\" height=\"16\"/>\n                                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                                <nil key=\"textColor\"/>\n                                                <nil key=\"highlightedColor\"/>\n                                            </label>\n                                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"邀请TA开通回答\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"5gI-eo-vsb\">\n                                                <rect key=\"frame\" x=\"103\" y=\"5\" width=\"95.5\" height=\"16\"/>\n                                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"13\"/>\n                                                <color key=\"textColor\" red=\"0.98431372549999996\" green=\"0.28235294119999998\" blue=\"0.30980392159999998\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                                <nil key=\"highlightedColor\"/>\n                                            </label>\n                                            <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" verticalHuggingPriority=\"251\" image=\"pay_arrow\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"BbV-7t-3ce\">\n                                                <rect key=\"frame\" x=\"203.5\" y=\"7\" width=\"6\" height=\"12\"/>\n                                            </imageView>\n                                        </subviews>\n                                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                        <constraints>\n                                            <constraint firstItem=\"L9g-R1-VKb\" firstAttribute=\"leading\" secondItem=\"kpg-pu-wIj\" secondAttribute=\"leading\" constant=\"5\" id=\"0Fy-Ul-E2a\"/>\n                                            <constraint firstItem=\"5gI-eo-vsb\" firstAttribute=\"centerY\" secondItem=\"kpg-pu-wIj\" secondAttribute=\"centerY\" id=\"8zZ-0e-Syu\"/>\n                                            <constraint firstAttribute=\"bottom\" secondItem=\"L9g-R1-VKb\" secondAttribute=\"bottom\" constant=\"5\" id=\"H9b-ov-f8w\"/>\n                                            <constraint firstItem=\"BbV-7t-3ce\" firstAttribute=\"centerY\" secondItem=\"kpg-pu-wIj\" secondAttribute=\"centerY\" id=\"Hkh-2X-f6S\"/>\n                                            <constraint firstItem=\"5gI-eo-vsb\" firstAttribute=\"leading\" secondItem=\"L9g-R1-VKb\" secondAttribute=\"trailing\" constant=\"5\" id=\"MHN-wD-zo6\"/>\n                                            <constraint firstItem=\"L9g-R1-VKb\" firstAttribute=\"centerY\" secondItem=\"kpg-pu-wIj\" secondAttribute=\"centerY\" id=\"R4a-Gl-Esb\"/>\n                                            <constraint firstItem=\"BbV-7t-3ce\" firstAttribute=\"leading\" secondItem=\"5gI-eo-vsb\" secondAttribute=\"trailing\" constant=\"5\" id=\"WAS-ex-xXP\"/>\n                                            <constraint firstItem=\"L9g-R1-VKb\" firstAttribute=\"top\" secondItem=\"kpg-pu-wIj\" secondAttribute=\"top\" constant=\"5\" id=\"oWs-X5-hg8\"/>\n                                            <constraint firstAttribute=\"trailing\" secondItem=\"BbV-7t-3ce\" secondAttribute=\"trailing\" constant=\"5\" id=\"qoZ-wb-c7i\"/>\n                                        </constraints>\n                                    </view>\n                                </subviews>\n                                <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                <constraints>\n                                    <constraint firstItem=\"kpg-pu-wIj\" firstAttribute=\"centerY\" secondItem=\"spf-kX-Mgd\" secondAttribute=\"centerY\" id=\"GPh-q4-mW6\"/>\n                                    <constraint firstItem=\"kpg-pu-wIj\" firstAttribute=\"centerX\" secondItem=\"spf-kX-Mgd\" secondAttribute=\"centerX\" id=\"V4B-VD-qhm\"/>\n                                    <constraint firstAttribute=\"height\" constant=\"40\" id=\"bk5-Xb-FUv\"/>\n                                </constraints>\n                            </view>\n                        </subviews>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                        <constraints>\n                            <constraint firstItem=\"kM7-Od-kEY\" firstAttribute=\"top\" secondItem=\"lw1-DZ-eTm\" secondAttribute=\"top\" constant=\"10\" id=\"3ch-ZX-uxp\"/>\n                            <constraint firstItem=\"kM7-Od-kEY\" firstAttribute=\"leading\" secondItem=\"lw1-DZ-eTm\" secondAttribute=\"leading\" id=\"6NZ-yg-Qk9\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"kM7-Od-kEY\" secondAttribute=\"trailing\" id=\"6eU-Mo-T4p\"/>\n                            <constraint firstItem=\"spf-kX-Mgd\" firstAttribute=\"leading\" secondItem=\"lw1-DZ-eTm\" secondAttribute=\"leading\" id=\"74k-7u-zyb\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"sIK-an-QGD\" secondAttribute=\"trailing\" id=\"Dz9-RR-5gT\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"spf-kX-Mgd\" secondAttribute=\"trailing\" id=\"Ffo-i7-Ctn\"/>\n                            <constraint firstItem=\"spf-kX-Mgd\" firstAttribute=\"top\" secondItem=\"0gA-Sp-qXI\" secondAttribute=\"bottom\" id=\"P79-g8-azk\"/>\n                            <constraint firstItem=\"0gA-Sp-qXI\" firstAttribute=\"top\" secondItem=\"sIK-an-QGD\" secondAttribute=\"bottom\" id=\"SOj-Db-oQu\"/>\n                            <constraint firstItem=\"0gA-Sp-qXI\" firstAttribute=\"leading\" secondItem=\"lw1-DZ-eTm\" secondAttribute=\"leading\" id=\"USv-YU-Z8K\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"0gA-Sp-qXI\" secondAttribute=\"trailing\" id=\"euR-jZ-ell\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"spf-kX-Mgd\" secondAttribute=\"bottom\" constant=\"10\" id=\"kF2-6W-1xG\"/>\n                            <constraint firstItem=\"sIK-an-QGD\" firstAttribute=\"leading\" secondItem=\"lw1-DZ-eTm\" secondAttribute=\"leading\" id=\"qfE-N8-6GD\"/>\n                            <constraint firstItem=\"sIK-an-QGD\" firstAttribute=\"top\" secondItem=\"kM7-Od-kEY\" secondAttribute=\"bottom\" id=\"xrk-EZ-jeT\"/>\n                        </constraints>\n                    </view>\n                </subviews>\n                <constraints>\n                    <constraint firstAttribute=\"trailing\" secondItem=\"lw1-DZ-eTm\" secondAttribute=\"trailing\" id=\"0HB-0y-X5q\"/>\n                    <constraint firstAttribute=\"bottom\" secondItem=\"lw1-DZ-eTm\" secondAttribute=\"bottom\" id=\"PPX-WF-l0K\"/>\n                    <constraint firstItem=\"lw1-DZ-eTm\" firstAttribute=\"leading\" secondItem=\"H2p-sc-9uM\" secondAttribute=\"leading\" id=\"doD-Bi-aD0\"/>\n                    <constraint firstItem=\"lw1-DZ-eTm\" firstAttribute=\"top\" secondItem=\"H2p-sc-9uM\" secondAttribute=\"top\" id=\"jhw-5i-gkv\"/>\n                </constraints>\n            </tableViewCellContentView>\n            <connections>\n                <outlet property=\"descLab\" destination=\"cNg-Se-PCB\" id=\"yYX-Yn-1wg\"/>\n                <outlet property=\"iconImg\" destination=\"7rO-Le-LM5\" id=\"0lN-ep-qPb\"/>\n                <outlet property=\"introLab\" destination=\"e5A-Kn-Hpu\" id=\"LaM-FU-MYu\"/>\n                <outlet property=\"titleLab\" destination=\"H0D-yz-zdu\" id=\"Gnj-LP-89c\"/>\n            </connections>\n        </tableViewCell>\n    </objects>\n    <resources>\n        <image name=\"cell_arrow_all\" width=\"7\" height=\"14\"/>\n        <image name=\"pay_arrow\" width=\"6\" height=\"12\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/View/HCPlayHeaderView.swift",
    "content": "\n//\n//  HCPlayHeaderView.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/1/24.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport RxDataSources\nimport ReusableKit\nimport NSObject_Rx\n\nclass HCPlayHeaderView: UIView, NibLoadable {\n    \n    @IBOutlet weak var topView: UIView!\n    \n    @IBOutlet weak var topTitleLab: UILabel!\n    @IBOutlet weak var topImgBackgroundView: UIView!\n    @IBOutlet weak var topImgView: UIImageView!\n    \n    @IBOutlet weak var bottomView: UIView!\n    @IBOutlet weak var bottomCenterView: UIView!\n    \n    @IBOutlet weak var danmuBtn: UIButton!\n    @IBOutlet weak var settingBtn: UIButton!\n    \n    @IBOutlet weak var listBtn: UIButton!\n    @IBOutlet weak var clockBtn: UIButton!\n    @IBOutlet weak var listLab: UILabel!\n    @IBOutlet weak var clockLab: UILabel!\n\n    @IBOutlet weak var playBtn: UIButton!\n    @IBOutlet weak var prevBtn: UIButton!\n    @IBOutlet weak var nextBtn: UIButton!\n    \n    // MARK:- 成功回调\n    typealias AddBlock = (_ isPlay: Bool)->Void\n    var playBtnClickedBlock: AddBlock? = {\n        (_) in return\n    }\n\n    var isPlay: Variable<Bool> = Variable(false)                // 播放状态\n    var playModel: Variable<HCPlayModel?> = Variable(nil)\n\n    private lazy var progressView = HCPlayProgressView.loadFromNib()\n\n    override func awakeFromNib() {\n        super.awakeFromNib()\n        \n        initUI()\n        bindUI()\n    }\n}\n\nextension HCPlayHeaderView {\n    \n    private func initUI() {\n        \n        // 设置样式\n        topImgBackgroundView.layer.shadowColor = kThemeGreyColor.cgColor\n        topImgBackgroundView.layer.shadowOpacity = 0.8\n        topImgBackgroundView.layer.shadowOffset = CGSize(width: -3, height: -3)\n        topImgBackgroundView.layer.shadowRadius = 6\n        \n//        topImgView.layer.masksToBounds = true\n//        topImgView.layer.cornerRadius = 30.0\n        \n        progressView.frame = bottomCenterView.bounds\n        bottomCenterView.addSubview(progressView)\n        progressView.snp.makeConstraints { (make) in\n            make.left.right.top.bottom.equalToSuperview()\n        }\n        \n        // 初始化\n        topTitleLab.text = \"【免费试听】中国有嘻哈火了，是因为经济不好了？？？？\"\n        topImgView.image = UIImage(named: \"favicon\")\n    }\n    \n    private func bindUI() {\n        \n        // 点击事件\n        playBtn.rx.controlEvent(.touchUpInside).subscribe(onNext: { [weak self]  _ in\n            \n            guard let `self` = self else { return }\n            self.playBtn.isSelected = !self.playBtn.isSelected\n            // 通知回调\n            self.playBtnClickedBlock?(self.playBtn.isSelected)\n            \n        }).disposed(by: rx.disposeBag)\n        \n        // 绑定事件\n        isPlay.asObservable().subscribe(onNext: { [weak self] beel in\n            \n            guard let `self` = self else { return }\n            self.playBtn.isSelected = beel\n            \n        }).disposed(by: rx.disposeBag)\n\n        playModel.asObservable().subscribe(onNext: { [weak self] model in\n            \n            guard let `self` = self else { return }\n            self.topTitleLab.text = model?.trackInfo?.title\n            \n            if let coverLarge = model?.trackInfo?.coverLarge {\n                self.topImgView.kf.setImage(with: URL(string: coverLarge))\n            }\n        }).disposed(by: rx.disposeBag)\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/View/HCPlayHeaderView.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"13771\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"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=\"13772\"/>\n        <capability name=\"Aspect ratio constraints\" minToolsVersion=\"5.1\"/>\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=\"HCPlayHeaderView\" customModule=\"RxXMLY\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"500\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"B3V-o1-rv3\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"340\"/>\n                    <subviews>\n                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Label\" lineBreakMode=\"tailTruncation\" numberOfLines=\"0\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Lpc-Cz-v1Z\">\n                            <rect key=\"frame\" x=\"15\" y=\"10\" width=\"345\" height=\"50\"/>\n                            <constraints>\n                                <constraint firstAttribute=\"height\" constant=\"50\" id=\"1wM-Ag-Nwq\"/>\n                            </constraints>\n                            <fontDescription key=\"fontDescription\" type=\"boldSystem\" pointSize=\"20\"/>\n                            <nil key=\"textColor\"/>\n                            <nil key=\"highlightedColor\"/>\n                        </label>\n                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ISk-Jg-Vsk\">\n                            <rect key=\"frame\" x=\"67\" y=\"80\" width=\"240\" height=\"240\"/>\n                            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            <constraints>\n                                <constraint firstAttribute=\"width\" secondItem=\"ISk-Jg-Vsk\" secondAttribute=\"height\" multiplier=\"1:1\" id=\"7gj-hl-KUD\"/>\n                                <constraint firstAttribute=\"width\" constant=\"240\" id=\"dnd-Vq-FDU\"/>\n                            </constraints>\n                        </view>\n                        <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Wim-Iu-BIv\">\n                            <rect key=\"frame\" x=\"67\" y=\"80\" width=\"240\" height=\"240\"/>\n                        </imageView>\n                    </subviews>\n                    <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                    <constraints>\n                        <constraint firstItem=\"ISk-Jg-Vsk\" firstAttribute=\"width\" secondItem=\"Wim-Iu-BIv\" secondAttribute=\"width\" id=\"1Ng-O7-g9e\"/>\n                        <constraint firstAttribute=\"bottom\" secondItem=\"ISk-Jg-Vsk\" secondAttribute=\"bottom\" constant=\"20\" id=\"E55-Qt-4gl\"/>\n                        <constraint firstItem=\"Lpc-Cz-v1Z\" firstAttribute=\"top\" secondItem=\"B3V-o1-rv3\" secondAttribute=\"top\" constant=\"10\" id=\"FKa-uF-5Ro\"/>\n                        <constraint firstItem=\"Lpc-Cz-v1Z\" firstAttribute=\"leading\" secondItem=\"B3V-o1-rv3\" secondAttribute=\"leading\" constant=\"15\" id=\"IVf-hn-kKx\"/>\n                        <constraint firstItem=\"ISk-Jg-Vsk\" firstAttribute=\"centerX\" secondItem=\"B3V-o1-rv3\" secondAttribute=\"centerX\" id=\"KBf-Md-swY\"/>\n                        <constraint firstItem=\"ISk-Jg-Vsk\" firstAttribute=\"centerX\" secondItem=\"Wim-Iu-BIv\" secondAttribute=\"centerX\" id=\"PsW-De-uiP\"/>\n                        <constraint firstItem=\"ISk-Jg-Vsk\" firstAttribute=\"centerY\" secondItem=\"Wim-Iu-BIv\" secondAttribute=\"centerY\" id=\"TS1-ei-GYp\"/>\n                        <constraint firstItem=\"ISk-Jg-Vsk\" firstAttribute=\"height\" secondItem=\"Wim-Iu-BIv\" secondAttribute=\"height\" id=\"Xbm-gB-1Cz\"/>\n                        <constraint firstAttribute=\"trailing\" secondItem=\"Lpc-Cz-v1Z\" secondAttribute=\"trailing\" constant=\"15\" id=\"kCj-ap-ifL\"/>\n                        <constraint firstItem=\"ISk-Jg-Vsk\" firstAttribute=\"top\" secondItem=\"Lpc-Cz-v1Z\" secondAttribute=\"bottom\" constant=\"20\" id=\"v0b-Yi-Eif\"/>\n                    </constraints>\n                </view>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Hlf-3q-9J3\">\n                    <rect key=\"frame\" x=\"0.0\" y=\"340\" width=\"375\" height=\"140\"/>\n                    <subviews>\n                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"gdx-6N-egP\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"40\"/>\n                            <subviews>\n                                <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"9bs-kq-f6v\">\n                                    <rect key=\"frame\" x=\"20\" y=\"7.5\" width=\"25\" height=\"25\"/>\n                                    <state key=\"normal\" backgroundImage=\"toolbar_danmu_n_p\"/>\n                                    <state key=\"highlighted\" backgroundImage=\"toolbar_danmu_h_p\"/>\n                                </button>\n                                <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"yLg-Cs-yfR\">\n                                    <rect key=\"frame\" x=\"330\" y=\"7\" width=\"25\" height=\"25\"/>\n                                    <state key=\"normal\" backgroundImage=\"toolbar_history_n_p\"/>\n                                    <state key=\"highlighted\" backgroundImage=\"toolbar_history_h_p\"/>\n                                </button>\n                            </subviews>\n                            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            <constraints>\n                                <constraint firstItem=\"9bs-kq-f6v\" firstAttribute=\"leading\" secondItem=\"gdx-6N-egP\" secondAttribute=\"leading\" constant=\"20\" id=\"F6D-QZ-eYA\"/>\n                                <constraint firstItem=\"yLg-Cs-yfR\" firstAttribute=\"centerY\" secondItem=\"gdx-6N-egP\" secondAttribute=\"centerY\" id=\"Hqs-BF-8jd\"/>\n                                <constraint firstAttribute=\"height\" constant=\"40\" id=\"dfh-bz-V84\"/>\n                                <constraint firstItem=\"9bs-kq-f6v\" firstAttribute=\"centerY\" secondItem=\"gdx-6N-egP\" secondAttribute=\"centerY\" id=\"nt1-P8-OSp\"/>\n                                <constraint firstAttribute=\"trailing\" secondItem=\"yLg-Cs-yfR\" secondAttribute=\"trailing\" constant=\"20\" id=\"zTL-7m-KfI\"/>\n                            </constraints>\n                        </view>\n                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"CR6-6Y-2NL\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"40\" width=\"375\" height=\"40\"/>\n                            <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            <constraints>\n                                <constraint firstAttribute=\"height\" constant=\"40\" id=\"ecj-zx-KMm\"/>\n                            </constraints>\n                        </view>\n                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"jRU-m1-ZWM\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"80\" width=\"375\" height=\"60\"/>\n                            <subviews>\n                                <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"cGg-9n-Vss\">\n                                    <rect key=\"frame\" x=\"148\" y=\"-9\" width=\"78\" height=\"78\"/>\n                                    <color key=\"tintColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"calibratedWhite\"/>\n                                    <state key=\"normal\" backgroundImage=\"toolbar_play_n_p\"/>\n                                    <state key=\"selected\" backgroundImage=\"toolbar_pause_n_p\"/>\n                                </button>\n                                <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"XVH-Zy-ulN\">\n                                    <rect key=\"frame\" x=\"94\" y=\"18\" width=\"24\" height=\"24\"/>\n                                    <state key=\"normal\" backgroundImage=\"toolbar_prev_n_p\"/>\n                                </button>\n                                <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"KDf-ky-wGh\">\n                                    <rect key=\"frame\" x=\"256\" y=\"18\" width=\"24\" height=\"24\"/>\n                                    <state key=\"normal\" backgroundImage=\"toolbar_next_n_p\"/>\n                                </button>\n                                <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"6Hs-Bj-KQr\">\n                                    <rect key=\"frame\" x=\"20\" y=\"18\" width=\"23\" height=\"23\"/>\n                                    <state key=\"normal\" backgroundImage=\"toolbar_playinglist_n_p\"/>\n                                    <state key=\"highlighted\" backgroundImage=\"toolbar_playinglist_h_p\"/>\n                                </button>\n                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"播放列表\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"bCs-68-y6U\">\n                                    <rect key=\"frame\" x=\"9\" y=\"43\" width=\"45\" height=\"13.5\"/>\n                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"11\"/>\n                                    <color key=\"textColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                    <nil key=\"highlightedColor\"/>\n                                </label>\n                                <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"roundedRect\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"W4c-pp-fpF\">\n                                    <rect key=\"frame\" x=\"332\" y=\"19\" width=\"23\" height=\"23\"/>\n                                    <state key=\"normal\" backgroundImage=\"toolbar_clock_n_p\"/>\n                                    <state key=\"highlighted\" backgroundImage=\"toolbar_clock_h_p\"/>\n                                </button>\n                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"定时关闭\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Oh5-Pi-02H\">\n                                    <rect key=\"frame\" x=\"321\" y=\"44\" width=\"45\" height=\"13.5\"/>\n                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"11\"/>\n                                    <color key=\"textColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                    <nil key=\"highlightedColor\"/>\n                                </label>\n                            </subviews>\n                            <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"calibratedWhite\"/>\n                            <constraints>\n                                <constraint firstItem=\"cGg-9n-Vss\" firstAttribute=\"centerY\" secondItem=\"jRU-m1-ZWM\" secondAttribute=\"centerY\" id=\"89U-es-V1M\"/>\n                                <constraint firstItem=\"bCs-68-y6U\" firstAttribute=\"top\" secondItem=\"6Hs-Bj-KQr\" secondAttribute=\"bottom\" constant=\"2\" id=\"8Xs-T3-Fz0\"/>\n                                <constraint firstItem=\"KDf-ky-wGh\" firstAttribute=\"leading\" secondItem=\"cGg-9n-Vss\" secondAttribute=\"trailing\" constant=\"30\" id=\"9Vx-5U-axO\"/>\n                                <constraint firstItem=\"6Hs-Bj-KQr\" firstAttribute=\"centerY\" secondItem=\"jRU-m1-ZWM\" secondAttribute=\"centerY\" id=\"H5K-6r-TkC\"/>\n                                <constraint firstItem=\"cGg-9n-Vss\" firstAttribute=\"leading\" secondItem=\"XVH-Zy-ulN\" secondAttribute=\"trailing\" constant=\"30\" id=\"JgZ-QT-OsD\"/>\n                                <constraint firstItem=\"bCs-68-y6U\" firstAttribute=\"centerX\" secondItem=\"6Hs-Bj-KQr\" secondAttribute=\"centerX\" id=\"S9g-S8-9l5\"/>\n                                <constraint firstItem=\"cGg-9n-Vss\" firstAttribute=\"centerX\" secondItem=\"jRU-m1-ZWM\" secondAttribute=\"centerX\" id=\"Sq0-o5-vVh\"/>\n                                <constraint firstItem=\"XVH-Zy-ulN\" firstAttribute=\"centerY\" secondItem=\"jRU-m1-ZWM\" secondAttribute=\"centerY\" id=\"U6o-DO-fyG\"/>\n                                <constraint firstItem=\"KDf-ky-wGh\" firstAttribute=\"centerY\" secondItem=\"jRU-m1-ZWM\" secondAttribute=\"centerY\" id=\"UZs-gM-24p\"/>\n                                <constraint firstItem=\"W4c-pp-fpF\" firstAttribute=\"centerY\" secondItem=\"jRU-m1-ZWM\" secondAttribute=\"centerY\" id=\"dZJ-mE-4uV\"/>\n                                <constraint firstItem=\"6Hs-Bj-KQr\" firstAttribute=\"leading\" secondItem=\"jRU-m1-ZWM\" secondAttribute=\"leading\" constant=\"20\" id=\"fwA-vm-2Xe\"/>\n                                <constraint firstItem=\"W4c-pp-fpF\" firstAttribute=\"centerX\" secondItem=\"Oh5-Pi-02H\" secondAttribute=\"centerX\" id=\"z77-gF-CrB\"/>\n                                <constraint firstAttribute=\"trailing\" secondItem=\"W4c-pp-fpF\" secondAttribute=\"trailing\" constant=\"20\" id=\"zoO-xW-LXe\"/>\n                                <constraint firstItem=\"Oh5-Pi-02H\" firstAttribute=\"top\" secondItem=\"W4c-pp-fpF\" secondAttribute=\"bottom\" constant=\"2\" id=\"zpd-E0-WY1\"/>\n                            </constraints>\n                        </view>\n                    </subviews>\n                    <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                    <constraints>\n                        <constraint firstItem=\"jRU-m1-ZWM\" firstAttribute=\"leading\" secondItem=\"Hlf-3q-9J3\" secondAttribute=\"leading\" id=\"0I7-iD-awd\"/>\n                        <constraint firstItem=\"jRU-m1-ZWM\" firstAttribute=\"top\" secondItem=\"CR6-6Y-2NL\" secondAttribute=\"bottom\" id=\"6HG-Mr-lUk\"/>\n                        <constraint firstAttribute=\"trailing\" secondItem=\"jRU-m1-ZWM\" secondAttribute=\"trailing\" id=\"7RU-mo-e1j\"/>\n                        <constraint firstItem=\"gdx-6N-egP\" firstAttribute=\"top\" secondItem=\"Hlf-3q-9J3\" secondAttribute=\"top\" id=\"86z-8C-wsu\"/>\n                        <constraint firstItem=\"CR6-6Y-2NL\" firstAttribute=\"leading\" secondItem=\"Hlf-3q-9J3\" secondAttribute=\"leading\" id=\"8AG-56-Qua\"/>\n                        <constraint firstItem=\"gdx-6N-egP\" firstAttribute=\"leading\" secondItem=\"Hlf-3q-9J3\" secondAttribute=\"leading\" id=\"EJr-yz-5hJ\"/>\n                        <constraint firstAttribute=\"trailing\" secondItem=\"CR6-6Y-2NL\" secondAttribute=\"trailing\" id=\"WOK-42-CgE\"/>\n                        <constraint firstAttribute=\"trailing\" secondItem=\"gdx-6N-egP\" secondAttribute=\"trailing\" id=\"arE-4P-YZY\"/>\n                        <constraint firstAttribute=\"bottom\" secondItem=\"jRU-m1-ZWM\" secondAttribute=\"bottom\" id=\"bTh-QV-vyd\"/>\n                        <constraint firstItem=\"CR6-6Y-2NL\" firstAttribute=\"top\" secondItem=\"gdx-6N-egP\" secondAttribute=\"bottom\" id=\"zc4-M6-uC1\"/>\n                    </constraints>\n                </view>\n            </subviews>\n            <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n            <constraints>\n                <constraint firstAttribute=\"trailing\" secondItem=\"B3V-o1-rv3\" secondAttribute=\"trailing\" id=\"43S-5I-fWe\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"Hlf-3q-9J3\" secondAttribute=\"bottom\" constant=\"20\" id=\"B93-NA-YIp\"/>\n                <constraint firstItem=\"Hlf-3q-9J3\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" id=\"MGN-za-hpI\"/>\n                <constraint firstItem=\"B3V-o1-rv3\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" id=\"Nwb-AN-WOb\"/>\n                <constraint firstItem=\"Hlf-3q-9J3\" firstAttribute=\"top\" secondItem=\"B3V-o1-rv3\" secondAttribute=\"bottom\" id=\"P31-rL-fCX\"/>\n                <constraint firstItem=\"B3V-o1-rv3\" firstAttribute=\"top\" secondItem=\"iN0-l3-epB\" secondAttribute=\"top\" id=\"Ub0-HD-Up4\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"Hlf-3q-9J3\" secondAttribute=\"trailing\" id=\"rdz-Rc-aNQ\"/>\n            </constraints>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <connections>\n                <outlet property=\"bottomCenterView\" destination=\"CR6-6Y-2NL\" id=\"JNI-ce-QbO\"/>\n                <outlet property=\"bottomView\" destination=\"Hlf-3q-9J3\" id=\"7aS-NS-rzJ\"/>\n                <outlet property=\"clockBtn\" destination=\"W4c-pp-fpF\" id=\"azj-MU-LXc\"/>\n                <outlet property=\"clockLab\" destination=\"Oh5-Pi-02H\" id=\"TMW-Vs-hUI\"/>\n                <outlet property=\"danmuBtn\" destination=\"9bs-kq-f6v\" id=\"CzL-l0-1sj\"/>\n                <outlet property=\"listBtn\" destination=\"6Hs-Bj-KQr\" id=\"Qjg-qM-2U6\"/>\n                <outlet property=\"listLab\" destination=\"bCs-68-y6U\" id=\"q1T-ka-DUY\"/>\n                <outlet property=\"nextBtn\" destination=\"KDf-ky-wGh\" id=\"jQ0-5F-47n\"/>\n                <outlet property=\"playBtn\" destination=\"cGg-9n-Vss\" id=\"UdZ-Is-qkJ\"/>\n                <outlet property=\"prevBtn\" destination=\"XVH-Zy-ulN\" id=\"bC8-UX-qBO\"/>\n                <outlet property=\"settingBtn\" destination=\"yLg-Cs-yfR\" id=\"H4A-Q8-Wgb\"/>\n                <outlet property=\"topImgBackgroundView\" destination=\"ISk-Jg-Vsk\" id=\"mhD-ST-IlQ\"/>\n                <outlet property=\"topImgView\" destination=\"Wim-Iu-BIv\" id=\"Kga-Ra-Jhk\"/>\n                <outlet property=\"topTitleLab\" destination=\"Lpc-Cz-v1Z\" id=\"6bL-JL-IkX\"/>\n                <outlet property=\"topView\" destination=\"B3V-o1-rv3\" id=\"bUi-P4-7xK\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"40.5\" y=\"112\"/>\n        </view>\n    </objects>\n    <resources>\n        <image name=\"toolbar_clock_h_p\" width=\"23\" height=\"23\"/>\n        <image name=\"toolbar_clock_n_p\" width=\"23\" height=\"23\"/>\n        <image name=\"toolbar_danmu_h_p\" width=\"25\" height=\"25\"/>\n        <image name=\"toolbar_danmu_n_p\" width=\"25\" height=\"25\"/>\n        <image name=\"toolbar_history_h_p\" width=\"25\" height=\"25\"/>\n        <image name=\"toolbar_history_n_p\" width=\"25\" height=\"25\"/>\n        <image name=\"toolbar_next_n_p\" width=\"24\" height=\"24\"/>\n        <image name=\"toolbar_pause_n_p\" width=\"78\" height=\"78\"/>\n        <image name=\"toolbar_play_n_p\" width=\"78\" height=\"78\"/>\n        <image name=\"toolbar_playinglist_h_p\" width=\"23\" height=\"23\"/>\n        <image name=\"toolbar_playinglist_n_p\" width=\"23\" height=\"23\"/>\n        <image name=\"toolbar_prev_n_p\" width=\"24\" height=\"24\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/View/HCPlayProgressView.swift",
    "content": "//\n//  HCPlayProgressView.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/1/24.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//  播放进度条\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport NSObject_Rx\nimport RxGesture\n\nclass HCPlayProgressView: UIView, NibLoadable {\n    \n    @IBOutlet weak var progressView: UIView!\n    \n    @IBOutlet weak var trackView: UIView!\n    @IBOutlet weak var leftDot: UIView!\n    @IBOutlet weak var rightDot: UIView!\n    @IBOutlet weak var sliderSuperView: UIView!\n    @IBOutlet weak var sliderView: UIView!\n    @IBOutlet weak var tapView: UIView!\n    @IBOutlet weak var leftLab: UILabel!\n    @IBOutlet weak var rightLab: UILabel!\n    @IBOutlet weak var sliderWidthCons: NSLayoutConstraint!\n\n\n    private var sliderOriginWidth: CGFloat = 0.0\n    private var sliderMinWidth: CGFloat = 0.0\n    private var sliderMaxWidth: CGFloat = 0.0\n    \n    private var sliderMinValue: TimeInterval = 0.0         // 单位秒\n    private var sliderMaxValue: TimeInterval = 300.0       // 单位秒\n    private var sliderValue: Variable<TimeInterval> = Variable(0.0)\n\n    override func awakeFromNib() {\n        super.awakeFromNib()\n    \n        initUI()\n        bindUI()\n    }\n}\n\n// MARK:- 初始化\nextension HCPlayProgressView {\n    \n    // MARK:- 初始化\n    private func initUI() {\n    \n        // 设置样式\n        sliderView.layer.masksToBounds = true\n        sliderView.layer.cornerRadius = sliderView.width / 2\n        sliderView.backgroundColor = kThemeTomatoColor\n        leftLab.textColor = kThemeTomatoColor\n        rightLab.textColor = kThemeTomatoColor\n        leftDot.layer.masksToBounds = true\n        leftDot.layer.cornerRadius = leftDot.width / 2\n        rightDot.layer.masksToBounds = true\n        rightDot.layer.cornerRadius = leftDot.width / 2\n        \n        // 添加手势\n        let panGesture = UIPanGestureRecognizer(target: self, action: #selector(HCPlayProgressView.panGesture(sender:)))\n        sliderSuperView.addGestureRecognizer(panGesture)\n        \n        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(HCPlayProgressView.tapGesture(sender:)))\n        tapView.addGestureRecognizer(tapGesture)\n        \n        // 设置初始值\n        sliderMinValue = 0\n        sliderMaxValue = 3661\n        sliderValue.value = 1000\n        \n        // 设置初始值\n        sliderMinWidth = 0.0\n        sliderMaxWidth = progressView.width\n        sliderOriginWidth = CGFloat((sliderValue.value - sliderMinValue) / (sliderMaxValue - sliderMinValue)) * (sliderMaxWidth - sliderMinWidth) + sliderMinWidth\n        \n        sliderWidthCons.constant = sliderOriginWidth\n\n        leftLab.text = HCTimeTools.formatPlayTime(secounds: sliderMinValue)\n        rightLab.text = HCTimeTools.formatPlayTime(secounds: sliderMaxValue)\n    }\n    \n    // MARK:- 绑定事件\n    private func bindUI() {\n        \n        sliderValue.asObservable().subscribe { [weak self] (_) in\n            \n            guard let `self` = self else { return }\n            self.leftLab.text = HCTimeTools.formatPlayTime(secounds: self.sliderValue.value)\n    \n        }.disposed(by: rx.disposeBag)\n    }\n}\n\n// MARK:- 事件处理\nextension HCPlayProgressView {\n    \n    // MARK:- 拖动滑块\n    @objc func panGesture(sender: UIPanGestureRecognizer) {\n\n        if sender.state == .began {\n            \n            sliderOriginWidth = sliderWidthCons.constant\n        } else if sender.state == .changed {\n            \n            let translationX = sender.translation(in: progressView).x\n            HCLog(\"translationX \\(translationX)\")\n            \n            let newSliderWidth = sliderOriginWidth + translationX\n            if newSliderWidth <= sliderMinWidth {\n                sliderWidthCons.constant = sliderMinWidth\n            } else if newSliderWidth >= sliderMaxWidth {\n                sliderWidthCons.constant = sliderMaxWidth\n            } else {\n                sliderWidthCons.constant = newSliderWidth\n            }\n            \n            sliderValue.value = Double(sliderWidthCons.constant / sliderMaxWidth) * (sliderMaxValue - sliderMinValue) + sliderMinValue\n\n        } else if sender.state == .ended {\n            \n            sliderValue.value = Double(sliderWidthCons.constant / sliderMaxWidth) * (sliderMaxValue - sliderMinValue) + sliderMinValue\n        }\n    }\n    \n    // MARK:- 点击滑条\n    @objc func tapGesture(sender: UITapGestureRecognizer) {\n        \n        let locationX = sender.location(in: tapView).x\n        HCLog(\"locationX \\(locationX)\")\n        \n        let newSliderWidth = locationX\n        if newSliderWidth <= sliderMaxWidth {\n            sliderWidthCons.constant = newSliderWidth\n        } else {\n            sliderWidthCons.constant = sliderMaxWidth\n        }\n        \n        sliderValue.value = Double(sliderWidthCons.constant / sliderMaxWidth) * (sliderMaxValue - sliderMinValue) + sliderMinValue\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/View/HCPlayProgressView.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"13196\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"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=\"13173\"/>\n        <capability name=\"Aspect ratio constraints\" minToolsVersion=\"5.1\"/>\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=\"HCPlayProgressView\" customModule=\"RxXMLY\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"40\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"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=\"gcW-eY-kRx\">\n                    <rect key=\"frame\" x=\"16\" y=\"25\" width=\"29\" height=\"14\"/>\n                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"11\"/>\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=\"Wsk-cV-e0L\">\n                    <rect key=\"frame\" x=\"330\" y=\"25\" width=\"29\" height=\"14\"/>\n                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"11\"/>\n                    <nil key=\"textColor\"/>\n                    <nil key=\"highlightedColor\"/>\n                </label>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ADU-qt-jXD\">\n                    <rect key=\"frame\" x=\"20\" y=\"14\" width=\"335\" height=\"1\"/>\n                    <subviews>\n                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"YOQ-L7-1Dr\">\n                            <rect key=\"frame\" x=\"-4\" y=\"-2\" width=\"4\" height=\"4\"/>\n                            <color key=\"backgroundColor\" red=\"0.98431372549999996\" green=\"0.28235294119999998\" blue=\"0.30980392159999998\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                            <constraints>\n                                <constraint firstAttribute=\"width\" secondItem=\"YOQ-L7-1Dr\" secondAttribute=\"height\" id=\"cfM-t7-kVO\"/>\n                                <constraint firstAttribute=\"width\" constant=\"4\" id=\"dOD-CY-hws\"/>\n                            </constraints>\n                        </view>\n                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"EeV-iu-rNb\">\n                            <rect key=\"frame\" x=\"335\" y=\"-2\" width=\"4\" height=\"4\"/>\n                            <color key=\"backgroundColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                            <constraints>\n                                <constraint firstAttribute=\"width\" secondItem=\"EeV-iu-rNb\" secondAttribute=\"height\" id=\"Jg2-55-05h\"/>\n                            </constraints>\n                        </view>\n                        <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Fhz-vu-C3H\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"100\" height=\"1\"/>\n                            <color key=\"backgroundColor\" red=\"0.98431372549999996\" green=\"0.28235294119999998\" blue=\"0.30980392159999998\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                            <constraints>\n                                <constraint firstAttribute=\"width\" constant=\"100\" id=\"9HW-Tx-sme\"/>\n                            </constraints>\n                        </view>\n                    </subviews>\n                    <color key=\"backgroundColor\" white=\"0.66666666666666663\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                    <constraints>\n                        <constraint firstItem=\"YOQ-L7-1Dr\" firstAttribute=\"centerY\" secondItem=\"ADU-qt-jXD\" secondAttribute=\"centerY\" id=\"BhG-yJ-idy\"/>\n                        <constraint firstAttribute=\"trailing\" secondItem=\"EeV-iu-rNb\" secondAttribute=\"trailing\" constant=\"-4\" id=\"Eqj-2M-HMO\"/>\n                        <constraint firstItem=\"EeV-iu-rNb\" firstAttribute=\"centerY\" secondItem=\"ADU-qt-jXD\" secondAttribute=\"centerY\" id=\"MMS-vU-mlg\"/>\n                        <constraint firstItem=\"EeV-iu-rNb\" firstAttribute=\"width\" secondItem=\"YOQ-L7-1Dr\" secondAttribute=\"width\" id=\"hic-mW-2DC\"/>\n                        <constraint firstItem=\"Fhz-vu-C3H\" firstAttribute=\"leading\" secondItem=\"ADU-qt-jXD\" secondAttribute=\"leading\" id=\"jzu-6Y-6ma\"/>\n                        <constraint firstItem=\"Fhz-vu-C3H\" firstAttribute=\"top\" secondItem=\"ADU-qt-jXD\" secondAttribute=\"top\" id=\"k8e-zq-5Mv\"/>\n                        <constraint firstAttribute=\"bottom\" secondItem=\"Fhz-vu-C3H\" secondAttribute=\"bottom\" id=\"pAQ-fd-qo1\"/>\n                        <constraint firstAttribute=\"height\" constant=\"1\" id=\"uRL-mc-BPf\"/>\n                        <constraint firstItem=\"YOQ-L7-1Dr\" firstAttribute=\"leading\" secondItem=\"ADU-qt-jXD\" secondAttribute=\"leading\" constant=\"-4\" id=\"yhw-4B-1uZ\"/>\n                    </constraints>\n                </view>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"zpq-gZ-H1n\">\n                    <rect key=\"frame\" x=\"10\" y=\"1.5\" width=\"355\" height=\"25\"/>\n                    <constraints>\n                        <constraint firstAttribute=\"height\" constant=\"25\" id=\"J5K-ke-OFC\"/>\n                    </constraints>\n                </view>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"qT7-6t-fjy\">\n                    <rect key=\"frame\" x=\"107\" y=\"-2.5\" width=\"26\" height=\"35\"/>\n                    <subviews>\n                        <view userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"N82-kH-HbJ\">\n                            <rect key=\"frame\" x=\"10\" y=\"10\" width=\"6\" height=\"15\"/>\n                            <color key=\"backgroundColor\" red=\"0.98431372549999996\" green=\"0.28235294119999998\" blue=\"0.30980392159999998\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                            <constraints>\n                                <constraint firstAttribute=\"width\" constant=\"6\" id=\"3pi-jI-J4B\"/>\n                                <constraint firstAttribute=\"width\" secondItem=\"N82-kH-HbJ\" secondAttribute=\"height\" multiplier=\"3:7\" id=\"yBw-Ke-Lrc\"/>\n                            </constraints>\n                        </view>\n                    </subviews>\n                    <constraints>\n                        <constraint firstItem=\"N82-kH-HbJ\" firstAttribute=\"top\" secondItem=\"qT7-6t-fjy\" secondAttribute=\"top\" constant=\"10\" id=\"GFs-N6-cbI\"/>\n                        <constraint firstItem=\"N82-kH-HbJ\" firstAttribute=\"centerY\" secondItem=\"qT7-6t-fjy\" secondAttribute=\"centerY\" id=\"Wyz-Cp-XWv\"/>\n                        <constraint firstItem=\"N82-kH-HbJ\" firstAttribute=\"centerX\" secondItem=\"qT7-6t-fjy\" secondAttribute=\"centerX\" id=\"ZlM-MB-iYM\"/>\n                        <constraint firstItem=\"N82-kH-HbJ\" firstAttribute=\"leading\" secondItem=\"qT7-6t-fjy\" secondAttribute=\"leading\" constant=\"10\" id=\"dLZ-Eq-Up4\"/>\n                    </constraints>\n                </view>\n            </subviews>\n            <constraints>\n                <constraint firstItem=\"gcW-eY-kRx\" firstAttribute=\"leading\" secondItem=\"YOQ-L7-1Dr\" secondAttribute=\"leading\" id=\"4FW-gB-kaN\"/>\n                <constraint firstItem=\"gcW-eY-kRx\" firstAttribute=\"top\" secondItem=\"ADU-qt-jXD\" secondAttribute=\"bottom\" constant=\"10\" id=\"4np-Sk-o80\"/>\n                <constraint firstItem=\"zpq-gZ-H1n\" firstAttribute=\"centerY\" secondItem=\"ADU-qt-jXD\" secondAttribute=\"centerY\" id=\"DLk-B8-DcJ\"/>\n                <constraint firstItem=\"zpq-gZ-H1n\" firstAttribute=\"trailing\" secondItem=\"ADU-qt-jXD\" secondAttribute=\"trailing\" constant=\"10\" id=\"Ito-pp-1Zg\"/>\n                <constraint firstItem=\"N82-kH-HbJ\" firstAttribute=\"centerY\" secondItem=\"ADU-qt-jXD\" secondAttribute=\"centerY\" id=\"L7i-nK-rvp\"/>\n                <constraint firstItem=\"ADU-qt-jXD\" firstAttribute=\"leading\" secondItem=\"iN0-l3-epB\" secondAttribute=\"leading\" constant=\"20\" id=\"Q9n-WO-e9D\"/>\n                <constraint firstItem=\"Wsk-cV-e0L\" firstAttribute=\"centerY\" secondItem=\"gcW-eY-kRx\" secondAttribute=\"centerY\" id=\"Rkl-cM-fQU\"/>\n                <constraint firstItem=\"N82-kH-HbJ\" firstAttribute=\"trailing\" secondItem=\"Fhz-vu-C3H\" secondAttribute=\"trailing\" constant=\"3\" id=\"dxs-n8-YFu\"/>\n                <constraint firstItem=\"zpq-gZ-H1n\" firstAttribute=\"leading\" secondItem=\"ADU-qt-jXD\" secondAttribute=\"leading\" constant=\"-10\" id=\"ibA-AH-zqI\"/>\n                <constraint firstItem=\"ADU-qt-jXD\" firstAttribute=\"centerX\" secondItem=\"iN0-l3-epB\" secondAttribute=\"centerX\" id=\"l42-bq-OrY\"/>\n                <constraint firstItem=\"ADU-qt-jXD\" firstAttribute=\"centerY\" secondItem=\"iN0-l3-epB\" secondAttribute=\"centerY\" constant=\"-5\" id=\"rjl-M7-QCh\"/>\n                <constraint firstItem=\"EeV-iu-rNb\" firstAttribute=\"trailing\" secondItem=\"Wsk-cV-e0L\" secondAttribute=\"trailing\" id=\"utW-DQ-BLY\"/>\n            </constraints>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <connections>\n                <outlet property=\"leftDot\" destination=\"YOQ-L7-1Dr\" id=\"nKw-Qu-dw8\"/>\n                <outlet property=\"leftLab\" destination=\"gcW-eY-kRx\" id=\"eaM-n5-aaO\"/>\n                <outlet property=\"progressView\" destination=\"ADU-qt-jXD\" id=\"m0B-t7-ZGZ\"/>\n                <outlet property=\"rightDot\" destination=\"EeV-iu-rNb\" id=\"wQj-N9-cW3\"/>\n                <outlet property=\"rightLab\" destination=\"Wsk-cV-e0L\" id=\"cca-fd-MdI\"/>\n                <outlet property=\"sliderSuperView\" destination=\"qT7-6t-fjy\" id=\"up4-GK-gC2\"/>\n                <outlet property=\"sliderView\" destination=\"N82-kH-HbJ\" id=\"gLP-eg-9mh\"/>\n                <outlet property=\"sliderWidthCons\" destination=\"9HW-Tx-sme\" id=\"aaf-U1-EEY\"/>\n                <outlet property=\"tapView\" destination=\"zpq-gZ-H1n\" id=\"TvQ-Qz-g4o\"/>\n                <outlet property=\"trackView\" destination=\"Fhz-vu-C3H\" id=\"B3K-oY-dgx\"/>\n            </connections>\n        </view>\n    </objects>\n</document>\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/View/HCPlayTitleView.swift",
    "content": "\n\n//\n//  HCPlayTitleView.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/2/5.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//  标题视图\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport RxGesture\nimport RxDataSources\nimport ReusableKit\nimport NSObject_Rx\n\n\nclass HCPlayTitleView: UIView, NibLoadable {\n    \n    @IBOutlet weak var contentView: UIView!\n    @IBOutlet weak var title: UILabel!\n    @IBOutlet weak var leftImg: UIImageView!\n    @IBOutlet weak var rightImg: UIImageView!\n    \n    // MARK:- 成功回调\n    typealias AddBlock = (_ isPlay: Bool)->Void\n    var playBtnClickedBlock: AddBlock? = {\n        (_) in return\n    }\n\n    var isPlay: Variable<Bool> = Variable(false)                // 播放状态\n\n    override func awakeFromNib() {\n        super.awakeFromNib()\n        \n        initUI()\n        bindUI()\n    }\n}\n\n// MARK:- 初始化\nextension HCPlayTitleView {\n    \n    // MARK:- 初始化\n    private func initUI() {\n\n        self.rightImg.animationImages = [UIImage(named: \"playpage_icon_dynamic_rhythm_p1\")!, UIImage(named: \"playpage_icon_dynamic_rhythm_p2\")!, UIImage(named: \"playpage_icon_dynamic_rhythm_p3\")!]\n        self.rightImg.animationDuration = 0.5\n        self.rightImg.animationRepeatCount = 0\n    }\n    \n    // MARK:- 绑定事件\n    private func bindUI() {\n\n        // 绑定事件\n        isPlay.asObservable().subscribe(onNext: { [weak self] beel in\n            \n            guard let `self` = self else { return }\n            // 更新播放状态\n            self.updatePlayStatus(isPlay: beel)\n            // 同时回调处理\n            self.playBtnClickedBlock?(beel)\n            \n        }).disposed(by: rx.disposeBag)\n\n        // 点击事件\n        contentView.rx.tapGesture().when(.recognized).subscribe({ [weak self] _ in\n            \n            guard let `self` = self else { return }\n            self.isPlay.value = !self.isPlay.value\n            \n        }).disposed(by: rx.disposeBag)\n    }\n    \n    // MARK:- 更新UI\n    private func updatePlayStatus(isPlay: Bool) {\n        \n        if isPlay {\n            \n            self.title.text = \"播放中\"\n            self.leftImg.image = UIImage(named: \"playpage_icon_suspend\")\n            self.rightImg.startAnimating()\n            \n        } else {\n            self.title.text = \"已停播\"\n            self.leftImg.image = UIImage(named: \"playpage_icon_play\")\n            self.rightImg.stopAnimating()\n        }\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/View/HCPlayTitleView.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"13771\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"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=\"13772\"/>\n        <capability name=\"Aspect ratio constraints\" minToolsVersion=\"5.1\"/>\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=\"HCPlayTitleView\" customModule=\"RxXMLY\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"160\" height=\"40\"/>\n            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n            <subviews>\n                <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"9rC-Zv-7iH\">\n                    <rect key=\"frame\" x=\"32\" y=\"6\" width=\"96\" height=\"28\"/>\n                    <subviews>\n                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"已停播\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"PqU-9Q-PLL\">\n                            <rect key=\"frame\" x=\"25\" y=\"5\" width=\"46\" height=\"18\"/>\n                            <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"15\"/>\n                            <nil key=\"textColor\"/>\n                            <nil key=\"highlightedColor\"/>\n                        </label>\n                        <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"playpage_icon_play\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Efz-Hs-DoU\">\n                            <rect key=\"frame\" x=\"0.0\" y=\"4\" width=\"20\" height=\"20\"/>\n                            <constraints>\n                                <constraint firstAttribute=\"width\" secondItem=\"Efz-Hs-DoU\" secondAttribute=\"height\" id=\"Gs1-Bj-ilZ\"/>\n                                <constraint firstAttribute=\"width\" constant=\"20\" id=\"MOy-qe-wFR\"/>\n                            </constraints>\n                        </imageView>\n                        <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"playpage_icon_dynamic_rhythm_p1\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"NE8-MX-1B0\">\n                            <rect key=\"frame\" x=\"76\" y=\"6\" width=\"15\" height=\"15\"/>\n                            <constraints>\n                                <constraint firstAttribute=\"width\" secondItem=\"NE8-MX-1B0\" secondAttribute=\"height\" id=\"7N1-mb-XSz\"/>\n                                <constraint firstAttribute=\"width\" constant=\"15\" id=\"VyU-Kz-NXr\"/>\n                            </constraints>\n                        </imageView>\n                    </subviews>\n                    <constraints>\n                        <constraint firstItem=\"PqU-9Q-PLL\" firstAttribute=\"leading\" secondItem=\"Efz-Hs-DoU\" secondAttribute=\"trailing\" constant=\"5\" id=\"1UC-7s-Ey7\"/>\n                        <constraint firstItem=\"NE8-MX-1B0\" firstAttribute=\"leading\" secondItem=\"PqU-9Q-PLL\" secondAttribute=\"trailing\" constant=\"5\" id=\"7ZF-KS-2hq\"/>\n                        <constraint firstItem=\"NE8-MX-1B0\" firstAttribute=\"centerY\" secondItem=\"Efz-Hs-DoU\" secondAttribute=\"centerY\" id=\"Elv-Ze-jgS\"/>\n                        <constraint firstAttribute=\"trailing\" secondItem=\"NE8-MX-1B0\" secondAttribute=\"trailing\" constant=\"5\" id=\"KqN-Cd-PM5\"/>\n                        <constraint firstItem=\"PqU-9Q-PLL\" firstAttribute=\"centerX\" secondItem=\"9rC-Zv-7iH\" secondAttribute=\"centerX\" id=\"Lly-PS-sIK\"/>\n                        <constraint firstAttribute=\"bottom\" secondItem=\"PqU-9Q-PLL\" secondAttribute=\"bottom\" constant=\"5\" id=\"PPu-7c-Uww\"/>\n                        <constraint firstItem=\"PqU-9Q-PLL\" firstAttribute=\"centerY\" secondItem=\"9rC-Zv-7iH\" secondAttribute=\"centerY\" id=\"SxC-sI-12T\"/>\n                        <constraint firstItem=\"PqU-9Q-PLL\" firstAttribute=\"top\" secondItem=\"9rC-Zv-7iH\" secondAttribute=\"top\" constant=\"5\" id=\"csP-zZ-GlM\"/>\n                        <constraint firstItem=\"PqU-9Q-PLL\" firstAttribute=\"centerY\" secondItem=\"Efz-Hs-DoU\" secondAttribute=\"centerY\" id=\"kyg-sn-KG4\"/>\n                    </constraints>\n                </view>\n            </subviews>\n            <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n            <constraints>\n                <constraint firstItem=\"9rC-Zv-7iH\" firstAttribute=\"centerY\" secondItem=\"iN0-l3-epB\" secondAttribute=\"centerY\" id=\"5J5-Vy-9Ro\"/>\n                <constraint firstItem=\"9rC-Zv-7iH\" firstAttribute=\"centerX\" secondItem=\"iN0-l3-epB\" secondAttribute=\"centerX\" id=\"VV1-Qj-e0i\"/>\n            </constraints>\n            <freeformSimulatedSizeMetrics key=\"simulatedDestinationMetrics\"/>\n            <connections>\n                <outlet property=\"contentView\" destination=\"9rC-Zv-7iH\" id=\"KxU-Wb-jOp\"/>\n                <outlet property=\"leftImg\" destination=\"Efz-Hs-DoU\" id=\"8Qw-VP-heQ\"/>\n                <outlet property=\"rightImg\" destination=\"NE8-MX-1B0\" id=\"uWx-9k-sOf\"/>\n                <outlet property=\"title\" destination=\"PqU-9Q-PLL\" id=\"xA6-Rq-T7z\"/>\n            </connections>\n        </view>\n    </objects>\n    <resources>\n        <image name=\"playpage_icon_dynamic_rhythm_p1\" width=\"24\" height=\"24\"/>\n        <image name=\"playpage_icon_play\" width=\"25\" height=\"25\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/View/HCTabbarPlayView.swift",
    "content": "//\n//  HCTabbarPlayView.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/1/23.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//  播放按钮\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport Then\n\n// MARK:- 常量\nfileprivate struct Metric {\n    \n    static let width: CGFloat = 60.0    // 控件大小\n    static let spaceWidth: CGFloat = 8.0    // 圆环间距\n    static let iconWidth: CGFloat = Metric.width - Metric.spaceWidth * 2 + 2   // 播放按钮大小\n}\n\nclass HCTabbarPlayView: UIView {\n\n    var isPlay: Variable<Bool> = Variable(false)                // 播放状态\n\n    // MARK:- 成功回调\n    typealias AddBlock = (_ isPlay: Bool)->Void\n    var playBtnClickedBlock: AddBlock? = {\n        (_) in return\n    }\n\n    private let layerView = UIView().then {\n        $0.layer.shadowColor = kThemeGreyColor.cgColor\n        $0.layer.shadowOpacity = 0.8\n        $0.layer.shadowOffset = CGSize(width: 0, height: -1)\n        $0.layer.shadowRadius = 3\n    }\n    \n    private let backgroundView = UIView().then {\n        $0.backgroundColor = kThemeWhiteColor\n        $0.width = Metric.width\n        $0.layer.masksToBounds = true\n        $0.layer.cornerRadius = $0.width / 2        \n    }\n    \n    private let imageView = UIImageView().then {\n        $0.contentMode = .scaleAspectFit\n        $0.image = UIImage(named: \"favicon\")\n        $0.width = Metric.width - Metric.spaceWidth * 2\n        $0.layer.masksToBounds = true\n        $0.layer.cornerRadius = $0.width / 2\n        $0.layer.borderColor = kThemeGainsboroColor.cgColor\n        $0.layer.borderWidth = 0.5\n    }\n    \n    private let iconView = UIImageView().then {\n        $0.contentMode = .scaleAspectFit\n        $0.image = UIImage(named: \"toolbar_play_n\")\n    }\n\n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        \n        initUI()\n        bindUI()\n        updatePlayStatus(isPlay: false)\n    }\n    \n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n}\n\nextension HCTabbarPlayView {\n    \n    private func initUI() {\n        \n        backgroundView.addSubview(imageView)\n        backgroundView.addSubview(iconView)\n        \n        let layerSubView = UIView()\n        layerSubView.backgroundColor = kThemeWhiteColor\n        layerSubView.layer.masksToBounds = true\n        layerSubView.layer.cornerRadius = Metric.width / 2\n        \n        layerView.addSubview(layerSubView)\n\n        self.addSubview(layerView)\n        self.addSubview(backgroundView)\n\n        layerView.snp.makeConstraints { (make) in\n            make.left.right.top.equalToSuperview()\n            make.height.equalTo(Metric.width)\n        }\n        \n        layerSubView.snp.makeConstraints { (make) in\n            make.left.right.top.equalToSuperview()\n            make.height.equalTo(Metric.width / 5 * 4)\n        }\n\n        backgroundView.snp.makeConstraints { (make) in\n            make.left.right.top.bottom.equalToSuperview()\n        }\n        \n        imageView.snp.makeConstraints { (make) in\n            let width = Metric.width - Metric.spaceWidth * 2\n            make.width.height.equalTo(width)\n            make.left.equalToSuperview().offset(Metric.spaceWidth)\n            make.top.equalToSuperview().offset(Metric.spaceWidth)\n        }\n        \n        iconView.snp.makeConstraints { (make) in\n            make.width.height.equalTo(Metric.iconWidth)\n            make.left.equalToSuperview().offset(Metric.spaceWidth - 1)\n            make.top.equalToSuperview().offset(Metric.spaceWidth - 1)\n        }\n    }\n    \n    // MARK:- 更新UI\n    private func updatePlayStatus(isPlay: Bool) {\n        \n        if isPlay {\n            self.iconView.image = UIImage(named: \"toolbar_pause_n\")\n        } else {\n            self.iconView.image = UIImage(named: \"toolbar_play_n\")\n        }\n    }\n\n    private func bindUI() {\n        \n        // 绑定事件\n        isPlay.asObservable().subscribe(onNext: { [weak self] beel in\n            \n            guard let `self` = self else { return }\n            // 更新状态\n            self.updatePlayStatus(isPlay: beel)\n            // 回调处理\n            self.playBtnClickedBlock?(self.isPlay.value)\n            \n        }).disposed(by: rx.disposeBag)\n\n        // 点击事件\n        self.rx.tapGesture().when(.recognized).subscribe({ [weak self]  _ in\n            \n            guard let `self` = self else { return }\n            // 点击 进入 播放状态\n            self.isPlay.value = true\n            \n        }).disposed(by: rx.disposeBag)\n    }\n    \n    static func with() -> CGFloat {\n        return Metric.width\n    }\n}\n"
  },
  {
    "path": "RxXMLY/Classes/Main/Play/ViewModel/HCPlayViewModel.swift",
    "content": "//\n//  HCPlayViewModel.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2018/2/2.\n//  Copyright © 2018年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport RxSwift\nimport RxCocoa\nimport NSObject_Rx\nimport RxAlamofire\nimport SwiftyJSON\nimport RxDataSources\nimport ObjectMapper\n\nclass HCPlayViewModel: NSObject {\n\n    private let vmDatas = Variable<[(HCPlayModel?, [HCPlayCellModel])]>([])\n}\n\nextension HCPlayViewModel: HCViewModelType {\n    \n    typealias Input = HCPlayInput\n    typealias Output = HCPlayOutput\n    \n    struct HCPlayInput {\n        \n    }\n    \n    struct HCPlayOutput {\n        \n        let sections: Driver<[HCPlaySection]>\n        \n        let requestCommand = PublishSubject<Bool>()\n\n        init(sections: Driver<[HCPlaySection]>) {\n            self.sections = sections\n        }\n    }\n    \n    func transform(input: HCPlayViewModel.HCPlayInput) -> HCPlayViewModel.HCPlayOutput {\n        \n        let temp_sections = vmDatas.asObservable().map({ (sections) -> [HCPlaySection] in\n            return sections.map({ (playModel, models) -> HCPlaySection in\n                return HCPlaySection(playModel: playModel, items: models)\n            })\n        }).asDriver(onErrorJustReturn: [])\n        \n        let output = HCPlayOutput(sections: temp_sections)\n        \n        output.requestCommand.subscribe(onNext: { [weak self] (_) in\n            guard let `self` = self else { return }\n            \n            let request = json(.get, kUrlGetPlayDetail)\n            \n            // 获取数据\n            request.hc_json({\n                \n                return JSON($0)\n            }).mapObject(HCPlayModel.self).subscribe(onNext: { (datas) in\n                \n                guard let albumInfo = datas.albumInfo else { return }\n                guard let noCacheInfo = datas.noCacheInfo else { return }\n                guard let trackInfo = datas.trackInfo else { return }\n                guard let userInfo = datas.userInfo else { return }\n                \n                var playModel = HCPlayModel()\n                playModel.albumInfo = albumInfo\n                playModel.noCacheInfo = noCacheInfo\n                playModel.trackInfo = trackInfo\n                playModel.userInfo = userInfo\n                \n                var sectionArr: [(HCPlayModel?, [HCPlayCellModel])] = []\n                \n                // 订阅专辑、声音简介 部分\n                sectionArr.append((playModel, [HCPlayCellModel(),\n                                               HCPlayCellModel(),\n                                               HCPlayCellModel()]))\n                \n                // 推荐专辑 部分\n                if let count = playModel.noCacheInfo?.associationAlbumsInfo?.count, count > 0 {\n                    sectionArr.append((playModel, [HCPlayCellModel(),\n                                                   HCPlayCellModel(),\n                                                   HCPlayCellModel(),\n                                                   HCPlayCellModel()]))\n                }\n                // 放入空用来占位\n                else {\n                    sectionArr.append((playModel, []))\n                }\n                \n                // 主播介绍 部分\n                if playModel.userInfo != nil {\n                    sectionArr.append((playModel, [HCPlayCellModel(),\n                                                   HCPlayCellModel()]))\n                }\n                \n                self.vmDatas.value = sectionArr\n\n            }).disposed(by: self.rx.disposeBag)\n        }).disposed(by: rx.disposeBag)\n        \n        return output\n    }\n}\n\nstruct HCPlaySection {\n    \n    var playModel: HCPlayModel?\n    var items: [Item]\n}\n\nextension HCPlaySection: SectionModelType {\n    typealias Item = HCPlayCellModel\n    \n    init(original: HCPlaySection, items: [HCPlayCellModel]) {\n        self = original\n        self.items = items\n    }\n}\n\n\n"
  },
  {
    "path": "RxXMLY/Classes/Other/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/14.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\nimport IQKeyboardManagerSwift\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n    var window: UIWindow?\n\n\n    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {\n        \n        UITableView.appearance().estimatedRowHeight = 0\n        UITableView.appearance().estimatedSectionFooterHeight = 0\n        UITableView.appearance().estimatedSectionHeaderHeight = 0\n        \n        IQKeyboardManager.sharedManager().enable = true\n\n        let rootVc = HCMainViewController()\n        window = UIWindow(frame: UIScreen.main.bounds)\n        window?.rootViewController = rootVc\n        window?.makeKeyAndVisible()\n\n        return true\n    }\n\n    func applicationWillResignActive(_ application: UIApplication) {\n        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.\n        // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.\n    }\n\n    func applicationDidEnterBackground(_ application: UIApplication) {\n        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.\n        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.\n    }\n\n    func applicationWillEnterForeground(_ application: UIApplication) {\n        // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.\n    }\n\n    func applicationDidBecomeActive(_ application: UIApplication) {\n        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.\n    }\n\n    func applicationWillTerminate(_ application: UIApplication) {\n        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.\n    }\n}\n\n"
  },
  {
    "path": "RxXMLY/Classes/Other/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"13122.16\" systemVersion=\"17A277\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"BYZ-38-t0r\">\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=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"ViewController\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\">\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=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "RxXMLY/Classes/Other/ViewController.swift",
    "content": "//\n//  ViewController.swift\n//  RxXMLY\n//\n//  Created by sessionCh on 2017/12/14.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport UIKit\n\nclass ViewController: UIViewController {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        // Do any additional setup after loading the view, typically from a nib.\n    }\n\n    override func didReceiveMemoryWarning() {\n        super.didReceiveMemoryWarning()\n        // Dispose of any resources that can be recreated.\n    }\n\n\n}\n\n"
  },
  {
    "path": "RxXMLY/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>CFBundleDisplayName</key>\n\t<string>喜马拉雅FM</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>NSAppTransportSecurity</key>\n\t<dict>\n\t\t<key>NSAllowsArbitraryLoads</key>\n\t\t<true/>\n\t</dict>\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</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "RxXMLY/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"13196\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <device id=\"retina4_7\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"13173\"/>\n        <capability name=\"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                        <subviews>\n                            <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" image=\"Default\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"O04-DJ-LwB\">\n                                <rect key=\"frame\" x=\"30\" y=\"0.0\" width=\"315\" height=\"667\"/>\n                            </imageView>\n                            <label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Copyright © 2017年 sessionCh. All rights reserved.\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"9\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"obG-Y5-kRd\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"632.5\" width=\"375\" height=\"14.5\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"12\"/>\n                                <color key=\"textColor\" white=\"0.33333333333333331\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\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=\"Bcu-3y-fUS\" firstAttribute=\"centerX\" secondItem=\"obG-Y5-kRd\" secondAttribute=\"centerX\" id=\"5cz-MP-9tL\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"O04-DJ-LwB\" secondAttribute=\"trailing\" constant=\"30\" id=\"Q5A-ef-ST2\"/>\n                            <constraint firstItem=\"obG-Y5-kRd\" firstAttribute=\"leading\" secondItem=\"Bcu-3y-fUS\" secondAttribute=\"leading\" symbolic=\"YES\" id=\"SfN-ll-jLj\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"obG-Y5-kRd\" secondAttribute=\"bottom\" constant=\"20\" id=\"Y44-ml-fuU\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"O04-DJ-LwB\" secondAttribute=\"bottom\" id=\"a1A-H6-O80\"/>\n                            <constraint firstItem=\"O04-DJ-LwB\" firstAttribute=\"centerX\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerX\" id=\"cRh-wj-FDZ\"/>\n                            <constraint firstItem=\"O04-DJ-LwB\" firstAttribute=\"top\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"top\" id=\"hsh-ho-urO\"/>\n                            <constraint firstItem=\"O04-DJ-LwB\" firstAttribute=\"centerY\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerY\" id=\"rSh-P9-Ywd\"/>\n                        </constraints>\n                        <viewLayoutGuide key=\"safeArea\" id=\"Bcu-3y-fUS\"/>\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    <resources>\n        <image name=\"Default\" width=\"640\" height=\"960\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "RxXMLY.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 48;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t1B085D382003A1410091694D /* HCMineHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B085D372003A1410091694D /* HCMineHeaderView.swift */; };\n\t\t1B085D3A2003A1660091694D /* HCMineHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1B085D392003A1660091694D /* HCMineHeaderView.xib */; };\n\t\t1B08C00620172DD90037300A /* HCTabbarPlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B08C00520172DD90037300A /* HCTabbarPlayView.swift */; };\n\t\t1B0C3EEB1FE51EEA006BD58F /* JsonTemplate.txt in Sources */ = {isa = PBXBuildFile; fileRef = 1B0C3EEA1FE51EEA006BD58F /* JsonTemplate.txt */; };\n\t\t1B0C3EED1FE5204C006BD58F /* HCRecommendViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B0C3EEC1FE5204C006BD58F /* HCRecommendViewController.swift */; };\n\t\t1B0C3EF01FE52137006BD58F /* HCRefreshable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B0C3EEF1FE52136006BD58F /* HCRefreshable.swift */; };\n\t\t1B0C3EFA1FE52474006BD58F /* HCFocusModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B0C3EF91FE52474006BD58F /* HCFocusModel.swift */; };\n\t\t1B0C3EFC1FE52543006BD58F /* HCSquareModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B0C3EFB1FE52543006BD58F /* HCSquareModel.swift */; };\n\t\t1B0C3F031FE52F23006BD58F /* HCRecommendViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B0C3F021FE52F23006BD58F /* HCRecommendViewModel.swift */; };\n\t\t1B0C3F091FE5320A006BD58F /* HCCategoryModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B0C3F081FE5320A006BD58F /* HCCategoryModel.swift */; };\n\t\t1B0C3F0B1FE53227006BD58F /* HCKeywardsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B0C3F0A1FE53227006BD58F /* HCKeywardsModel.swift */; };\n\t\t1B0C3F0D1FE53577006BD58F /* HCRecommendItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B0C3F0C1FE53577006BD58F /* HCRecommendItemModel.swift */; };\n\t\t1B0C3F101FE53A74006BD58F /* HCViewModelType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B0C3F0F1FE53A74006BD58F /* HCViewModelType.swift */; };\n\t\t1B0C3F121FE54060006BD58F /* RxAlamofire+ObjectMapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B0C3F111FE54060006BD58F /* RxAlamofire+ObjectMapper.swift */; };\n\t\t1B0C3F141FE55505006BD58F /* HCRecommendTopHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B0C3F131FE55505006BD58F /* HCRecommendTopHeaderView.swift */; };\n\t\t1B0C3F161FE5551F006BD58F /* HCRecommendTopHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1B0C3F151FE5551F006BD58F /* HCRecommendTopHeaderView.xib */; };\n\t\t1B0C3F181FE558D4006BD58F /* HCScrollBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B0C3F171FE558D4006BD58F /* HCScrollBarView.swift */; };\n\t\t1B0C3F1C1FE55A39006BD58F /* HCScrollBarCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B0C3F1A1FE55A39006BD58F /* HCScrollBarCell.swift */; };\n\t\t1B0C3F1D1FE55A39006BD58F /* HCScrollBarCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1B0C3F1B1FE55A39006BD58F /* HCScrollBarCell.xib */; };\n\t\t1B0C3F201FE55F52006BD58F /* HCRecommendCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B0C3F1E1FE55F52006BD58F /* HCRecommendCell.swift */; };\n\t\t1B0C3F211FE55F52006BD58F /* HCRecommendCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1B0C3F1F1FE55F52006BD58F /* HCRecommendCell.xib */; };\n\t\t1B0C3F241FE57DD7006BD58F /* HCRecommendFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B0C3F231FE57DD7006BD58F /* HCRecommendFlowLayout.swift */; };\n\t\t1B0E018E20178AC0004E5E5C /* HCPlayViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B0E018D20178AC0004E5E5C /* HCPlayViewController.swift */; };\n\t\t1B15CD1A2005B13F00A9EBFC /* HCSettingCellModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B15CD192005B13F00A9EBFC /* HCSettingCellModel.swift */; };\n\t\t1B15CD1F2005C07300A9EBFC /* HCSettingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B15CD1E2005C07300A9EBFC /* HCSettingViewController.swift */; };\n\t\t1B15CD24200614C900A9EBFC /* HCURLNavigatorManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B15CD23200614C900A9EBFC /* HCURLNavigatorManager.swift */; };\n\t\t1B1F9EAF1FE4F4C80025D675 /* HCNavTitleable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B1F9EAE1FE4F4C80025D675 /* HCNavTitleable.swift */; };\n\t\t1B2A47181FE91D5F0090B1CA /* HCRefreshGifHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2A47171FE91D5F0090B1CA /* HCRefreshGifHeader.swift */; };\n\t\t1B2C66F91FE26CF8003172BE /* HCMainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2C66F81FE26CF8003172BE /* HCMainViewController.swift */; };\n\t\t1B2C66FB1FE26EAB003172BE /* Common.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2C66FA1FE26EAB003172BE /* Common.swift */; };\n\t\t1B2C66FD1FE26F57003172BE /* UIColor+HexColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2C66FC1FE26F57003172BE /* UIColor+HexColor.swift */; };\n\t\t1B2C66FF1FE270AB003172BE /* UIView+Frame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2C66FE1FE270AB003172BE /* UIView+Frame.swift */; };\n\t\t1B2C67011FE27107003172BE /* RequestUrl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2C67001FE27107003172BE /* RequestUrl.swift */; };\n\t\t1B2C67061FE2788B003172BE /* HCBaseNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2C67051FE2788A003172BE /* HCBaseNavigationController.swift */; };\n\t\t1B2C67081FE27910003172BE /* HCNavBackable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2C67071FE27910003172BE /* HCNavBackable.swift */; };\n\t\t1B2C670A1FE27B4C003172BE /* HCHomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2C67091FE27B4C003172BE /* HCHomeViewController.swift */; };\n\t\t1B2C670C1FE27B64003172BE /* HCMineViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2C670B1FE27B64003172BE /* HCMineViewController.swift */; };\n\t\t1B2C670E1FE27B71003172BE /* HCHearViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2C670D1FE27B71003172BE /* HCHearViewController.swift */; };\n\t\t1B2C67101FE27B7A003172BE /* HCFindViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2C670F1FE27B7A003172BE /* HCFindViewController.swift */; };\n\t\t1B2C67121FE2B9EC003172BE /* UIImage+Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2C67111FE2B9EC003172BE /* UIImage+Color.swift */; };\n\t\t1B2C67141FE2BCE0003172BE /* HCNavMessageable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2C67131FE2BCE0003172BE /* HCNavMessageable.swift */; };\n\t\t1B2C67171FE2BF5F003172BE /* HCBaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B2C67161FE2BF5F003172BE /* HCBaseViewController.swift */; };\n\t\t1B3341F31FF255DB008EAF43 /* String+GetSize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B3341F21FF255DB008EAF43 /* String+GetSize.swift */; };\n\t\t1B3525EC1FE6BCF000EC9270 /* HCActivityModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B3525EB1FE6BCF000EC9270 /* HCActivityModel.swift */; };\n\t\t1B359F23200375DE00ADFE9A /* HCMineFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B359F22200375DE00ADFE9A /* HCMineFactory.swift */; };\n\t\t1B3B17A02018354E00386F84 /* HCPlayHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B3B179F2018354E00386F84 /* HCPlayHeaderView.swift */; };\n\t\t1B3B17A22018355C00386F84 /* HCPlayHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1B3B17A12018355C00386F84 /* HCPlayHeaderView.xib */; };\n\t\t1B3CE44E2024217900D7ABC0 /* HCPlayViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B3CE44D2024217900D7ABC0 /* HCPlayViewModel.swift */; };\n\t\t1B3CE4512024228000D7ABC0 /* HCPlayCellModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B3CE4502024228000D7ABC0 /* HCPlayCellModel.swift */; };\n\t\t1B4474B91FE263F200A31004 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1B4474B81FE263F200A31004 /* LaunchScreen.storyboard */; };\n\t\t1B4D79AF200B1F1B00023853 /* HCBoutiqueModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B4D79AE200B1F1B00023853 /* HCBoutiqueModel.swift */; };\n\t\t1B4D79B2200B2A4D00023853 /* HCBoutiqueViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B4D79B1200B2A4D00023853 /* HCBoutiqueViewController.swift */; };\n\t\t1B523658202951A800EFF8B2 /* HCPlayRecommendHeaderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B523656202951A800EFF8B2 /* HCPlayRecommendHeaderCell.swift */; };\n\t\t1B523659202951A800EFF8B2 /* HCPlayRecommendHeaderCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1B523657202951A800EFF8B2 /* HCPlayRecommendHeaderCell.xib */; };\n\t\t1B52365C2029550500EFF8B2 /* HCPlayRecommendCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B52365A2029550500EFF8B2 /* HCPlayRecommendCell.swift */; };\n\t\t1B52365D2029550500EFF8B2 /* HCPlayRecommendCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1B52365B2029550500EFF8B2 /* HCPlayRecommendCell.xib */; };\n\t\t1B52365F2029761700EFF8B2 /* HCAssociationAlbumsInfoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B52365E2029761700EFF8B2 /* HCAssociationAlbumsInfoModel.swift */; };\n\t\t1B523662202989F700EFF8B2 /* HCPlayRecommendFooterCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B523660202989F700EFF8B2 /* HCPlayRecommendFooterCell.swift */; };\n\t\t1B523663202989F700EFF8B2 /* HCPlayRecommendFooterCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1B523661202989F700EFF8B2 /* HCPlayRecommendFooterCell.xib */; };\n\t\t1B52366620298C3E00EFF8B2 /* HCPlayUserInfoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B52366420298C3E00EFF8B2 /* HCPlayUserInfoCell.swift */; };\n\t\t1B52366720298C3E00EFF8B2 /* HCPlayUserInfoCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1B52366520298C3E00EFF8B2 /* HCPlayUserInfoCell.xib */; };\n\t\t1B58CA6F2028039200E1BDAB /* HCPlayTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B58CA6E2028039200E1BDAB /* HCPlayTitleView.swift */; };\n\t\t1B58CA71202803F200E1BDAB /* HCPlayTitleView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1B58CA70202803F200E1BDAB /* HCPlayTitleView.xib */; };\n\t\t1B5C3DDF1FE24B2300587750 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B5C3DDE1FE24B2300587750 /* AppDelegate.swift */; };\n\t\t1B5C3DE11FE24B2300587750 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B5C3DE01FE24B2300587750 /* ViewController.swift */; };\n\t\t1B5C3DE41FE24B2300587750 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1B5C3DE21FE24B2300587750 /* Main.storyboard */; };\n\t\t1B5C3DE61FE24B2300587750 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1B5C3DE51FE24B2300587750 /* Assets.xcassets */; };\n\t\t1B5C3DF41FE24B2400587750 /* RxXMLYTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B5C3DF31FE24B2400587750 /* RxXMLYTests.swift */; };\n\t\t1B5C3DFF1FE24B2400587750 /* RxXMLYUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B5C3DFE1FE24B2400587750 /* RxXMLYUITests.swift */; };\n\t\t1B653DF21FF6493400F2425D /* HCInputValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B653DF11FF6493400F2425D /* HCInputValidator.swift */; };\n\t\t1B6641D41FE4723900DCFFE6 /* HCMineAnchorsable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B6641D21FE4723800DCFFE6 /* HCMineAnchorsable.swift */; };\n\t\t1B6C1F5C200F23D0003C1F87 /* HCBoutiqueSingleHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B6C1F5B200F23D0003C1F87 /* HCBoutiqueSingleHeaderView.swift */; };\n\t\t1B6C1F5E200F23E0003C1F87 /* HCBoutiqueSingleHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1B6C1F5D200F23E0003C1F87 /* HCBoutiqueSingleHeaderView.xib */; };\n\t\t1B6C1F60200F3539003C1F87 /* HCBoutiqueSingleIndexFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B6C1F5F200F3539003C1F87 /* HCBoutiqueSingleIndexFlowLayout.swift */; };\n\t\t1B779DBD2019AC4500EA5916 /* HCTimeTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B779DBC2019AC4500EA5916 /* HCTimeTools.swift */; };\n\t\t1B78C9D91FE7B61F00876F89 /* HCRecommendCellTypeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B78C9D81FE7B61F00876F89 /* HCRecommendCellTypeModel.swift */; };\n\t\t1B78FA551FE3763300ACE9B1 /* HCSearchResultController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B78FA541FE3763300ACE9B1 /* HCSearchResultController.swift */; };\n\t\t1B78FA571FE37B6400ACE9B1 /* HCHomeSearchBarable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B78FA561FE37B6400ACE9B1 /* HCHomeSearchBarable.swift */; };\n\t\t1B79F2931FE3BD7400FF3EC3 /* HCSearchControllerable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B79F2921FE3BD7400FF3EC3 /* HCSearchControllerable.swift */; };\n\t\t1B79F2951FE3BE9300FF3EC3 /* HCSearchController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B79F2941FE3BE9300FF3EC3 /* HCSearchController.swift */; };\n\t\t1B81C0D9200D9C89007E52C3 /* HCBoutiqueIndexCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B81C0D7200D9C89007E52C3 /* HCBoutiqueIndexCell.swift */; };\n\t\t1B81C0DA200D9C89007E52C3 /* HCBoutiqueIndexCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1B81C0D8200D9C89007E52C3 /* HCBoutiqueIndexCell.xib */; };\n\t\t1B81C0DD200DA2D4007E52C3 /* HCBoutiqueIndexFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B81C0DC200DA2D4007E52C3 /* HCBoutiqueIndexFlowLayout.swift */; };\n\t\t1B841BF21FE6C5CF00B07CBF /* HCRecommendSingleCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B841BF01FE6C5CF00B07CBF /* HCRecommendSingleCell.swift */; };\n\t\t1B841BF31FE6C5CF00B07CBF /* HCRecommendSingleCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1B841BF11FE6C5CF00B07CBF /* HCRecommendSingleCell.xib */; };\n\t\t1B8A18FA1FF5EB360046EF52 /* HCOtherLoginModeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B8A18F91FF5EB360046EF52 /* HCOtherLoginModeView.swift */; };\n\t\t1B8A18FC1FF5EB450046EF52 /* HCOtherLoginModeView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1B8A18FB1FF5EB450046EF52 /* HCOtherLoginModeView.xib */; };\n\t\t1B8C545E1FFC81E100987481 /* HCAccountLoginResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B8C545D1FFC81E100987481 /* HCAccountLoginResult.swift */; };\n\t\t1B8C54611FFC870900987481 /* HCAccountLoginViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B8C54601FFC870900987481 /* HCAccountLoginViewModel.swift */; };\n\t\t1B8C54641FFC88A900987481 /* HCAccountLoginService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B8C54631FFC88A900987481 /* HCAccountLoginService.swift */; };\n\t\t1B95152B20274E3F002B834C /* HCAlbumInfoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B95152A20274E3F002B834C /* HCAlbumInfoModel.swift */; };\n\t\t1B95152D20274E71002B834C /* HCPlayModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B95152C20274E71002B834C /* HCPlayModel.swift */; };\n\t\t1B95152F20275043002B834C /* HCNoCacheInfoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B95152E20275043002B834C /* HCNoCacheInfoModel.swift */; };\n\t\t1B951531202750C4002B834C /* HCTrackInfoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B951530202750C4002B834C /* HCTrackInfoModel.swift */; };\n\t\t1B951533202752A5002B834C /* HCPlayUserInfoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B951532202752A5002B834C /* HCPlayUserInfoModel.swift */; };\n\t\t1B988A5A200C419500835E82 /* HCBoutiqueFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B988A59200C419500835E82 /* HCBoutiqueFooterView.swift */; };\n\t\t1B988A5C200C41A400835E82 /* HCBoutiqueFooterView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1B988A5B200C41A400835E82 /* HCBoutiqueFooterView.xib */; };\n\t\t1BA035CF1FE6348600E9892E /* HCRecommendModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BA035CE1FE6348600E9892E /* HCRecommendModel.swift */; };\n\t\t1BA035D11FE642B700E9892E /* HCRecommendHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BA035D01FE642B700E9892E /* HCRecommendHeaderView.swift */; };\n\t\t1BA035D31FE642C200E9892E /* HCRecommendHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1BA035D21FE642C200E9892E /* HCRecommendHeaderView.xib */; };\n\t\t1BA3F8261FE3A8BE00A06CEB /* UIView+Corner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BA3F8251FE3A8BE00A06CEB /* UIView+Corner.swift */; };\n\t\t1BC9B7CC2018C89300569749 /* HCPlayProgressView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1BC9B7CB2018C89300569749 /* HCPlayProgressView.xib */; };\n\t\t1BD029071FE2F71800461204 /* HCNavUniversalable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BD029061FE2F71800461204 /* HCNavUniversalable.swift */; };\n\t\t1BD4C6671FE660F700CFBF5C /* HCRecommendFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BD4C6661FE660F700CFBF5C /* HCRecommendFooterView.swift */; };\n\t\t1BD4C6691FE6610B00CFBF5C /* HCRecommendFooterView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1BD4C6681FE6610B00CFBF5C /* HCRecommendFooterView.xib */; };\n\t\t1BD4C66B1FE668E500CFBF5C /* HCNibloadable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BD4C66A1FE668E500CFBF5C /* HCNibloadable.swift */; };\n\t\t1BD4C66F1FE67EFD00CFBF5C /* HCSquareCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BD4C66D1FE67EFD00CFBF5C /* HCSquareCell.swift */; };\n\t\t1BD4C6701FE67EFD00CFBF5C /* HCSquareCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1BD4C66E1FE67EFD00CFBF5C /* HCSquareCell.xib */; };\n\t\t1BD4C6761FE694E800CFBF5C /* HCSquareFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BD4C6751FE694E800CFBF5C /* HCSquareFlowLayout.swift */; };\n\t\t1BD6536A2003185500B4BD26 /* HCCellStyleable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BD653692003185500B4BD26 /* HCCellStyleable.swift */; };\n\t\t1BD653732003400500B4BD26 /* HCSettingCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BD653722003400500B4BD26 /* HCSettingCell.swift */; };\n\t\t1BD65376200365E800B4BD26 /* HCSettingViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BD65375200365E800B4BD26 /* HCSettingViewModel.swift */; };\n\t\t1BDD66F82024112900509EAA /* HCPlayAlbumCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BDD66F62024112900509EAA /* HCPlayAlbumCell.swift */; };\n\t\t1BDD66F92024112900509EAA /* HCPlayAlbumCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1BDD66F72024112900509EAA /* HCPlayAlbumCell.xib */; };\n\t\t1BE113221FF238BC0018B541 /* HCLoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BE113211FF238BC0018B541 /* HCLoginViewController.swift */; };\n\t\t1BE4E7561FF3865E008705CD /* HCAccountLoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BE4E7551FF3865E008705CD /* HCAccountLoginViewController.swift */; };\n\t\t1BE4E7581FF38684008705CD /* HCThridLoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BE4E7571FF38684008705CD /* HCThridLoginViewController.swift */; };\n\t\t1BE4E7641FF38F7C008705CD /* HCAccountLoginable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BE4E7631FF38F7C008705CD /* HCAccountLoginable.swift */; };\n\t\t1BEA0DB620049D9300A6A03F /* UINavigationBar+ChangeColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BEA0DB520049D9300A6A03F /* UINavigationBar+ChangeColor.swift */; };\n\t\t1BEB29451FE2C2E0001F7C1B /* HCNavHistoryable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BEB29441FE2C2E0001F7C1B /* HCNavHistoryable.swift */; };\n\t\t1BEB29471FE2C49C001F7C1B /* HCNavDownloadable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BEB29461FE2C49C001F7C1B /* HCNavDownloadable.swift */; };\n\t\t1BEB29491FE2C7F8001F7C1B /* HCNavSearchable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BEB29481FE2C7F7001F7C1B /* HCNavSearchable.swift */; };\n\t\t1BEB294B1FE2CA6D001F7C1B /* HCNavSettingable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BEB294A1FE2CA6D001F7C1B /* HCNavSettingable.swift */; };\n\t\t1BEE5BAF20039DBC001B42D2 /* HCMineNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BEE5BAE20039DBC001B42D2 /* HCMineNavigationBar.swift */; };\n\t\t1BEE5BB120039DD5001B42D2 /* HCSearchNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BEE5BB020039DD4001B42D2 /* HCSearchNavigationBar.swift */; };\n\t\t1BEE5BB320039DDD001B42D2 /* HCHomeNavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BEE5BB220039DDD001B42D2 /* HCHomeNavigationBar.swift */; };\n\t\t1BEE8C7B200B314700AB6E36 /* HCBoutiqueViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BEE8C7A200B314600AB6E36 /* HCBoutiqueViewModel.swift */; };\n\t\t1BF0881D2018C223007BA5BA /* HCPlayProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BF0881B2018C223007BA5BA /* HCPlayProgressView.swift */; };\n\t\t1BF1B4E12026EED6003A6365 /* HCPlaySynopsisCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BF1B4DF2026EED6003A6365 /* HCPlaySynopsisCell.swift */; };\n\t\t1BF1B4E22026EED6003A6365 /* HCPlaySynopsisCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1BF1B4E02026EED6003A6365 /* HCPlaySynopsisCell.xib */; };\n\t\t1BF1B4E42026F823003A6365 /* play_synopsis.html in Resources */ = {isa = PBXBuildFile; fileRef = 1BF1B4E32026F823003A6365 /* play_synopsis.html */; };\n\t\t1BF3DAE1200BC2D000B5958E /* HCBoutiqueIndexModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BF3DAE0200BC2D000B5958E /* HCBoutiqueIndexModel.swift */; };\n\t\t1BF3DAE4200BC62500B5958E /* HCBoutiqueIndexHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1BF3DAE3200BC62500B5958E /* HCBoutiqueIndexHeaderView.swift */; };\n\t\t1BF3DAE6200BC6BD00B5958E /* HCBoutiqueIndexHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1BF3DAE5200BC6BD00B5958E /* HCBoutiqueIndexHeaderView.xib */; };\n\t\tB2F72457C5F0BC8D8490F5B6 /* Pods_RxXMLY.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE2E262A5D6978D0DB21709 /* Pods_RxXMLY.framework */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t1B5C3DF01FE24B2400587750 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 1B5C3DD31FE24B2300587750 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 1B5C3DDA1FE24B2300587750;\n\t\t\tremoteInfo = RxXMLY;\n\t\t};\n\t\t1B5C3DFB1FE24B2400587750 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 1B5C3DD31FE24B2300587750 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 1B5C3DDA1FE24B2300587750;\n\t\t\tremoteInfo = RxXMLY;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t1B085D372003A1410091694D /* HCMineHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCMineHeaderView.swift; sourceTree = \"<group>\"; };\n\t\t1B085D392003A1660091694D /* HCMineHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HCMineHeaderView.xib; sourceTree = \"<group>\"; };\n\t\t1B08C00520172DD90037300A /* HCTabbarPlayView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCTabbarPlayView.swift; sourceTree = \"<group>\"; };\n\t\t1B0C3EEA1FE51EEA006BD58F /* JsonTemplate.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = JsonTemplate.txt; sourceTree = \"<group>\"; };\n\t\t1B0C3EEC1FE5204C006BD58F /* HCRecommendViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCRecommendViewController.swift; sourceTree = \"<group>\"; };\n\t\t1B0C3EEF1FE52136006BD58F /* HCRefreshable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HCRefreshable.swift; sourceTree = \"<group>\"; };\n\t\t1B0C3EF91FE52474006BD58F /* HCFocusModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCFocusModel.swift; sourceTree = \"<group>\"; };\n\t\t1B0C3EFB1FE52543006BD58F /* HCSquareModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCSquareModel.swift; sourceTree = \"<group>\"; };\n\t\t1B0C3F021FE52F23006BD58F /* HCRecommendViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCRecommendViewModel.swift; sourceTree = \"<group>\"; };\n\t\t1B0C3F081FE5320A006BD58F /* HCCategoryModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCCategoryModel.swift; sourceTree = \"<group>\"; };\n\t\t1B0C3F0A1FE53227006BD58F /* HCKeywardsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCKeywardsModel.swift; sourceTree = \"<group>\"; };\n\t\t1B0C3F0C1FE53577006BD58F /* HCRecommendItemModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCRecommendItemModel.swift; sourceTree = \"<group>\"; };\n\t\t1B0C3F0F1FE53A74006BD58F /* HCViewModelType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCViewModelType.swift; sourceTree = \"<group>\"; };\n\t\t1B0C3F111FE54060006BD58F /* RxAlamofire+ObjectMapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"RxAlamofire+ObjectMapper.swift\"; sourceTree = \"<group>\"; };\n\t\t1B0C3F131FE55505006BD58F /* HCRecommendTopHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCRecommendTopHeaderView.swift; sourceTree = \"<group>\"; };\n\t\t1B0C3F151FE5551F006BD58F /* HCRecommendTopHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HCRecommendTopHeaderView.xib; sourceTree = \"<group>\"; };\n\t\t1B0C3F171FE558D4006BD58F /* HCScrollBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCScrollBarView.swift; sourceTree = \"<group>\"; };\n\t\t1B0C3F1A1FE55A39006BD58F /* HCScrollBarCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCScrollBarCell.swift; sourceTree = \"<group>\"; };\n\t\t1B0C3F1B1FE55A39006BD58F /* HCScrollBarCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HCScrollBarCell.xib; sourceTree = \"<group>\"; };\n\t\t1B0C3F1E1FE55F52006BD58F /* HCRecommendCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCRecommendCell.swift; sourceTree = \"<group>\"; };\n\t\t1B0C3F1F1FE55F52006BD58F /* HCRecommendCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HCRecommendCell.xib; sourceTree = \"<group>\"; };\n\t\t1B0C3F231FE57DD7006BD58F /* HCRecommendFlowLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCRecommendFlowLayout.swift; sourceTree = \"<group>\"; };\n\t\t1B0E018D20178AC0004E5E5C /* HCPlayViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCPlayViewController.swift; sourceTree = \"<group>\"; };\n\t\t1B15CD192005B13F00A9EBFC /* HCSettingCellModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCSettingCellModel.swift; sourceTree = \"<group>\"; };\n\t\t1B15CD1E2005C07300A9EBFC /* HCSettingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCSettingViewController.swift; sourceTree = \"<group>\"; };\n\t\t1B15CD23200614C900A9EBFC /* HCURLNavigatorManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCURLNavigatorManager.swift; sourceTree = \"<group>\"; };\n\t\t1B1F9EAE1FE4F4C80025D675 /* HCNavTitleable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCNavTitleable.swift; sourceTree = \"<group>\"; };\n\t\t1B2A47171FE91D5F0090B1CA /* HCRefreshGifHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCRefreshGifHeader.swift; sourceTree = \"<group>\"; };\n\t\t1B2C66F81FE26CF8003172BE /* HCMainViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCMainViewController.swift; sourceTree = \"<group>\"; };\n\t\t1B2C66FA1FE26EAB003172BE /* Common.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Common.swift; sourceTree = \"<group>\"; };\n\t\t1B2C66FC1FE26F57003172BE /* UIColor+HexColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"UIColor+HexColor.swift\"; sourceTree = \"<group>\"; };\n\t\t1B2C66FE1FE270AB003172BE /* UIView+Frame.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"UIView+Frame.swift\"; sourceTree = \"<group>\"; };\n\t\t1B2C67001FE27107003172BE /* RequestUrl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RequestUrl.swift; sourceTree = \"<group>\"; };\n\t\t1B2C67051FE2788A003172BE /* HCBaseNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCBaseNavigationController.swift; sourceTree = \"<group>\"; };\n\t\t1B2C67071FE27910003172BE /* HCNavBackable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCNavBackable.swift; sourceTree = \"<group>\"; };\n\t\t1B2C67091FE27B4C003172BE /* HCHomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCHomeViewController.swift; sourceTree = \"<group>\"; };\n\t\t1B2C670B1FE27B64003172BE /* HCMineViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCMineViewController.swift; sourceTree = \"<group>\"; };\n\t\t1B2C670D1FE27B71003172BE /* HCHearViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCHearViewController.swift; sourceTree = \"<group>\"; };\n\t\t1B2C670F1FE27B7A003172BE /* HCFindViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCFindViewController.swift; sourceTree = \"<group>\"; };\n\t\t1B2C67111FE2B9EC003172BE /* UIImage+Color.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"UIImage+Color.swift\"; sourceTree = \"<group>\"; };\n\t\t1B2C67131FE2BCE0003172BE /* HCNavMessageable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCNavMessageable.swift; sourceTree = \"<group>\"; };\n\t\t1B2C67161FE2BF5F003172BE /* HCBaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCBaseViewController.swift; sourceTree = \"<group>\"; };\n\t\t1B3341F21FF255DB008EAF43 /* String+GetSize.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"String+GetSize.swift\"; sourceTree = \"<group>\"; };\n\t\t1B3525EB1FE6BCF000EC9270 /* HCActivityModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCActivityModel.swift; sourceTree = \"<group>\"; };\n\t\t1B359F22200375DE00ADFE9A /* HCMineFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCMineFactory.swift; sourceTree = \"<group>\"; };\n\t\t1B3B179F2018354E00386F84 /* HCPlayHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCPlayHeaderView.swift; sourceTree = \"<group>\"; };\n\t\t1B3B17A12018355C00386F84 /* HCPlayHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HCPlayHeaderView.xib; sourceTree = \"<group>\"; };\n\t\t1B3CE44D2024217900D7ABC0 /* HCPlayViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCPlayViewModel.swift; sourceTree = \"<group>\"; };\n\t\t1B3CE4502024228000D7ABC0 /* HCPlayCellModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCPlayCellModel.swift; sourceTree = \"<group>\"; };\n\t\t1B4474B81FE263F200A31004 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t1B4D79AE200B1F1B00023853 /* HCBoutiqueModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCBoutiqueModel.swift; sourceTree = \"<group>\"; };\n\t\t1B4D79B1200B2A4D00023853 /* HCBoutiqueViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCBoutiqueViewController.swift; sourceTree = \"<group>\"; };\n\t\t1B523656202951A800EFF8B2 /* HCPlayRecommendHeaderCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCPlayRecommendHeaderCell.swift; sourceTree = \"<group>\"; };\n\t\t1B523657202951A800EFF8B2 /* HCPlayRecommendHeaderCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HCPlayRecommendHeaderCell.xib; sourceTree = \"<group>\"; };\n\t\t1B52365A2029550500EFF8B2 /* HCPlayRecommendCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCPlayRecommendCell.swift; sourceTree = \"<group>\"; };\n\t\t1B52365B2029550500EFF8B2 /* HCPlayRecommendCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HCPlayRecommendCell.xib; sourceTree = \"<group>\"; };\n\t\t1B52365E2029761700EFF8B2 /* HCAssociationAlbumsInfoModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCAssociationAlbumsInfoModel.swift; sourceTree = \"<group>\"; };\n\t\t1B523660202989F700EFF8B2 /* HCPlayRecommendFooterCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCPlayRecommendFooterCell.swift; sourceTree = \"<group>\"; };\n\t\t1B523661202989F700EFF8B2 /* HCPlayRecommendFooterCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HCPlayRecommendFooterCell.xib; sourceTree = \"<group>\"; };\n\t\t1B52366420298C3E00EFF8B2 /* HCPlayUserInfoCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCPlayUserInfoCell.swift; sourceTree = \"<group>\"; };\n\t\t1B52366520298C3E00EFF8B2 /* HCPlayUserInfoCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HCPlayUserInfoCell.xib; sourceTree = \"<group>\"; };\n\t\t1B58CA6E2028039200E1BDAB /* HCPlayTitleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCPlayTitleView.swift; sourceTree = \"<group>\"; };\n\t\t1B58CA70202803F200E1BDAB /* HCPlayTitleView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HCPlayTitleView.xib; sourceTree = \"<group>\"; };\n\t\t1B5C3DDB1FE24B2300587750 /* RxXMLY.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RxXMLY.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t1B5C3DDE1FE24B2300587750 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t1B5C3DE01FE24B2300587750 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = \"<group>\"; };\n\t\t1B5C3DE31FE24B2300587750 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t1B5C3DE51FE24B2300587750 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t1B5C3DEA1FE24B2400587750 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t1B5C3DEF1FE24B2400587750 /* RxXMLYTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RxXMLYTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t1B5C3DF31FE24B2400587750 /* RxXMLYTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RxXMLYTests.swift; sourceTree = \"<group>\"; };\n\t\t1B5C3DF51FE24B2400587750 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t1B5C3DFA1FE24B2400587750 /* RxXMLYUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RxXMLYUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t1B5C3DFE1FE24B2400587750 /* RxXMLYUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RxXMLYUITests.swift; sourceTree = \"<group>\"; };\n\t\t1B5C3E001FE24B2400587750 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t1B653DF11FF6493400F2425D /* HCInputValidator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCInputValidator.swift; sourceTree = \"<group>\"; };\n\t\t1B6641D21FE4723800DCFFE6 /* HCMineAnchorsable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HCMineAnchorsable.swift; sourceTree = \"<group>\"; };\n\t\t1B6C1F5B200F23D0003C1F87 /* HCBoutiqueSingleHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCBoutiqueSingleHeaderView.swift; sourceTree = \"<group>\"; };\n\t\t1B6C1F5D200F23E0003C1F87 /* HCBoutiqueSingleHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HCBoutiqueSingleHeaderView.xib; sourceTree = \"<group>\"; };\n\t\t1B6C1F5F200F3539003C1F87 /* HCBoutiqueSingleIndexFlowLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCBoutiqueSingleIndexFlowLayout.swift; sourceTree = \"<group>\"; };\n\t\t1B779DBC2019AC4500EA5916 /* HCTimeTools.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCTimeTools.swift; sourceTree = \"<group>\"; };\n\t\t1B78C9D81FE7B61F00876F89 /* HCRecommendCellTypeModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCRecommendCellTypeModel.swift; sourceTree = \"<group>\"; };\n\t\t1B78FA541FE3763300ACE9B1 /* HCSearchResultController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCSearchResultController.swift; sourceTree = \"<group>\"; };\n\t\t1B78FA561FE37B6400ACE9B1 /* HCHomeSearchBarable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCHomeSearchBarable.swift; sourceTree = \"<group>\"; };\n\t\t1B79F2921FE3BD7400FF3EC3 /* HCSearchControllerable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCSearchControllerable.swift; sourceTree = \"<group>\"; };\n\t\t1B79F2941FE3BE9300FF3EC3 /* HCSearchController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCSearchController.swift; sourceTree = \"<group>\"; };\n\t\t1B81C0D7200D9C89007E52C3 /* HCBoutiqueIndexCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCBoutiqueIndexCell.swift; sourceTree = \"<group>\"; };\n\t\t1B81C0D8200D9C89007E52C3 /* HCBoutiqueIndexCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HCBoutiqueIndexCell.xib; sourceTree = \"<group>\"; };\n\t\t1B81C0DC200DA2D4007E52C3 /* HCBoutiqueIndexFlowLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCBoutiqueIndexFlowLayout.swift; sourceTree = \"<group>\"; };\n\t\t1B841BF01FE6C5CF00B07CBF /* HCRecommendSingleCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCRecommendSingleCell.swift; sourceTree = \"<group>\"; };\n\t\t1B841BF11FE6C5CF00B07CBF /* HCRecommendSingleCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HCRecommendSingleCell.xib; sourceTree = \"<group>\"; };\n\t\t1B8A18F91FF5EB360046EF52 /* HCOtherLoginModeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCOtherLoginModeView.swift; sourceTree = \"<group>\"; };\n\t\t1B8A18FB1FF5EB450046EF52 /* HCOtherLoginModeView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HCOtherLoginModeView.xib; sourceTree = \"<group>\"; };\n\t\t1B8C545D1FFC81E100987481 /* HCAccountLoginResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCAccountLoginResult.swift; sourceTree = \"<group>\"; };\n\t\t1B8C54601FFC870900987481 /* HCAccountLoginViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCAccountLoginViewModel.swift; sourceTree = \"<group>\"; };\n\t\t1B8C54631FFC88A900987481 /* HCAccountLoginService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCAccountLoginService.swift; sourceTree = \"<group>\"; };\n\t\t1B95152A20274E3F002B834C /* HCAlbumInfoModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCAlbumInfoModel.swift; sourceTree = \"<group>\"; };\n\t\t1B95152C20274E71002B834C /* HCPlayModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCPlayModel.swift; sourceTree = \"<group>\"; };\n\t\t1B95152E20275043002B834C /* HCNoCacheInfoModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCNoCacheInfoModel.swift; sourceTree = \"<group>\"; };\n\t\t1B951530202750C4002B834C /* HCTrackInfoModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCTrackInfoModel.swift; sourceTree = \"<group>\"; };\n\t\t1B951532202752A5002B834C /* HCPlayUserInfoModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCPlayUserInfoModel.swift; sourceTree = \"<group>\"; };\n\t\t1B988A59200C419500835E82 /* HCBoutiqueFooterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCBoutiqueFooterView.swift; sourceTree = \"<group>\"; };\n\t\t1B988A5B200C41A400835E82 /* HCBoutiqueFooterView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HCBoutiqueFooterView.xib; sourceTree = \"<group>\"; };\n\t\t1BA035CE1FE6348600E9892E /* HCRecommendModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCRecommendModel.swift; sourceTree = \"<group>\"; };\n\t\t1BA035D01FE642B700E9892E /* HCRecommendHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCRecommendHeaderView.swift; sourceTree = \"<group>\"; };\n\t\t1BA035D21FE642C200E9892E /* HCRecommendHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HCRecommendHeaderView.xib; sourceTree = \"<group>\"; };\n\t\t1BA3F8251FE3A8BE00A06CEB /* UIView+Corner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"UIView+Corner.swift\"; sourceTree = \"<group>\"; };\n\t\t1BC9B7CB2018C89300569749 /* HCPlayProgressView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HCPlayProgressView.xib; sourceTree = \"<group>\"; };\n\t\t1BD029061FE2F71800461204 /* HCNavUniversalable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCNavUniversalable.swift; sourceTree = \"<group>\"; };\n\t\t1BD4C6661FE660F700CFBF5C /* HCRecommendFooterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCRecommendFooterView.swift; sourceTree = \"<group>\"; };\n\t\t1BD4C6681FE6610B00CFBF5C /* HCRecommendFooterView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HCRecommendFooterView.xib; sourceTree = \"<group>\"; };\n\t\t1BD4C66A1FE668E500CFBF5C /* HCNibloadable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCNibloadable.swift; sourceTree = \"<group>\"; };\n\t\t1BD4C66D1FE67EFD00CFBF5C /* HCSquareCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCSquareCell.swift; sourceTree = \"<group>\"; };\n\t\t1BD4C66E1FE67EFD00CFBF5C /* HCSquareCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HCSquareCell.xib; sourceTree = \"<group>\"; };\n\t\t1BD4C6751FE694E800CFBF5C /* HCSquareFlowLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCSquareFlowLayout.swift; sourceTree = \"<group>\"; };\n\t\t1BD653692003185500B4BD26 /* HCCellStyleable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCCellStyleable.swift; sourceTree = \"<group>\"; };\n\t\t1BD653722003400500B4BD26 /* HCSettingCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCSettingCell.swift; sourceTree = \"<group>\"; };\n\t\t1BD65375200365E800B4BD26 /* HCSettingViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCSettingViewModel.swift; sourceTree = \"<group>\"; };\n\t\t1BDD66F62024112900509EAA /* HCPlayAlbumCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCPlayAlbumCell.swift; sourceTree = \"<group>\"; };\n\t\t1BDD66F72024112900509EAA /* HCPlayAlbumCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HCPlayAlbumCell.xib; sourceTree = \"<group>\"; };\n\t\t1BE113211FF238BC0018B541 /* HCLoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCLoginViewController.swift; sourceTree = \"<group>\"; };\n\t\t1BE4E7551FF3865E008705CD /* HCAccountLoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCAccountLoginViewController.swift; sourceTree = \"<group>\"; };\n\t\t1BE4E7571FF38684008705CD /* HCThridLoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCThridLoginViewController.swift; sourceTree = \"<group>\"; };\n\t\t1BE4E7631FF38F7C008705CD /* HCAccountLoginable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCAccountLoginable.swift; sourceTree = \"<group>\"; };\n\t\t1BEA0DB520049D9300A6A03F /* UINavigationBar+ChangeColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"UINavigationBar+ChangeColor.swift\"; sourceTree = \"<group>\"; };\n\t\t1BEB29441FE2C2E0001F7C1B /* HCNavHistoryable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCNavHistoryable.swift; sourceTree = \"<group>\"; };\n\t\t1BEB29461FE2C49C001F7C1B /* HCNavDownloadable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCNavDownloadable.swift; sourceTree = \"<group>\"; };\n\t\t1BEB29481FE2C7F7001F7C1B /* HCNavSearchable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCNavSearchable.swift; sourceTree = \"<group>\"; };\n\t\t1BEB294A1FE2CA6D001F7C1B /* HCNavSettingable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCNavSettingable.swift; sourceTree = \"<group>\"; };\n\t\t1BEE5BAE20039DBC001B42D2 /* HCMineNavigationBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HCMineNavigationBar.swift; sourceTree = \"<group>\"; };\n\t\t1BEE5BB020039DD4001B42D2 /* HCSearchNavigationBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HCSearchNavigationBar.swift; sourceTree = \"<group>\"; };\n\t\t1BEE5BB220039DDD001B42D2 /* HCHomeNavigationBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HCHomeNavigationBar.swift; sourceTree = \"<group>\"; };\n\t\t1BEE8C7A200B314600AB6E36 /* HCBoutiqueViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HCBoutiqueViewModel.swift; sourceTree = \"<group>\"; };\n\t\t1BF0881B2018C223007BA5BA /* HCPlayProgressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCPlayProgressView.swift; sourceTree = \"<group>\"; };\n\t\t1BF1B4DF2026EED6003A6365 /* HCPlaySynopsisCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCPlaySynopsisCell.swift; sourceTree = \"<group>\"; };\n\t\t1BF1B4E02026EED6003A6365 /* HCPlaySynopsisCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HCPlaySynopsisCell.xib; sourceTree = \"<group>\"; };\n\t\t1BF1B4E32026F823003A6365 /* play_synopsis.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = play_synopsis.html; sourceTree = \"<group>\"; };\n\t\t1BF3DAE0200BC2D000B5958E /* HCBoutiqueIndexModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCBoutiqueIndexModel.swift; sourceTree = \"<group>\"; };\n\t\t1BF3DAE3200BC62500B5958E /* HCBoutiqueIndexHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HCBoutiqueIndexHeaderView.swift; sourceTree = \"<group>\"; };\n\t\t1BF3DAE5200BC6BD00B5958E /* HCBoutiqueIndexHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HCBoutiqueIndexHeaderView.xib; sourceTree = \"<group>\"; };\n\t\t48D511ECCED911C27E2B5425 /* Pods-RxXMLY.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-RxXMLY.release.xcconfig\"; path = \"Pods/Target Support Files/Pods-RxXMLY/Pods-RxXMLY.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t5E1F373F4FDFF1ED18A88E2B /* Pods-RxXMLY.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-RxXMLY.debug.xcconfig\"; path = \"Pods/Target Support Files/Pods-RxXMLY/Pods-RxXMLY.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tA3BF366E11AA172CAA4B35D6 /* Pods_RxXMLYTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RxXMLYTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tCEE2E262A5D6978D0DB21709 /* Pods_RxXMLY.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RxXMLY.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tF13256F6BD8BC92C376E457D /* Pods_RxXMLYUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RxXMLYUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t1B5C3DD81FE24B2300587750 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tB2F72457C5F0BC8D8490F5B6 /* Pods_RxXMLY.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t1B5C3DEC1FE24B2400587750 /* 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\t\t1B5C3DF71FE24B2400587750 /* 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\t1B085D472003AAC90091694D /* Manager */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B15CD23200614C900A9EBFC /* HCURLNavigatorManager.swift */,\n\t\t\t);\n\t\t\tpath = Manager;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B08C00320172D9D0037300A /* View */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1BF1B4DE2026E7B6003A6365 /* Cell */,\n\t\t\t\t1B08C00520172DD90037300A /* HCTabbarPlayView.swift */,\n\t\t\t\t1BF0881B2018C223007BA5BA /* HCPlayProgressView.swift */,\n\t\t\t\t1BC9B7CB2018C89300569749 /* HCPlayProgressView.xib */,\n\t\t\t\t1B3B179F2018354E00386F84 /* HCPlayHeaderView.swift */,\n\t\t\t\t1B3B17A12018355C00386F84 /* HCPlayHeaderView.xib */,\n\t\t\t\t1B58CA6E2028039200E1BDAB /* HCPlayTitleView.swift */,\n\t\t\t\t1B58CA70202803F200E1BDAB /* HCPlayTitleView.xib */,\n\t\t\t);\n\t\t\tpath = View;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B08C00420172DB10037300A /* Controller */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tpath = Controller;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B0C3EEE1FE52136006BD58F /* MJRefresh */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B0C3EEF1FE52136006BD58F /* HCRefreshable.swift */,\n\t\t\t);\n\t\t\tpath = MJRefresh;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B0C3EF11FE5233E006BD58F /* Search(搜索) */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B78FA541FE3763300ACE9B1 /* HCSearchResultController.swift */,\n\t\t\t\t1B79F2941FE3BE9300FF3EC3 /* HCSearchController.swift */,\n\t\t\t\t1B0C3EF61FE5236B006BD58F /* View */,\n\t\t\t);\n\t\t\tpath = \"Search(搜索)\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B0C3EF21FE5233E006BD58F /* Recommend(推荐) */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B0C3F221FE57DBA006BD58F /* FlowLayout */,\n\t\t\t\t1B0C3F011FE52F0E006BD58F /* ViewModel */,\n\t\t\t\t1B0C3EF81FE52421006BD58F /* Model */,\n\t\t\t\t1B0C3EF41FE52363006BD58F /* View */,\n\t\t\t\t1B0C3EEC1FE5204C006BD58F /* HCRecommendViewController.swift */,\n\t\t\t);\n\t\t\tpath = \"Recommend(推荐)\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B0C3EF41FE52363006BD58F /* View */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B841BEF1FE6C51600B07CBF /* Cell */,\n\t\t\t\t1BA035D01FE642B700E9892E /* HCRecommendHeaderView.swift */,\n\t\t\t\t1BA035D21FE642C200E9892E /* HCRecommendHeaderView.xib */,\n\t\t\t\t1BD4C6661FE660F700CFBF5C /* HCRecommendFooterView.swift */,\n\t\t\t\t1BD4C6681FE6610B00CFBF5C /* HCRecommendFooterView.xib */,\n\t\t\t\t1B0C3F131FE55505006BD58F /* HCRecommendTopHeaderView.swift */,\n\t\t\t\t1B0C3F151FE5551F006BD58F /* HCRecommendTopHeaderView.xib */,\n\t\t\t);\n\t\t\tpath = View;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B0C3EF61FE5236B006BD58F /* View */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1BEE5BB020039DD4001B42D2 /* HCSearchNavigationBar.swift */,\n\t\t\t);\n\t\t\tpath = View;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B0C3EF71FE523C7006BD58F /* Controller */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B4D79AC200B1ABC00023853 /* Boutique(精品) */,\n\t\t\t\t1B0C3EF21FE5233E006BD58F /* Recommend(推荐) */,\n\t\t\t\t1B0C3EF11FE5233E006BD58F /* Search(搜索) */,\n\t\t\t);\n\t\t\tpath = Controller;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B0C3EF81FE52421006BD58F /* Model */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1BA035CE1FE6348600E9892E /* HCRecommendModel.swift */,\n\t\t\t\t1B0C3F0C1FE53577006BD58F /* HCRecommendItemModel.swift */,\n\t\t\t\t1B0C3EF91FE52474006BD58F /* HCFocusModel.swift */,\n\t\t\t\t1B0C3EFB1FE52543006BD58F /* HCSquareModel.swift */,\n\t\t\t\t1B0C3F081FE5320A006BD58F /* HCCategoryModel.swift */,\n\t\t\t\t1B0C3F0A1FE53227006BD58F /* HCKeywardsModel.swift */,\n\t\t\t\t1B3525EB1FE6BCF000EC9270 /* HCActivityModel.swift */,\n\t\t\t\t1B78C9D81FE7B61F00876F89 /* HCRecommendCellTypeModel.swift */,\n\t\t\t);\n\t\t\tpath = Model;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B0C3F011FE52F0E006BD58F /* ViewModel */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B0C3F021FE52F23006BD58F /* HCRecommendViewModel.swift */,\n\t\t\t);\n\t\t\tpath = ViewModel;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B0C3F0E1FE53A65006BD58F /* ViewModel */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B0C3F0F1FE53A74006BD58F /* HCViewModelType.swift */,\n\t\t\t);\n\t\t\tpath = ViewModel;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B0C3F191FE55921006BD58F /* HCScrollBarView */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B0C3F171FE558D4006BD58F /* HCScrollBarView.swift */,\n\t\t\t\t1B0C3F1A1FE55A39006BD58F /* HCScrollBarCell.swift */,\n\t\t\t\t1B0C3F1B1FE55A39006BD58F /* HCScrollBarCell.xib */,\n\t\t\t);\n\t\t\tpath = HCScrollBarView;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B0C3F221FE57DBA006BD58F /* FlowLayout */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B0C3F231FE57DD7006BD58F /* HCRecommendFlowLayout.swift */,\n\t\t\t\t1BD4C6751FE694E800CFBF5C /* HCSquareFlowLayout.swift */,\n\t\t\t);\n\t\t\tpath = FlowLayout;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B15CD1B2005C02A00A9EBFC /* Setting */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B15CD202005C1A100A9EBFC /* ViewModel */,\n\t\t\t\t1B15CD1C2005C06000A9EBFC /* Model */,\n\t\t\t\t1B15CD1D2005C06000A9EBFC /* View */,\n\t\t\t\t1B15CD1E2005C07300A9EBFC /* HCSettingViewController.swift */,\n\t\t\t);\n\t\t\tpath = Setting;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B15CD1C2005C06000A9EBFC /* Model */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B15CD192005B13F00A9EBFC /* HCSettingCellModel.swift */,\n\t\t\t);\n\t\t\tpath = Model;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B15CD1D2005C06000A9EBFC /* View */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1BD653722003400500B4BD26 /* HCSettingCell.swift */,\n\t\t\t);\n\t\t\tpath = View;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B15CD202005C1A100A9EBFC /* ViewModel */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1BD65375200365E800B4BD26 /* HCSettingViewModel.swift */,\n\t\t\t);\n\t\t\tpath = ViewModel;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B2C66ED1FE26BC5003172BE /* Main */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B2C66F51FE26C8B003172BE /* Home */,\n\t\t\t\t1B2C66F41FE26C8B003172BE /* Hear */,\n\t\t\t\t1B2C66F71FE26C8B003172BE /* Play */,\n\t\t\t\t1B2C66F31FE26C8B003172BE /* Find */,\n\t\t\t\t1B2C66F61FE26C8B003172BE /* Mine */,\n\t\t\t\t1B2C66F81FE26CF8003172BE /* HCMainViewController.swift */,\n\t\t\t);\n\t\t\tpath = Main;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B2C66F31FE26C8B003172BE /* Find */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B2C670F1FE27B7A003172BE /* HCFindViewController.swift */,\n\t\t\t);\n\t\t\tpath = Find;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B2C66F41FE26C8B003172BE /* Hear */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B2C670D1FE27B71003172BE /* HCHearViewController.swift */,\n\t\t\t);\n\t\t\tpath = Hear;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B2C66F51FE26C8B003172BE /* Home */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B0C3EF71FE523C7006BD58F /* Controller */,\n\t\t\t\t1B78FA521FE375FB00ACE9B1 /* View */,\n\t\t\t\t1B4D79B0200B228300023853 /* Model */,\n\t\t\t\t1B2C67091FE27B4C003172BE /* HCHomeViewController.swift */,\n\t\t\t);\n\t\t\tpath = Home;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B2C66F61FE26C8B003172BE /* Mine */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B6641CD1FE4699F00DCFFE6 /* Controller */,\n\t\t\t\t1BD65374200365DB00B4BD26 /* ViewModel */,\n\t\t\t\t1B6641CE1FE4699F00DCFFE6 /* View */,\n\t\t\t\t1B359F21200375C900ADFE9A /* Model */,\n\t\t\t\t1B2C670B1FE27B64003172BE /* HCMineViewController.swift */,\n\t\t\t\t1B359F22200375DE00ADFE9A /* HCMineFactory.swift */,\n\t\t\t);\n\t\t\tpath = Mine;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B2C66F71FE26C8B003172BE /* Play */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B3CE44F2024227800D7ABC0 /* Model */,\n\t\t\t\t1B08C00320172D9D0037300A /* View */,\n\t\t\t\t1B3CE44C2024216700D7ABC0 /* ViewModel */,\n\t\t\t\t1B08C00420172DB10037300A /* Controller */,\n\t\t\t\t1B0E018D20178AC0004E5E5C /* HCPlayViewController.swift */,\n\t\t\t);\n\t\t\tpath = Play;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B2C67021FE2782E003172BE /* HCBaseNavigationController */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B2C67051FE2788A003172BE /* HCBaseNavigationController.swift */,\n\t\t\t);\n\t\t\tpath = HCBaseNavigationController;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B2C67031FE2785D003172BE /* UIView */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1BD4C66C1FE669A000CFBF5C /* HCNibloadable */,\n\t\t\t\t1B6641D11FE4723800DCFFE6 /* HCMineAnchorsable */,\n\t\t\t\t1B79F2911FE3BD2B00FF3EC3 /* HCSearchBarable */,\n\t\t\t);\n\t\t\tpath = UIView;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B2C67041FE2785D003172BE /* UINavigationBar */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B1F9EAE1FE4F4C80025D675 /* HCNavTitleable.swift */,\n\t\t\t\t1B2C67071FE27910003172BE /* HCNavBackable.swift */,\n\t\t\t\t1B2C67131FE2BCE0003172BE /* HCNavMessageable.swift */,\n\t\t\t\t1BEB29441FE2C2E0001F7C1B /* HCNavHistoryable.swift */,\n\t\t\t\t1BEB29461FE2C49C001F7C1B /* HCNavDownloadable.swift */,\n\t\t\t\t1BEB29481FE2C7F7001F7C1B /* HCNavSearchable.swift */,\n\t\t\t\t1BEB294A1FE2CA6D001F7C1B /* HCNavSettingable.swift */,\n\t\t\t\t1BD029061FE2F71800461204 /* HCNavUniversalable.swift */,\n\t\t\t);\n\t\t\tpath = UINavigationBar;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B2C67151FE2BF52003172BE /* HCBaseViewController */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B2C67161FE2BF5F003172BE /* HCBaseViewController.swift */,\n\t\t\t);\n\t\t\tpath = HCBaseViewController;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B359F21200375C900ADFE9A /* Model */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tpath = Model;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B3CE44C2024216700D7ABC0 /* ViewModel */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B3CE44D2024217900D7ABC0 /* HCPlayViewModel.swift */,\n\t\t\t);\n\t\t\tpath = ViewModel;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B3CE44F2024227800D7ABC0 /* Model */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B3CE4502024228000D7ABC0 /* HCPlayCellModel.swift */,\n\t\t\t\t1B95152C20274E71002B834C /* HCPlayModel.swift */,\n\t\t\t\t1B95152A20274E3F002B834C /* HCAlbumInfoModel.swift */,\n\t\t\t\t1B95152E20275043002B834C /* HCNoCacheInfoModel.swift */,\n\t\t\t\t1B951530202750C4002B834C /* HCTrackInfoModel.swift */,\n\t\t\t\t1B951532202752A5002B834C /* HCPlayUserInfoModel.swift */,\n\t\t\t\t1B52365E2029761700EFF8B2 /* HCAssociationAlbumsInfoModel.swift */,\n\t\t\t);\n\t\t\tpath = Model;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B4D79AC200B1ABC00023853 /* Boutique(精品) */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B81C0DB200DA2B2007E52C3 /* FlowLayout */,\n\t\t\t\t1BF3DAE2200BC5F700B5958E /* View */,\n\t\t\t\t1BEE8C79200B314600AB6E36 /* ViewModel */,\n\t\t\t\t1B4D79AD200B1F0100023853 /* Model */,\n\t\t\t\t1B4D79B1200B2A4D00023853 /* HCBoutiqueViewController.swift */,\n\t\t\t);\n\t\t\tpath = \"Boutique(精品)\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B4D79AD200B1F0100023853 /* Model */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B4D79AE200B1F1B00023853 /* HCBoutiqueModel.swift */,\n\t\t\t\t1BF3DAE0200BC2D000B5958E /* HCBoutiqueIndexModel.swift */,\n\t\t\t);\n\t\t\tpath = Model;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B4D79B0200B228300023853 /* Model */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tpath = Model;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B5C3DD21FE24B2300587750 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B5C3DDD1FE24B2300587750 /* RxXMLY */,\n\t\t\t\t1B5C3DF21FE24B2400587750 /* RxXMLYTests */,\n\t\t\t\t1B5C3DFD1FE24B2400587750 /* RxXMLYUITests */,\n\t\t\t\t1B5C3DDC1FE24B2300587750 /* Products */,\n\t\t\t\tEB5627AF7526B233780832A7 /* Pods */,\n\t\t\t\tB27CCBCC61291E0C263DCE36 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B5C3DDC1FE24B2300587750 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B5C3DDB1FE24B2300587750 /* RxXMLY.app */,\n\t\t\t\t1B5C3DEF1FE24B2400587750 /* RxXMLYTests.xctest */,\n\t\t\t\t1B5C3DFA1FE24B2400587750 /* RxXMLYUITests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B5C3DDD1FE24B2300587750 /* RxXMLY */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B5C3E0C1FE24EBD00587750 /* Classes */,\n\t\t\t\t1B5C3DE51FE24B2300587750 /* Assets.xcassets */,\n\t\t\t\t1B5C3DEA1FE24B2400587750 /* Info.plist */,\n\t\t\t\t1B4474B81FE263F200A31004 /* LaunchScreen.storyboard */,\n\t\t\t);\n\t\t\tpath = RxXMLY;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B5C3DF21FE24B2400587750 /* RxXMLYTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B5C3DF31FE24B2400587750 /* RxXMLYTests.swift */,\n\t\t\t\t1B5C3DF51FE24B2400587750 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = RxXMLYTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B5C3DFD1FE24B2400587750 /* RxXMLYUITests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B5C3DFE1FE24B2400587750 /* RxXMLYUITests.swift */,\n\t\t\t\t1B5C3E001FE24B2400587750 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = RxXMLYUITests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B5C3E0C1FE24EBD00587750 /* Classes */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B5C3E0D1FE24EBD00587750 /* Common */,\n\t\t\t\t1B2C66ED1FE26BC5003172BE /* Main */,\n\t\t\t\t1B5C3E171FE24EBD00587750 /* Other */,\n\t\t\t);\n\t\t\tpath = Classes;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B5C3E0D1FE24EBD00587750 /* Common */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B085D472003AAC90091694D /* Manager */,\n\t\t\t\t1BE53B671FFE18DF00D7042B /* Service */,\n\t\t\t\t1B653DF01FF6492800F2425D /* Tools */,\n\t\t\t\t1B5C3E0E1FE24EBD00587750 /* CustomUI */,\n\t\t\t\t1B5C3E0F1FE24EBD00587750 /* Extension */,\n\t\t\t\t1B5C3E101FE24EBD00587750 /* Protocol */,\n\t\t\t\t1B2C66FA1FE26EAB003172BE /* Common.swift */,\n\t\t\t\t1B2C67001FE27107003172BE /* RequestUrl.swift */,\n\t\t\t\t1B0C3EEA1FE51EEA006BD58F /* JsonTemplate.txt */,\n\t\t\t\t1BF1B4E32026F823003A6365 /* play_synopsis.html */,\n\t\t\t);\n\t\t\tpath = Common;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B5C3E0E1FE24EBD00587750 /* CustomUI */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1BEE8C78200B2E0D00AB6E36 /* HCRefreshGifHeader */,\n\t\t\t\t1B0C3F191FE55921006BD58F /* HCScrollBarView */,\n\t\t\t\t1B2C67151FE2BF52003172BE /* HCBaseViewController */,\n\t\t\t\t1B2C67021FE2782E003172BE /* HCBaseNavigationController */,\n\t\t\t);\n\t\t\tpath = CustomUI;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B5C3E0F1FE24EBD00587750 /* Extension */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B3341F21FF255DB008EAF43 /* String+GetSize.swift */,\n\t\t\t\t1B2C66FC1FE26F57003172BE /* UIColor+HexColor.swift */,\n\t\t\t\t1B2C66FE1FE270AB003172BE /* UIView+Frame.swift */,\n\t\t\t\t1B2C67111FE2B9EC003172BE /* UIImage+Color.swift */,\n\t\t\t\t1BA3F8251FE3A8BE00A06CEB /* UIView+Corner.swift */,\n\t\t\t\t1B0C3F111FE54060006BD58F /* RxAlamofire+ObjectMapper.swift */,\n\t\t\t\t1BEA0DB520049D9300A6A03F /* UINavigationBar+ChangeColor.swift */,\n\t\t\t);\n\t\t\tpath = Extension;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B5C3E101FE24EBD00587750 /* Protocol */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1BD653682003184300B4BD26 /* HCCellStyleable */,\n\t\t\t\t1B0C3F0E1FE53A65006BD58F /* ViewModel */,\n\t\t\t\t1B0C3EEE1FE52136006BD58F /* MJRefresh */,\n\t\t\t\t1B2C67041FE2785D003172BE /* UINavigationBar */,\n\t\t\t\t1B2C67031FE2785D003172BE /* UIView */,\n\t\t\t);\n\t\t\tpath = Protocol;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B5C3E171FE24EBD00587750 /* Other */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B5C3DDE1FE24B2300587750 /* AppDelegate.swift */,\n\t\t\t\t1B5C3DE01FE24B2300587750 /* ViewController.swift */,\n\t\t\t\t1B5C3DE21FE24B2300587750 /* Main.storyboard */,\n\t\t\t);\n\t\t\tpath = Other;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B653DF01FF6492800F2425D /* Tools */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B653DF11FF6493400F2425D /* HCInputValidator.swift */,\n\t\t\t\t1B779DBC2019AC4500EA5916 /* HCTimeTools.swift */,\n\t\t\t);\n\t\t\tpath = Tools;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B6641CD1FE4699F00DCFFE6 /* Controller */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B15CD1B2005C02A00A9EBFC /* Setting */,\n\t\t\t\t1BE1131E1FF2386C0018B541 /* Login */,\n\t\t\t);\n\t\t\tpath = Controller;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B6641CE1FE4699F00DCFFE6 /* View */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1BEE5BAE20039DBC001B42D2 /* HCMineNavigationBar.swift */,\n\t\t\t\t1B085D372003A1410091694D /* HCMineHeaderView.swift */,\n\t\t\t\t1B085D392003A1660091694D /* HCMineHeaderView.xib */,\n\t\t\t);\n\t\t\tpath = View;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B6641D11FE4723800DCFFE6 /* HCMineAnchorsable */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B6641D21FE4723800DCFFE6 /* HCMineAnchorsable.swift */,\n\t\t\t);\n\t\t\tpath = HCMineAnchorsable;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B78FA521FE375FB00ACE9B1 /* View */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1BEE5BB220039DDD001B42D2 /* HCHomeNavigationBar.swift */,\n\t\t\t);\n\t\t\tpath = View;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B79F2911FE3BD2B00FF3EC3 /* HCSearchBarable */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B78FA561FE37B6400ACE9B1 /* HCHomeSearchBarable.swift */,\n\t\t\t\t1B79F2921FE3BD7400FF3EC3 /* HCSearchControllerable.swift */,\n\t\t\t);\n\t\t\tpath = HCSearchBarable;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B81C0D6200D9C58007E52C3 /* Cell */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B81C0D7200D9C89007E52C3 /* HCBoutiqueIndexCell.swift */,\n\t\t\t\t1B81C0D8200D9C89007E52C3 /* HCBoutiqueIndexCell.xib */,\n\t\t\t);\n\t\t\tpath = Cell;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B81C0DB200DA2B2007E52C3 /* FlowLayout */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B81C0DC200DA2D4007E52C3 /* HCBoutiqueIndexFlowLayout.swift */,\n\t\t\t\t1B6C1F5F200F3539003C1F87 /* HCBoutiqueSingleIndexFlowLayout.swift */,\n\t\t\t);\n\t\t\tpath = FlowLayout;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B841BEF1FE6C51600B07CBF /* Cell */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1BD4C66D1FE67EFD00CFBF5C /* HCSquareCell.swift */,\n\t\t\t\t1BD4C66E1FE67EFD00CFBF5C /* HCSquareCell.xib */,\n\t\t\t\t1B0C3F1E1FE55F52006BD58F /* HCRecommendCell.swift */,\n\t\t\t\t1B0C3F1F1FE55F52006BD58F /* HCRecommendCell.xib */,\n\t\t\t\t1B841BF01FE6C5CF00B07CBF /* HCRecommendSingleCell.swift */,\n\t\t\t\t1B841BF11FE6C5CF00B07CBF /* HCRecommendSingleCell.xib */,\n\t\t\t);\n\t\t\tpath = Cell;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1B8C54621FFC889700987481 /* Service */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B8C54631FFC88A900987481 /* HCAccountLoginService.swift */,\n\t\t\t);\n\t\t\tpath = Service;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1BD3B7501FF7490A0002800C /* ViewModel */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B8C54601FFC870900987481 /* HCAccountLoginViewModel.swift */,\n\t\t\t);\n\t\t\tpath = ViewModel;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1BD4C66C1FE669A000CFBF5C /* HCNibloadable */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1BD4C66A1FE668E500CFBF5C /* HCNibloadable.swift */,\n\t\t\t);\n\t\t\tpath = HCNibloadable;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1BD653682003184300B4BD26 /* HCCellStyleable */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1BD653692003185500B4BD26 /* HCCellStyleable.swift */,\n\t\t\t);\n\t\t\tpath = HCCellStyleable;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1BD65374200365DB00B4BD26 /* ViewModel */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tpath = ViewModel;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1BE1131E1FF2386C0018B541 /* Login */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B8C54621FFC889700987481 /* Service */,\n\t\t\t\t1BE4E7621FF38F44008705CD /* Controller */,\n\t\t\t\t1BD3B7501FF7490A0002800C /* ViewModel */,\n\t\t\t\t1BE1131F1FF2386C0018B541 /* Model */,\n\t\t\t\t1BE113201FF2386C0018B541 /* View */,\n\t\t\t\t1BE113211FF238BC0018B541 /* HCLoginViewController.swift */,\n\t\t\t);\n\t\t\tpath = Login;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1BE1131F1FF2386C0018B541 /* Model */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B8C545D1FFC81E100987481 /* HCAccountLoginResult.swift */,\n\t\t\t);\n\t\t\tpath = Model;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1BE113201FF2386C0018B541 /* View */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1BE4E7631FF38F7C008705CD /* HCAccountLoginable.swift */,\n\t\t\t\t1B8A18F91FF5EB360046EF52 /* HCOtherLoginModeView.swift */,\n\t\t\t\t1B8A18FB1FF5EB450046EF52 /* HCOtherLoginModeView.xib */,\n\t\t\t);\n\t\t\tpath = View;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1BE4E7621FF38F44008705CD /* Controller */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1BE4E7551FF3865E008705CD /* HCAccountLoginViewController.swift */,\n\t\t\t\t1BE4E7571FF38684008705CD /* HCThridLoginViewController.swift */,\n\t\t\t);\n\t\t\tpath = Controller;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1BE53B671FFE18DF00D7042B /* Service */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tpath = Service;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1BEE8C78200B2E0D00AB6E36 /* HCRefreshGifHeader */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B2A47171FE91D5F0090B1CA /* HCRefreshGifHeader.swift */,\n\t\t\t);\n\t\t\tpath = HCRefreshGifHeader;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1BEE8C79200B314600AB6E36 /* ViewModel */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1BEE8C7A200B314600AB6E36 /* HCBoutiqueViewModel.swift */,\n\t\t\t);\n\t\t\tpath = ViewModel;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1BF1B4DE2026E7B6003A6365 /* Cell */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1BDD66F62024112900509EAA /* HCPlayAlbumCell.swift */,\n\t\t\t\t1BDD66F72024112900509EAA /* HCPlayAlbumCell.xib */,\n\t\t\t\t1BF1B4DF2026EED6003A6365 /* HCPlaySynopsisCell.swift */,\n\t\t\t\t1BF1B4E02026EED6003A6365 /* HCPlaySynopsisCell.xib */,\n\t\t\t\t1B523656202951A800EFF8B2 /* HCPlayRecommendHeaderCell.swift */,\n\t\t\t\t1B523657202951A800EFF8B2 /* HCPlayRecommendHeaderCell.xib */,\n\t\t\t\t1B52365A2029550500EFF8B2 /* HCPlayRecommendCell.swift */,\n\t\t\t\t1B52365B2029550500EFF8B2 /* HCPlayRecommendCell.xib */,\n\t\t\t\t1B523660202989F700EFF8B2 /* HCPlayRecommendFooterCell.swift */,\n\t\t\t\t1B523661202989F700EFF8B2 /* HCPlayRecommendFooterCell.xib */,\n\t\t\t\t1B52366420298C3E00EFF8B2 /* HCPlayUserInfoCell.swift */,\n\t\t\t\t1B52366520298C3E00EFF8B2 /* HCPlayUserInfoCell.xib */,\n\t\t\t);\n\t\t\tpath = Cell;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t1BF3DAE2200BC5F700B5958E /* View */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1B81C0D6200D9C58007E52C3 /* Cell */,\n\t\t\t\t1BF3DAE3200BC62500B5958E /* HCBoutiqueIndexHeaderView.swift */,\n\t\t\t\t1BF3DAE5200BC6BD00B5958E /* HCBoutiqueIndexHeaderView.xib */,\n\t\t\t\t1B6C1F5B200F23D0003C1F87 /* HCBoutiqueSingleHeaderView.swift */,\n\t\t\t\t1B6C1F5D200F23E0003C1F87 /* HCBoutiqueSingleHeaderView.xib */,\n\t\t\t\t1B988A59200C419500835E82 /* HCBoutiqueFooterView.swift */,\n\t\t\t\t1B988A5B200C41A400835E82 /* HCBoutiqueFooterView.xib */,\n\t\t\t);\n\t\t\tpath = View;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB27CCBCC61291E0C263DCE36 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tCEE2E262A5D6978D0DB21709 /* Pods_RxXMLY.framework */,\n\t\t\t\tA3BF366E11AA172CAA4B35D6 /* Pods_RxXMLYTests.framework */,\n\t\t\t\tF13256F6BD8BC92C376E457D /* Pods_RxXMLYUITests.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tEB5627AF7526B233780832A7 /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5E1F373F4FDFF1ED18A88E2B /* Pods-RxXMLY.debug.xcconfig */,\n\t\t\t\t48D511ECCED911C27E2B5425 /* Pods-RxXMLY.release.xcconfig */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t1B5C3DDA1FE24B2300587750 /* RxXMLY */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 1B5C3E031FE24B2400587750 /* Build configuration list for PBXNativeTarget \"RxXMLY\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t76B9C4FCE890F674E62F9763 /* [CP] Check Pods Manifest.lock */,\n\t\t\t\t1B5C3DD71FE24B2300587750 /* Sources */,\n\t\t\t\t1B5C3DD81FE24B2300587750 /* Frameworks */,\n\t\t\t\t1B5C3DD91FE24B2300587750 /* Resources */,\n\t\t\t\t69A32CBDB0EC7AF93D5C7733 /* [CP] Embed Pods Frameworks */,\n\t\t\t\tD5EB060B7816D7675569B930 /* [CP] Copy Pods 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 = RxXMLY;\n\t\t\tproductName = RxXMLY;\n\t\t\tproductReference = 1B5C3DDB1FE24B2300587750 /* RxXMLY.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t1B5C3DEE1FE24B2400587750 /* RxXMLYTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 1B5C3E061FE24B2400587750 /* Build configuration list for PBXNativeTarget \"RxXMLYTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t1B5C3DEB1FE24B2400587750 /* Sources */,\n\t\t\t\t1B5C3DEC1FE24B2400587750 /* Frameworks */,\n\t\t\t\t1B5C3DED1FE24B2400587750 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t1B5C3DF11FE24B2400587750 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = RxXMLYTests;\n\t\t\tproductName = RxXMLYTests;\n\t\t\tproductReference = 1B5C3DEF1FE24B2400587750 /* RxXMLYTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\t1B5C3DF91FE24B2400587750 /* RxXMLYUITests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 1B5C3E091FE24B2400587750 /* Build configuration list for PBXNativeTarget \"RxXMLYUITests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t1B5C3DF61FE24B2400587750 /* Sources */,\n\t\t\t\t1B5C3DF71FE24B2400587750 /* Frameworks */,\n\t\t\t\t1B5C3DF81FE24B2400587750 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t1B5C3DFC1FE24B2400587750 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = RxXMLYUITests;\n\t\t\tproductName = RxXMLYUITests;\n\t\t\tproductReference = 1B5C3DFA1FE24B2400587750 /* RxXMLYUITests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.ui-testing\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t1B5C3DD31FE24B2300587750 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0900;\n\t\t\t\tLastUpgradeCheck = 0900;\n\t\t\t\tORGANIZATIONNAME = sessionCh;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t1B5C3DDA1FE24B2300587750 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 9.0;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t\t1B5C3DEE1FE24B2400587750 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 9.0;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t\tTestTargetID = 1B5C3DDA1FE24B2300587750;\n\t\t\t\t\t};\n\t\t\t\t\t1B5C3DF91FE24B2400587750 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 9.0;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t\tTestTargetID = 1B5C3DDA1FE24B2300587750;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 1B5C3DD61FE24B2300587750 /* Build configuration list for PBXProject \"RxXMLY\" */;\n\t\t\tcompatibilityVersion = \"Xcode 8.0\";\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 = 1B5C3DD21FE24B2300587750;\n\t\t\tproductRefGroup = 1B5C3DDC1FE24B2300587750 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t1B5C3DDA1FE24B2300587750 /* RxXMLY */,\n\t\t\t\t1B5C3DEE1FE24B2400587750 /* RxXMLYTests */,\n\t\t\t\t1B5C3DF91FE24B2400587750 /* RxXMLYUITests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t1B5C3DD91FE24B2300587750 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1B58CA71202803F200E1BDAB /* HCPlayTitleView.xib in Resources */,\n\t\t\t\t1BF1B4E42026F823003A6365 /* play_synopsis.html in Resources */,\n\t\t\t\t1B4474B91FE263F200A31004 /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t1BD4C6691FE6610B00CFBF5C /* HCRecommendFooterView.xib in Resources */,\n\t\t\t\t1B0C3F211FE55F52006BD58F /* HCRecommendCell.xib in Resources */,\n\t\t\t\t1BDD66F92024112900509EAA /* HCPlayAlbumCell.xib in Resources */,\n\t\t\t\t1B5C3DE61FE24B2300587750 /* Assets.xcassets in Resources */,\n\t\t\t\t1B5C3DE41FE24B2300587750 /* Main.storyboard in Resources */,\n\t\t\t\t1BD4C6701FE67EFD00CFBF5C /* HCSquareCell.xib in Resources */,\n\t\t\t\t1BC9B7CC2018C89300569749 /* HCPlayProgressView.xib in Resources */,\n\t\t\t\t1BF1B4E22026EED6003A6365 /* HCPlaySynopsisCell.xib in Resources */,\n\t\t\t\t1B52365D2029550500EFF8B2 /* HCPlayRecommendCell.xib in Resources */,\n\t\t\t\t1B8A18FC1FF5EB450046EF52 /* HCOtherLoginModeView.xib in Resources */,\n\t\t\t\t1B523659202951A800EFF8B2 /* HCPlayRecommendHeaderCell.xib in Resources */,\n\t\t\t\t1BA035D31FE642C200E9892E /* HCRecommendHeaderView.xib in Resources */,\n\t\t\t\t1B523663202989F700EFF8B2 /* HCPlayRecommendFooterCell.xib in Resources */,\n\t\t\t\t1B988A5C200C41A400835E82 /* HCBoutiqueFooterView.xib in Resources */,\n\t\t\t\t1B3B17A22018355C00386F84 /* HCPlayHeaderView.xib in Resources */,\n\t\t\t\t1B0C3F1D1FE55A39006BD58F /* HCScrollBarCell.xib in Resources */,\n\t\t\t\t1BF3DAE6200BC6BD00B5958E /* HCBoutiqueIndexHeaderView.xib in Resources */,\n\t\t\t\t1B81C0DA200D9C89007E52C3 /* HCBoutiqueIndexCell.xib in Resources */,\n\t\t\t\t1B085D3A2003A1660091694D /* HCMineHeaderView.xib in Resources */,\n\t\t\t\t1B0C3F161FE5551F006BD58F /* HCRecommendTopHeaderView.xib in Resources */,\n\t\t\t\t1B6C1F5E200F23E0003C1F87 /* HCBoutiqueSingleHeaderView.xib in Resources */,\n\t\t\t\t1B841BF31FE6C5CF00B07CBF /* HCRecommendSingleCell.xib in Resources */,\n\t\t\t\t1B52366720298C3E00EFF8B2 /* HCPlayUserInfoCell.xib in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t1B5C3DED1FE24B2400587750 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t1B5C3DF81FE24B2400587750 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t69A32CBDB0EC7AF93D5C7733 /* [CP] Embed Pods Frameworks */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${SRCROOT}/Pods/Target Support Files/Pods-RxXMLY/Pods-RxXMLY-frameworks.sh\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/Differentiator/Differentiator.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/Kingfisher/Kingfisher.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/MJRefresh/MJRefresh.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/Moya/Moya.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/NSObject+Rx/NSObject_Rx.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/ObjectMapper/ObjectMapper.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/ReactorKit/ReactorKit.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/Result/Result.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/ReusableKit/ReusableKit.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/RxAlamofire/RxAlamofire.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/RxCocoa/RxCocoa.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/RxDataSources/RxDataSources.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/RxGesture/RxGesture.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/RxSwift/RxSwift.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/SwiftyColor/SwiftyColor.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/SwiftyJSON/SwiftyJSON.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/TTRangeSlider/TTRangeSlider.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/TYCyclePagerView/TYCyclePagerView.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/TYPagerController/TYPagerController.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/Then/Then.framework\",\n\t\t\t\t\"${BUILT_PRODUCTS_DIR}/URLNavigator/URLNavigator.framework\",\n\t\t\t);\n\t\t\tname = \"[CP] Embed Pods Frameworks\";\n\t\t\toutputPaths = (\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Differentiator.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardManagerSwift.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Kingfisher.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MJRefresh.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Moya.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/NSObject_Rx.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ObjectMapper.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ReactorKit.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Result.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ReusableKit.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxAlamofire.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxCocoa.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxDataSources.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxGesture.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxSwift.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftyColor.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftyJSON.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/TTRangeSlider.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/TYCyclePagerView.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/TYPagerController.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Then.framework\",\n\t\t\t\t\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/URLNavigator.framework\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${SRCROOT}/Pods/Target Support Files/Pods-RxXMLY/Pods-RxXMLY-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t76B9C4FCE890F674E62F9763 /* [CP] Check Pods Manifest.lock */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\",\n\t\t\t\t\"${PODS_ROOT}/Manifest.lock\",\n\t\t\t);\n\t\t\tname = \"[CP] Check Pods Manifest.lock\";\n\t\t\toutputPaths = (\n\t\t\t\t\"$(DERIVED_FILE_DIR)/Pods-RxXMLY-checkManifestLockResult.txt\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [ $? != 0 ] ; then\\n    # print error to STDERR\\n    echo \\\"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\\" >&2\\n    exit 1\\nfi\\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\\necho \\\"SUCCESS\\\" > \\\"${SCRIPT_OUTPUT_FILE_0}\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\tD5EB060B7816D7675569B930 /* [CP] Copy Pods Resources */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = \"[CP] Copy Pods Resources\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${SRCROOT}/Pods/Target Support Files/Pods-RxXMLY/Pods-RxXMLY-resources.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t1B5C3DD71FE24B2300587750 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1BD4C66B1FE668E500CFBF5C /* HCNibloadable.swift in Sources */,\n\t\t\t\t1B523658202951A800EFF8B2 /* HCPlayRecommendHeaderCell.swift in Sources */,\n\t\t\t\t1B0C3F091FE5320A006BD58F /* HCCategoryModel.swift in Sources */,\n\t\t\t\t1B2A47181FE91D5F0090B1CA /* HCRefreshGifHeader.swift in Sources */,\n\t\t\t\t1B0C3EFA1FE52474006BD58F /* HCFocusModel.swift in Sources */,\n\t\t\t\t1B2C670A1FE27B4C003172BE /* HCHomeViewController.swift in Sources */,\n\t\t\t\t1B52365F2029761700EFF8B2 /* HCAssociationAlbumsInfoModel.swift in Sources */,\n\t\t\t\t1B0C3F121FE54060006BD58F /* RxAlamofire+ObjectMapper.swift in Sources */,\n\t\t\t\t1B8A18FA1FF5EB360046EF52 /* HCOtherLoginModeView.swift in Sources */,\n\t\t\t\t1BF1B4E12026EED6003A6365 /* HCPlaySynopsisCell.swift in Sources */,\n\t\t\t\t1B6C1F5C200F23D0003C1F87 /* HCBoutiqueSingleHeaderView.swift in Sources */,\n\t\t\t\t1BEB29491FE2C7F8001F7C1B /* HCNavSearchable.swift in Sources */,\n\t\t\t\t1B95152B20274E3F002B834C /* HCAlbumInfoModel.swift in Sources */,\n\t\t\t\t1B0C3F0B1FE53227006BD58F /* HCKeywardsModel.swift in Sources */,\n\t\t\t\t1B0C3F1C1FE55A39006BD58F /* HCScrollBarCell.swift in Sources */,\n\t\t\t\t1B523662202989F700EFF8B2 /* HCPlayRecommendFooterCell.swift in Sources */,\n\t\t\t\t1BD6536A2003185500B4BD26 /* HCCellStyleable.swift in Sources */,\n\t\t\t\t1B95152D20274E71002B834C /* HCPlayModel.swift in Sources */,\n\t\t\t\t1B2C66FB1FE26EAB003172BE /* Common.swift in Sources */,\n\t\t\t\t1B0C3EEB1FE51EEA006BD58F /* JsonTemplate.txt in Sources */,\n\t\t\t\t1BEB29471FE2C49C001F7C1B /* HCNavDownloadable.swift in Sources */,\n\t\t\t\t1B52365C2029550500EFF8B2 /* HCPlayRecommendCell.swift in Sources */,\n\t\t\t\t1B0C3F181FE558D4006BD58F /* HCScrollBarView.swift in Sources */,\n\t\t\t\t1B3CE4512024228000D7ABC0 /* HCPlayCellModel.swift in Sources */,\n\t\t\t\t1B4D79AF200B1F1B00023853 /* HCBoutiqueModel.swift in Sources */,\n\t\t\t\t1B951533202752A5002B834C /* HCPlayUserInfoModel.swift in Sources */,\n\t\t\t\t1B6C1F60200F3539003C1F87 /* HCBoutiqueSingleIndexFlowLayout.swift in Sources */,\n\t\t\t\t1BD653732003400500B4BD26 /* HCSettingCell.swift in Sources */,\n\t\t\t\t1BEA0DB620049D9300A6A03F /* UINavigationBar+ChangeColor.swift in Sources */,\n\t\t\t\t1B2C67101FE27B7A003172BE /* HCFindViewController.swift in Sources */,\n\t\t\t\t1B8C545E1FFC81E100987481 /* HCAccountLoginResult.swift in Sources */,\n\t\t\t\t1B951531202750C4002B834C /* HCTrackInfoModel.swift in Sources */,\n\t\t\t\t1B2C67011FE27107003172BE /* RequestUrl.swift in Sources */,\n\t\t\t\t1B4D79B2200B2A4D00023853 /* HCBoutiqueViewController.swift in Sources */,\n\t\t\t\t1B0C3EFC1FE52543006BD58F /* HCSquareModel.swift in Sources */,\n\t\t\t\t1B58CA6F2028039200E1BDAB /* HCPlayTitleView.swift in Sources */,\n\t\t\t\t1B79F2951FE3BE9300FF3EC3 /* HCSearchController.swift in Sources */,\n\t\t\t\t1B8C54611FFC870900987481 /* HCAccountLoginViewModel.swift in Sources */,\n\t\t\t\t1B78FA571FE37B6400ACE9B1 /* HCHomeSearchBarable.swift in Sources */,\n\t\t\t\t1BF3DAE4200BC62500B5958E /* HCBoutiqueIndexHeaderView.swift in Sources */,\n\t\t\t\t1B0C3F241FE57DD7006BD58F /* HCRecommendFlowLayout.swift in Sources */,\n\t\t\t\t1B78FA551FE3763300ACE9B1 /* HCSearchResultController.swift in Sources */,\n\t\t\t\t1B2C670E1FE27B71003172BE /* HCHearViewController.swift in Sources */,\n\t\t\t\t1B0C3F141FE55505006BD58F /* HCRecommendTopHeaderView.swift in Sources */,\n\t\t\t\t1B0C3EED1FE5204C006BD58F /* HCRecommendViewController.swift in Sources */,\n\t\t\t\t1BA035CF1FE6348600E9892E /* HCRecommendModel.swift in Sources */,\n\t\t\t\t1B15CD24200614C900A9EBFC /* HCURLNavigatorManager.swift in Sources */,\n\t\t\t\t1B2C67121FE2B9EC003172BE /* UIImage+Color.swift in Sources */,\n\t\t\t\t1B0E018E20178AC0004E5E5C /* HCPlayViewController.swift in Sources */,\n\t\t\t\t1B1F9EAF1FE4F4C80025D675 /* HCNavTitleable.swift in Sources */,\n\t\t\t\t1B3B17A02018354E00386F84 /* HCPlayHeaderView.swift in Sources */,\n\t\t\t\t1B6641D41FE4723900DCFFE6 /* HCMineAnchorsable.swift in Sources */,\n\t\t\t\t1B0C3F201FE55F52006BD58F /* HCRecommendCell.swift in Sources */,\n\t\t\t\t1B085D382003A1410091694D /* HCMineHeaderView.swift in Sources */,\n\t\t\t\t1BF3DAE1200BC2D000B5958E /* HCBoutiqueIndexModel.swift in Sources */,\n\t\t\t\t1B988A5A200C419500835E82 /* HCBoutiqueFooterView.swift in Sources */,\n\t\t\t\t1B8C54641FFC88A900987481 /* HCAccountLoginService.swift in Sources */,\n\t\t\t\t1BF0881D2018C223007BA5BA /* HCPlayProgressView.swift in Sources */,\n\t\t\t\t1B841BF21FE6C5CF00B07CBF /* HCRecommendSingleCell.swift in Sources */,\n\t\t\t\t1B2C67081FE27910003172BE /* HCNavBackable.swift in Sources */,\n\t\t\t\t1B79F2931FE3BD7400FF3EC3 /* HCSearchControllerable.swift in Sources */,\n\t\t\t\t1BEE5BAF20039DBC001B42D2 /* HCMineNavigationBar.swift in Sources */,\n\t\t\t\t1BE4E7641FF38F7C008705CD /* HCAccountLoginable.swift in Sources */,\n\t\t\t\t1B95152F20275043002B834C /* HCNoCacheInfoModel.swift in Sources */,\n\t\t\t\t1BEB29451FE2C2E0001F7C1B /* HCNavHistoryable.swift in Sources */,\n\t\t\t\t1B3341F31FF255DB008EAF43 /* String+GetSize.swift in Sources */,\n\t\t\t\t1BE113221FF238BC0018B541 /* HCLoginViewController.swift in Sources */,\n\t\t\t\t1B3CE44E2024217900D7ABC0 /* HCPlayViewModel.swift in Sources */,\n\t\t\t\t1BEE5BB120039DD5001B42D2 /* HCSearchNavigationBar.swift in Sources */,\n\t\t\t\t1B52366620298C3E00EFF8B2 /* HCPlayUserInfoCell.swift in Sources */,\n\t\t\t\t1B15CD1A2005B13F00A9EBFC /* HCSettingCellModel.swift in Sources */,\n\t\t\t\t1B653DF21FF6493400F2425D /* HCInputValidator.swift in Sources */,\n\t\t\t\t1B3525EC1FE6BCF000EC9270 /* HCActivityModel.swift in Sources */,\n\t\t\t\t1BD4C6671FE660F700CFBF5C /* HCRecommendFooterView.swift in Sources */,\n\t\t\t\t1BD4C6761FE694E800CFBF5C /* HCSquareFlowLayout.swift in Sources */,\n\t\t\t\t1B81C0D9200D9C89007E52C3 /* HCBoutiqueIndexCell.swift in Sources */,\n\t\t\t\t1B08C00620172DD90037300A /* HCTabbarPlayView.swift in Sources */,\n\t\t\t\t1B2C67061FE2788B003172BE /* HCBaseNavigationController.swift in Sources */,\n\t\t\t\t1B0C3F0D1FE53577006BD58F /* HCRecommendItemModel.swift in Sources */,\n\t\t\t\t1B2C66F91FE26CF8003172BE /* HCMainViewController.swift in Sources */,\n\t\t\t\t1B2C66FF1FE270AB003172BE /* UIView+Frame.swift in Sources */,\n\t\t\t\t1B81C0DD200DA2D4007E52C3 /* HCBoutiqueIndexFlowLayout.swift in Sources */,\n\t\t\t\t1BD029071FE2F71800461204 /* HCNavUniversalable.swift in Sources */,\n\t\t\t\t1B2C67171FE2BF5F003172BE /* HCBaseViewController.swift in Sources */,\n\t\t\t\t1BA3F8261FE3A8BE00A06CEB /* UIView+Corner.swift in Sources */,\n\t\t\t\t1B0C3EF01FE52137006BD58F /* HCRefreshable.swift in Sources */,\n\t\t\t\t1B5C3DE11FE24B2300587750 /* ViewController.swift in Sources */,\n\t\t\t\t1BEB294B1FE2CA6D001F7C1B /* HCNavSettingable.swift in Sources */,\n\t\t\t\t1BDD66F82024112900509EAA /* HCPlayAlbumCell.swift in Sources */,\n\t\t\t\t1B779DBD2019AC4500EA5916 /* HCTimeTools.swift in Sources */,\n\t\t\t\t1B15CD1F2005C07300A9EBFC /* HCSettingViewController.swift in Sources */,\n\t\t\t\t1B78C9D91FE7B61F00876F89 /* HCRecommendCellTypeModel.swift in Sources */,\n\t\t\t\t1B359F23200375DE00ADFE9A /* HCMineFactory.swift in Sources */,\n\t\t\t\t1B2C66FD1FE26F57003172BE /* UIColor+HexColor.swift in Sources */,\n\t\t\t\t1B2C67141FE2BCE0003172BE /* HCNavMessageable.swift in Sources */,\n\t\t\t\t1B5C3DDF1FE24B2300587750 /* AppDelegate.swift in Sources */,\n\t\t\t\t1BA035D11FE642B700E9892E /* HCRecommendHeaderView.swift in Sources */,\n\t\t\t\t1BE4E7561FF3865E008705CD /* HCAccountLoginViewController.swift in Sources */,\n\t\t\t\t1BEE5BB320039DDD001B42D2 /* HCHomeNavigationBar.swift in Sources */,\n\t\t\t\t1B0C3F031FE52F23006BD58F /* HCRecommendViewModel.swift in Sources */,\n\t\t\t\t1BD4C66F1FE67EFD00CFBF5C /* HCSquareCell.swift in Sources */,\n\t\t\t\t1B0C3F101FE53A74006BD58F /* HCViewModelType.swift in Sources */,\n\t\t\t\t1B2C670C1FE27B64003172BE /* HCMineViewController.swift in Sources */,\n\t\t\t\t1BD65376200365E800B4BD26 /* HCSettingViewModel.swift in Sources */,\n\t\t\t\t1BEE8C7B200B314700AB6E36 /* HCBoutiqueViewModel.swift in Sources */,\n\t\t\t\t1BE4E7581FF38684008705CD /* HCThridLoginViewController.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t1B5C3DEB1FE24B2400587750 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1B5C3DF41FE24B2400587750 /* RxXMLYTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t1B5C3DF61FE24B2400587750 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1B5C3DFF1FE24B2400587750 /* RxXMLYUITests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t1B5C3DF11FE24B2400587750 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 1B5C3DDA1FE24B2300587750 /* RxXMLY */;\n\t\t\ttargetProxy = 1B5C3DF01FE24B2400587750 /* PBXContainerItemProxy */;\n\t\t};\n\t\t1B5C3DFC1FE24B2400587750 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 1B5C3DDA1FE24B2300587750 /* RxXMLY */;\n\t\t\ttargetProxy = 1B5C3DFB1FE24B2400587750 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t1B5C3DE21FE24B2300587750 /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t1B5C3DE31FE24B2300587750 /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t1B5C3E011FE24B2400587750 /* 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_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_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_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 = 9.1;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_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\t1B5C3E021FE24B2400587750 /* 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_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_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_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 = 9.1;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t1B5C3E041FE24B2400587750 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 5E1F373F4FDFF1ED18A88E2B /* Pods-RxXMLY.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = GCGNEGB7A8;\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/RxXMLY/Info.plist\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.1;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"Alamofire\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"Differentiator\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"IQKeyboardManagerSwift\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"Kingfisher\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"MJRefresh\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"Moya\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"NSObject_Rx\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"ObjectMapper\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"ReactorKit\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"Result\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"ReusableKit\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"RxAlamofire\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"RxCocoa\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"RxDataSources\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"RxGesture\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"RxSwift\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"SnapKit\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"SwiftyColor\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"SwiftyJSON\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"TYCyclePagerView\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"TYPagerController\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"Then\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"URLNavigator\\\"\",\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.sunfo.RxXMLY;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 1;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1B5C3E051FE24B2400587750 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 48D511ECCED911C27E2B5425 /* Pods-RxXMLY.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = GCGNEGB7A8;\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/RxXMLY/Info.plist\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 9.1;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"Alamofire\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"Differentiator\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"IQKeyboardManagerSwift\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"Kingfisher\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"MJRefresh\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"Moya\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"NSObject_Rx\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"ObjectMapper\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"ReactorKit\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"Result\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"ReusableKit\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"RxAlamofire\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"RxCocoa\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"RxDataSources\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"RxGesture\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"RxSwift\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"SnapKit\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"SwiftyColor\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"SwiftyJSON\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"TYCyclePagerView\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"TYPagerController\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"Then\\\"\",\n\t\t\t\t\t\"-framework\",\n\t\t\t\t\t\"\\\"URLNavigator\\\"\",\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.sunfo.RxXMLY;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 1;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t1B5C3E071FE24B2400587750 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = GCGNEGB7A8;\n\t\t\t\tINFOPLIST_FILE = RxXMLYTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.sunfo.RxXMLYTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/RxXMLY.app/RxXMLY\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1B5C3E081FE24B2400587750 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = GCGNEGB7A8;\n\t\t\t\tINFOPLIST_FILE = RxXMLYTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.sunfo.RxXMLYTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/RxXMLY.app/RxXMLY\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t1B5C3E0A1FE24B2400587750 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = GCGNEGB7A8;\n\t\t\t\tINFOPLIST_FILE = RxXMLYUITests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.sunfo.RxXMLYUITests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tTEST_TARGET_NAME = RxXMLY;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1B5C3E0B1FE24B2400587750 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = GCGNEGB7A8;\n\t\t\t\tINFOPLIST_FILE = RxXMLYUITests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.sunfo.RxXMLYUITests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tTEST_TARGET_NAME = RxXMLY;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t1B5C3DD61FE24B2300587750 /* Build configuration list for PBXProject \"RxXMLY\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1B5C3E011FE24B2400587750 /* Debug */,\n\t\t\t\t1B5C3E021FE24B2400587750 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t1B5C3E031FE24B2400587750 /* Build configuration list for PBXNativeTarget \"RxXMLY\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1B5C3E041FE24B2400587750 /* Debug */,\n\t\t\t\t1B5C3E051FE24B2400587750 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t1B5C3E061FE24B2400587750 /* Build configuration list for PBXNativeTarget \"RxXMLYTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1B5C3E071FE24B2400587750 /* Debug */,\n\t\t\t\t1B5C3E081FE24B2400587750 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t1B5C3E091FE24B2400587750 /* Build configuration list for PBXNativeTarget \"RxXMLYUITests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1B5C3E0A1FE24B2400587750 /* Debug */,\n\t\t\t\t1B5C3E0B1FE24B2400587750 /* 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 = 1B5C3DD31FE24B2300587750 /* Project object */;\n}\n"
  },
  {
    "path": "RxXMLY.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:RxXMLY.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "RxXMLY.xcodeproj/xcuserdata/sessionCh.xcuserdatad/xcschemes/RxXMLY.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"1B5C3DDA1FE24B2300587750\"\n               BuildableName = \"RxXMLY.app\"\n               BlueprintName = \"RxXMLY\"\n               ReferencedContainer = \"container:RxXMLY.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"1B5C3DEE1FE24B2400587750\"\n               BuildableName = \"RxXMLYTests.xctest\"\n               BlueprintName = \"RxXMLYTests\"\n               ReferencedContainer = \"container:RxXMLY.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"1B5C3DF91FE24B2400587750\"\n               BuildableName = \"RxXMLYUITests.xctest\"\n               BlueprintName = \"RxXMLYUITests\"\n               ReferencedContainer = \"container:RxXMLY.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"1B5C3DDA1FE24B2300587750\"\n            BuildableName = \"RxXMLY.app\"\n            BlueprintName = \"RxXMLY\"\n            ReferencedContainer = \"container:RxXMLY.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"1B5C3DDA1FE24B2300587750\"\n            BuildableName = \"RxXMLY.app\"\n            BlueprintName = \"RxXMLY\"\n            ReferencedContainer = \"container:RxXMLY.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <EnvironmentVariables>\n         <EnvironmentVariable\n            key = \"OS_ACTIVITY_MODE\"\n            value = \"disable\"\n            isEnabled = \"YES\">\n         </EnvironmentVariable>\n      </EnvironmentVariables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"1B5C3DDA1FE24B2300587750\"\n            BuildableName = \"RxXMLY.app\"\n            BlueprintName = \"RxXMLY\"\n            ReferencedContainer = \"container:RxXMLY.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "RxXMLY.xcodeproj/xcuserdata/sessionCh.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>RxXMLY.xcscheme</key>\n\t\t<dict>\n\t\t\t<key>orderHint</key>\n\t\t\t<integer>3</integer>\n\t\t</dict>\n\t</dict>\n\t<key>SuppressBuildableAutocreation</key>\n\t<dict>\n\t\t<key>1B5C3DDA1FE24B2300587750</key>\n\t\t<dict>\n\t\t\t<key>primary</key>\n\t\t\t<true/>\n\t\t</dict>\n\t\t<key>1B5C3DEE1FE24B2400587750</key>\n\t\t<dict>\n\t\t\t<key>primary</key>\n\t\t\t<true/>\n\t\t</dict>\n\t\t<key>1B5C3DF91FE24B2400587750</key>\n\t\t<dict>\n\t\t\t<key>primary</key>\n\t\t\t<true/>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "RxXMLY.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:RxXMLY.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:Pods/Pods.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "RxXMLY.xcworkspace/xcuserdata/sessionCh.xcuserdatad/IDEFindNavigatorScopes.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<array/>\n</plist>\n"
  },
  {
    "path": "RxXMLY.xcworkspace/xcuserdata/sessionCh.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Bucket\n   type = \"0\"\n   version = \"2.0\">\n   <Breakpoints>\n      <BreakpointProxy\n         BreakpointExtensionID = \"Xcode.Breakpoint.ExceptionBreakpoint\">\n         <BreakpointContent\n            shouldBeEnabled = \"Yes\"\n            ignoreCount = \"0\"\n            continueAfterRunningActions = \"No\"\n            scope = \"0\"\n            stopOnStyle = \"0\">\n         </BreakpointContent>\n      </BreakpointProxy>\n   </Breakpoints>\n</Bucket>\n"
  },
  {
    "path": "RxXMLYTests/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>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "RxXMLYTests/RxXMLYTests.swift",
    "content": "//\n//  RxXMLYTests.swift\n//  RxXMLYTests\n//\n//  Created by sessionCh on 2017/12/14.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport XCTest\n@testable import RxXMLY\n\nclass RxXMLYTests: XCTestCase {\n    \n    override func setUp() {\n        super.setUp()\n        // Put setup code here. This method is called before the invocation of each test method in the class.\n    }\n    \n    override func tearDown() {\n        // Put teardown code here. This method is called after the invocation of each test method in the class.\n        super.tearDown()\n    }\n    \n    func testExample() {\n        // This is an example of a functional test case.\n        // Use XCTAssert and related functions to verify your tests produce the correct results.\n    }\n    \n    func testPerformanceExample() {\n        // This is an example of a performance test case.\n        self.measure {\n            // Put the code you want to measure the time of here.\n        }\n    }\n    \n}\n"
  },
  {
    "path": "RxXMLYUITests/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>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "RxXMLYUITests/RxXMLYUITests.swift",
    "content": "//\n//  RxXMLYUITests.swift\n//  RxXMLYUITests\n//\n//  Created by sessionCh on 2017/12/14.\n//  Copyright © 2017年 sessionCh. All rights reserved.\n//\n\nimport XCTest\n\nclass RxXMLYUITests: XCTestCase {\n        \n    override func setUp() {\n        super.setUp()\n        \n        // Put setup code here. This method is called before the invocation of each test method in the class.\n        \n        // In UI tests it is usually best to stop immediately when a failure occurs.\n        continueAfterFailure = false\n        // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.\n        XCUIApplication().launch()\n\n        // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.\n    }\n    \n    override func tearDown() {\n        // Put teardown code here. This method is called after the invocation of each test method in the class.\n        super.tearDown()\n    }\n    \n    func testExample() {\n        // Use recording to get started writing UI tests.\n        // Use XCTAssert and related functions to verify your tests produce the correct results.\n    }\n    \n}\n"
  }
]